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