diff options
-rw-r--r-- | hmp-commands.hx | 3 | ||||
-rw-r--r-- | include/ui/qemu-pixman.h | 2 | ||||
-rw-r--r-- | include/ui/qemu-spice.h | 7 | ||||
-rw-r--r-- | include/ui/spice-display.h | 3 | ||||
-rw-r--r-- | monitor.c | 5 | ||||
-rw-r--r-- | qmp-commands.hx | 3 | ||||
-rw-r--r-- | ui/spice-core.c | 26 | ||||
-rw-r--r-- | ui/spice-display.c | 23 |
8 files changed, 29 insertions, 43 deletions
diff --git a/hmp-commands.hx b/hmp-commands.hx index 3089533..a6de819 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -998,8 +998,7 @@ ETEXI .params = "protocol hostname port tls-port cert-subject", .help = "send migration info to spice/vnc client", .user_print = monitor_user_noop, - .mhandler.cmd_async = client_migrate_info, - .flags = MONITOR_CMD_ASYNC, + .mhandler.cmd_new = client_migrate_info, }, STEXI diff --git a/include/ui/qemu-pixman.h b/include/ui/qemu-pixman.h index 5d7a9ac..e34c4ef 100644 --- a/include/ui/qemu-pixman.h +++ b/include/ui/qemu-pixman.h @@ -35,6 +35,7 @@ # define PIXMAN_BE_r8g8b8a8 PIXMAN_r8g8b8a8 # define PIXMAN_BE_x8b8g8r8 PIXMAN_x8b8g8r8 # define PIXMAN_BE_a8b8g8r8 PIXMAN_a8b8g8r8 +# define PIXMAN_LE_x8r8g8b8 PIXMAN_b8g8r8x8 #else # define PIXMAN_BE_r8g8b8 PIXMAN_b8g8r8 # define PIXMAN_BE_x8r8g8b8 PIXMAN_b8g8r8x8 @@ -45,6 +46,7 @@ # define PIXMAN_BE_r8g8b8a8 PIXMAN_a8b8g8r8 # define PIXMAN_BE_x8b8g8r8 PIXMAN_r8g8b8x8 # define PIXMAN_BE_a8b8g8r8 PIXMAN_r8g8b8a8 +# define PIXMAN_LE_x8r8g8b8 PIXMAN_x8r8g8b8 #endif /* -------------------------------------------------------------------- */ diff --git a/include/ui/qemu-spice.h b/include/ui/qemu-spice.h index 25b94c7..42db3c1 100644 --- a/include/ui/qemu-spice.h +++ b/include/ui/qemu-spice.h @@ -42,8 +42,7 @@ int qemu_spice_set_passwd(const char *passwd, bool fail_if_connected, bool disconnect_if_connected); int qemu_spice_set_pw_expire(time_t expires); int qemu_spice_migrate_info(const char *hostname, int port, int tls_port, - const char *subject, - MonitorCompletion cb, void *opaque); + const char *subject); CharDriverState *qemu_chr_open_spice_vmc(const char *type); #if SPICE_SERVER_VERSION >= 0x000c02 @@ -70,10 +69,8 @@ static inline int qemu_spice_set_pw_expire(time_t expires) return -1; } static inline int qemu_spice_migrate_info(const char *h, int p, int t, - const char *s, - MonitorCompletion cb, void *opaque) + const char *s) { - cb(opaque, NULL); return -1; } diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h index 53883a1..b25328a 100644 --- a/include/ui/spice-display.h +++ b/include/ui/spice-display.h @@ -97,7 +97,8 @@ struct SimpleSpiceDisplay { /* cursor (without qxl): displaychangelistener -> spice server */ SimpleSpiceCursor *ptr_define; SimpleSpiceCursor *ptr_move; - uint16_t ptr_x, ptr_y; + int16_t ptr_x, ptr_y; + int16_t hot_x, hot_y; /* cursor (with qxl): qxl local renderer -> displaychangelistener */ QEMUCursor *cursor; @@ -1086,7 +1086,7 @@ static void hmp_info_trace_events(Monitor *mon, const QDict *qdict) } static int client_migrate_info(Monitor *mon, const QDict *qdict, - MonitorCompletion cb, void *opaque) + QObject **ret_data) { const char *protocol = qdict_get_str(qdict, "protocol"); const char *hostname = qdict_get_str(qdict, "hostname"); @@ -1108,8 +1108,7 @@ static int client_migrate_info(Monitor *mon, const QDict *qdict, return -1; } - ret = qemu_spice_migrate_info(hostname, port, tls_port, subject, - cb, opaque); + ret = qemu_spice_migrate_info(hostname, port, tls_port, subject); if (ret != 0) { qerror_report(QERR_UNDEFINED_ERROR); return -1; diff --git a/qmp-commands.hx b/qmp-commands.hx index 09f48ba..1e59541 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -785,8 +785,7 @@ EQMP .args_type = "protocol:s,hostname:s,port:i?,tls-port:i?,cert-subject:s?", .params = "protocol hostname port tls-port cert-subject", .help = "send migration info to spice/vnc client", - .mhandler.cmd_async = client_migrate_info, - .flags = MONITOR_CMD_ASYNC, + .mhandler.cmd_new = client_migrate_info, }, SQMP diff --git a/ui/spice-core.c b/ui/spice-core.c index c8f7f18..f00e074 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -273,14 +273,6 @@ static SpiceCoreInterface core_interface = { .channel_event = channel_event, }; -typedef struct SpiceMigration { - SpiceMigrateInstance sin; - struct { - MonitorCompletion *cb; - void *opaque; - } connect_complete; -} SpiceMigration; - static void migrate_connect_complete_cb(SpiceMigrateInstance *sin); static void migrate_end_complete_cb(SpiceMigrateInstance *sin); @@ -293,15 +285,11 @@ static const SpiceMigrateInterface migrate_interface = { .migrate_end_complete = migrate_end_complete_cb, }; -static SpiceMigration spice_migrate; +static SpiceMigrateInstance spice_migrate; static void migrate_connect_complete_cb(SpiceMigrateInstance *sin) { - SpiceMigration *sm = container_of(sin, SpiceMigration, sin); - if (sm->connect_complete.cb) { - sm->connect_complete.cb(sm->connect_complete.opaque, NULL); - } - sm->connect_complete.cb = NULL; + /* nothing, but libspice-server expects this cb being present. */ } static void migrate_end_complete_cb(SpiceMigrateInstance *sin) @@ -585,13 +573,10 @@ static void migration_state_notifier(Notifier *notifier, void *data) } int qemu_spice_migrate_info(const char *hostname, int port, int tls_port, - const char *subject, - MonitorCompletion *cb, void *opaque) + const char *subject) { int ret; - spice_migrate.connect_complete.cb = cb; - spice_migrate.connect_complete.opaque = opaque; ret = spice_server_migrate_connect(spice_server, hostname, port, tls_port, subject); spice_have_target_host = true; @@ -812,9 +797,8 @@ void qemu_spice_init(void) migration_state.notify = migration_state_notifier; add_migration_state_change_notifier(&migration_state); - spice_migrate.sin.base.sif = &migrate_interface.base; - spice_migrate.connect_complete.cb = NULL; - qemu_spice_add_interface(&spice_migrate.sin.base); + spice_migrate.base.sif = &migrate_interface.base; + qemu_spice_add_interface(&spice_migrate.base); qemu_spice_input_init(); qemu_spice_audio_init(); diff --git a/ui/spice-display.c b/ui/spice-display.c index 1644185..c71a059 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -178,7 +178,7 @@ static void qemu_spice_create_one_update(SimpleSpiceDisplay *ssd, image->bitmap.palette = 0; image->bitmap.format = SPICE_BITMAP_FMT_32BIT; - dest = pixman_image_create_bits(PIXMAN_x8r8g8b8, bw, bh, + dest = pixman_image_create_bits(PIXMAN_LE_x8r8g8b8, bw, bh, (void *)update->bitmap, bw * 4); pixman_image_composite(PIXMAN_OP_SRC, ssd->surface, NULL, ssd->mirror, rect->left, rect->top, 0, 0, @@ -260,7 +260,8 @@ static void qemu_spice_create_update(SimpleSpiceDisplay *ssd) static SimpleSpiceCursor* qemu_spice_create_cursor_update(SimpleSpiceDisplay *ssd, - QEMUCursor *c) + QEMUCursor *c, + int on) { size_t size = c ? c->width * c->height * 4 : 0; SimpleSpiceCursor *update; @@ -275,8 +276,8 @@ qemu_spice_create_cursor_update(SimpleSpiceDisplay *ssd, if (c) { ccmd->type = QXL_CURSOR_SET; - ccmd->u.set.position.x = ssd->ptr_x; - ccmd->u.set.position.y = ssd->ptr_y; + ccmd->u.set.position.x = ssd->ptr_x + ssd->hot_x; + ccmd->u.set.position.y = ssd->ptr_y + ssd->hot_y; ccmd->u.set.visible = true; ccmd->u.set.shape = (uintptr_t)cursor; cursor->header.unique = ssd->unique++; @@ -288,10 +289,12 @@ qemu_spice_create_cursor_update(SimpleSpiceDisplay *ssd, cursor->data_size = size; cursor->chunk.data_size = size; memcpy(cursor->chunk.data, c->data, size); + } else if (!on) { + ccmd->type = QXL_CURSOR_HIDE; } else { ccmd->type = QXL_CURSOR_MOVE; - ccmd->u.position.x = ssd->ptr_x; - ccmd->u.position.y = ssd->ptr_y; + ccmd->u.position.x = ssd->ptr_x + ssd->hot_x; + ccmd->u.position.y = ssd->ptr_y + ssd->hot_y; } ccmd->release_info.id = (uintptr_t)(&update->ext); @@ -734,11 +737,11 @@ static void display_mouse_set(DisplayChangeListener *dcl, qemu_mutex_lock(&ssd->lock); ssd->ptr_x = x; - ssd->ptr_y = x; + ssd->ptr_y = y; if (ssd->ptr_move) { g_free(ssd->ptr_move); } - ssd->ptr_move = qemu_spice_create_cursor_update(ssd, NULL); + ssd->ptr_move = qemu_spice_create_cursor_update(ssd, NULL, on); qemu_mutex_unlock(&ssd->lock); } @@ -748,6 +751,8 @@ static void display_mouse_define(DisplayChangeListener *dcl, SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); qemu_mutex_lock(&ssd->lock); + ssd->hot_x = c->hot_x; + ssd->hot_y = c->hot_y; if (ssd->ptr_move) { g_free(ssd->ptr_move); ssd->ptr_move = NULL; @@ -755,7 +760,7 @@ static void display_mouse_define(DisplayChangeListener *dcl, if (ssd->ptr_define) { g_free(ssd->ptr_define); } - ssd->ptr_define = qemu_spice_create_cursor_update(ssd, c); + ssd->ptr_define = qemu_spice_create_cursor_update(ssd, c, 0); qemu_mutex_unlock(&ssd->lock); } |