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