From: Yuri Benditovich <yuri.benditovich@xxxxxxxxxx> When spice server changes mouse mode (server/client) it informs QXL device via callback. QXL device keeps current mouse mode in ROM area and issues interrupt to guest driver. Guest driver can read current mode from ROM and optimize its behavior in case the mouse is in 'client' mode Signed-off-by: Yuri Benditovich <yuri.benditovich@xxxxxxxxxx> --- hw/display/qxl.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 0e2682d..78f04dc 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -369,6 +369,10 @@ static void init_qxl_rom(PCIQXLDevice *d) rom->num_pages = cpu_to_le32(num_pages); rom->ram_header_offset = cpu_to_le32(d->vga.vram_size - ram_header_size); +#if SPICE_MOUSE_MODE_CHANGE_SUPPORTED + rom->mouse_mode = SPICE_MOUSE_MODE_SERVER; +#endif + d->shadow_rom = *rom; d->rom = rom; d->modes = modes; @@ -982,6 +986,17 @@ static void interface_set_client_capabilities(QXLInstance *sin, qxl_send_events(qxl, QXL_INTERRUPT_CLIENT); } +#if SPICE_MOUSE_MODE_CHANGE_SUPPORTED +static void interface_mouse_mode_changed(QXLInstance *sin) +{ + PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); + qxl->rom->mouse_mode = qemu_spice_is_server_mouse() ? + SPICE_MOUSE_MODE_SERVER : SPICE_MOUSE_MODE_CLIENT; + qxl_rom_set_dirty(qxl); + qxl_send_events(qxl, QXL_INTERRUPT_MOUSE_MODE_CHANGE); +} +#endif + static uint32_t qxl_crc32(const uint8_t *p, unsigned len) { /* @@ -1088,6 +1103,9 @@ static const QXLInterface qxl_interface = { .update_area_complete = interface_update_area_complete, .set_client_capabilities = interface_set_client_capabilities, .client_monitors_config = interface_client_monitors_config, +#if SPICE_MOUSE_MODE_CHANGE_SUPPORTED + .mouse_mode_changed = interface_mouse_mode_changed, +#endif }; static const GraphicHwOps qxl_ops = { @@ -1996,6 +2014,10 @@ static void qxl_realize_common(PCIQXLDevice *qxl, Error **errp) pci_device_rev = QXL_REVISION_STABLE_V12; io_size = pow2ceil(QXL_IO_RANGE_SIZE); break; + case 5: /* qxl-5 */ + pci_device_rev = 5; /* TODO: change to QXL_REVISION_STABLE_Vx */ + io_size = pow2ceil(QXL_IO_RANGE_SIZE); + break; default: error_setg(errp, "Invalid revision %d for qxl device (max %d)", qxl->revision, QXL_DEFAULT_REVISION); -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel