spice: misc fixes.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJVPhd0AAoJEEy22O7T6HE4sMkQAK9TcUjMKvKf7k20WsFBDgkc RS/NHEHNrrscnWz+n845NDueFvYAa7DfAKok0ayzD5XSK2RC3AkcGsQ/PF21kg5t +9B0y7YIdJoAt+9w+SulwF6hcK9wWBx0NOUWJomoZWntZcawAv5pTOTvcLR2TJhN eGHuI1lw/Hnsqr0vYXqkFdNNB66zA24oZiaryxsy/TMpd6vlGX3JIvDaLcTden1W u0Fmta5JEDlPCiPIBVxau88U21pDeg6PHEHmWhkeLo45Tsr+R+dB72Ugbguihr1x LRpzQtZoq8gqyqY2+r1lOS5cHNvCkqZhtDK80Aeo2UPxlg88YPMFvonTuvY8Y8Jm 6Mq1gepyI48LdoKwoL8S2ja5W8++unS6kd1oP1fxqalWqFI8mwIB1v4W75a4ejxq drbVWY4jnJDkNiz8BKmg9GLE4mEConei0Ip/lbgflESbjJ9g0Y7IGoc91cjsCXCv 1MuAphNrkwLSckJpNxooKzO7MMhYFw9PGNX26RWE64iRnwMFCsqOxE1KC7rzdnZY Y09fVV+GC1h5XyH25M5cyMCV5r/S/eM1Y6GEhq/OS8xmunGp2WKB7rmaoLMlioMs SiPExlwTaqiZldBHfB71h2E41C7awcmcmY+NsORSxIEg6eTyT4/jljQQXGiwm0JA IcfrFHJHvmmWPL6CLwS0 =Vi97 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/spice/tags/pull-spice-20150427-1' into staging spice: misc fixes. # gpg: Signature made Mon Apr 27 12:03:16 2015 BST using RSA key ID D3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" * remotes/spice/tags/pull-spice-20150427-1: spice: learn to hide cursor spice: set pointer position on hotspot spice: fix mouse cursor position spice: fix simple display on bigendian hosts monitor: Make client_migrate_info synchronous Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						3d27b09cf6
					
				| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| 
 | ||||
| /* -------------------------------------------------------------------- */ | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell