diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-08-26 23:37:24 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-08-26 23:37:24 +0200 |
commit | a05741ce1b9099c3a3df3865e4d0563eec46e2f8 (patch) | |
tree | 488f59ed82e289f86f6fe19c6bb690910ab14734 /server/red_parse_qxl.c | |
parent | ea2f97a81015ecf2792e1906a6c0b156ec86cc5b (diff) | |
download | spice-a05741ce1b9099c3a3df3865e4d0563eec46e2f8.tar.gz spice-a05741ce1b9099c3a3df3865e4d0563eec46e2f8.tar.xz spice-a05741ce1b9099c3a3df3865e4d0563eec46e2f8.zip |
qxl parser: add cursor parsing
Diffstat (limited to 'server/red_parse_qxl.c')
-rw-r--r-- | server/red_parse_qxl.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index fb46bd8b..6fa6ac58 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -984,6 +984,44 @@ void red_put_surface_cmd(RedSurfaceCmd *red) /* nothing yet */ } +static void red_get_cursor(RedMemSlotInfo *slots, int group_id, + SpiceCursor *red, QXLPHYSICAL addr) +{ + QXLCursor *qxl; + RedDataChunk chunks; + size_t size; + uint8_t *data; + bool free_data; + + qxl = (QXLCursor *)get_virt(slots, addr, sizeof(*qxl), group_id); + + red->header.unique = qxl->header.unique; + red->header.type = qxl->header.type; + red->header.width = qxl->header.width; + red->header.height = qxl->header.height; + red->header.hot_spot_x = qxl->header.hot_spot_x; + red->header.hot_spot_y = qxl->header.hot_spot_y; + + red->flags = 0; + red->data_size = qxl->data_size; + size = red_get_data_chunks_ptr(slots, group_id, + get_memslot_id(slots, addr), + &chunks, &qxl->chunk); + data = red_linearize_chunk(&chunks, size, &free_data); + red_put_data_chunks(&chunks); + red->data = spice_malloc(size); + memcpy(red->data, data, size); + + if (free_data) { + free(data); + } +} + +static void red_put_cursor(SpiceCursor *red) +{ + free(red->data); +} + void red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id, RedCursorCmd *red, QXLPHYSICAL addr) { @@ -997,7 +1035,7 @@ void red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id, case QXL_CURSOR_SET: red_get_point16_ptr(&red->u.set.position, &qxl->u.set.position); red->u.set.visible = qxl->u.set.visible; - red->u.set.shape = qxl->u.set.shape; + red_get_cursor(slots, group_id, &red->u.set.shape, qxl->u.set.shape); break; case QXL_CURSOR_MOVE: red_get_point16_ptr(&red->u.position, &qxl->u.position); @@ -1011,6 +1049,10 @@ void red_get_cursor_cmd(RedMemSlotInfo *slots, int group_id, void red_put_cursor_cmd(RedCursorCmd *red) { - /* nothing yet */ + switch (red->type) { + case QXL_CURSOR_SET: + red_put_cursor(&red->u.set.shape); + break; + } } |