Revision 07536094

b/hw/qxl-render.c
185 185
    QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
186 186
    QXLCursor *cursor;
187 187
    QEMUCursor *c;
188
    int x = -1, y = -1;
189 188

  
190 189
    if (!qxl->ssd.ds->mouse_set || !qxl->ssd.ds->cursor_define) {
191 190
        return;
......
198 197
    }
199 198
    switch (cmd->type) {
200 199
    case QXL_CURSOR_SET:
201
        x = cmd->u.set.position.x;
202
        y = cmd->u.set.position.y;
203 200
        cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id);
204 201
        if (cursor->chunk.data_size != cursor->data_size) {
205 202
            fprintf(stderr, "%s: multiple chunks\n", __FUNCTION__);
......
209 206
        if (c == NULL) {
210 207
            c = cursor_builtin_left_ptr();
211 208
        }
212
        qemu_mutex_lock_iothread();
213
        qxl->ssd.ds->cursor_define(c);
214
        qxl->ssd.ds->mouse_set(x, y, 1);
215
        qemu_mutex_unlock_iothread();
216
        cursor_put(c);
209
        qemu_mutex_lock(&qxl->ssd.lock);
210
        if (qxl->ssd.cursor) {
211
            cursor_put(qxl->ssd.cursor);
212
        }
213
        qxl->ssd.cursor = c;
214
        qxl->ssd.mouse_x = cmd->u.set.position.x;
215
        qxl->ssd.mouse_y = cmd->u.set.position.y;
216
        qemu_mutex_unlock(&qxl->ssd.lock);
217 217
        break;
218 218
    case QXL_CURSOR_MOVE:
219
        x = cmd->u.position.x;
220
        y = cmd->u.position.y;
221
        qemu_mutex_lock_iothread();
222
        qxl->ssd.ds->mouse_set(x, y, 1);
223
        qemu_mutex_unlock_iothread();
219
        qemu_mutex_lock(&qxl->ssd.lock);
220
        qxl->ssd.mouse_x = cmd->u.position.x;
221
        qxl->ssd.mouse_y = cmd->u.position.y;
222
        qemu_mutex_unlock(&qxl->ssd.lock);
224 223
        break;
225 224
    }
226 225
}
b/hw/qxl.c
1309 1309
                                   qxl_hw_screen_dump, qxl_hw_text_update, qxl);
1310 1310
    qxl->ssd.ds = vga->ds;
1311 1311
    qemu_mutex_init(&qxl->ssd.lock);
1312
    qxl->ssd.mouse_x = -1;
1313
    qxl->ssd.mouse_y = -1;
1312 1314
    qxl->ssd.bufsize = (16 * 1024 * 1024);
1313 1315
    qxl->ssd.buf = qemu_malloc(qxl->ssd.bufsize);
1314 1316

  
b/ui/spice-display.c
254 254
        ssd->update = qemu_spice_create_update(ssd);
255 255
        ssd->notify++;
256 256
    }
257
    if (ssd->cursor) {
258
        ssd->ds->cursor_define(ssd->cursor);
259
        cursor_put(ssd->cursor);
260
        ssd->cursor = NULL;
261
    }
262
    if (ssd->mouse_x != -1 && ssd->mouse_y != -1) {
263
        ssd->ds->mouse_set(ssd->mouse_x, ssd->mouse_y, 1);
264
        ssd->mouse_x = -1;
265
        ssd->mouse_y = -1;
266
    }
257 267
    qemu_mutex_unlock(&ssd->lock);
258 268

  
259 269
    if (ssd->notify) {
......
409 419
    assert(sdpy.ds == NULL);
410 420
    sdpy.ds = ds;
411 421
    qemu_mutex_init(&sdpy.lock);
422
    sdpy.mouse_x = -1;
423
    sdpy.mouse_y = -1;
412 424
    sdpy.bufsize = (16 * 1024 * 1024);
413 425
    sdpy.buf = qemu_malloc(sdpy.bufsize);
414 426
    register_displaychangelistener(ds, &display_listener);
b/ui/spice-display.h
20 20
#include <spice/qxl_dev.h>
21 21

  
22 22
#include "qemu-thread.h"
23
#include "console.h"
23 24
#include "pflib.h"
24 25

  
25 26
#define NUM_MEMSLOTS 8
......
55 56
     */
56 57
    QemuMutex lock;
57 58
    SimpleSpiceUpdate *update;
59
    QEMUCursor *cursor;
60
    int mouse_x, mouse_y;
58 61
};
59 62

  
60 63
struct SimpleSpiceUpdate {

Also available in: Unified diff