Make cursor data @as_ptr to avoid copying data

This commit is contained in:
Alexander Larsson 2010-06-18 17:11:39 +02:00
parent 7fa29ea67e
commit 3c8cb83af5
4 changed files with 8 additions and 7 deletions

View File

@ -485,7 +485,7 @@ void CursorChannel::create_native_cursor(CursorData* cursor)
cursor->set_opaque(native_cursor);
}
void CursorChannel::set_cursor(SpiceCursor& red_cursor, int data_size, int x, int y, bool visible)
void CursorChannel::set_cursor(SpiceCursor& red_cursor, int x, int y, bool visible)
{
CursorData *cursor;
@ -497,7 +497,7 @@ void CursorChannel::set_cursor(SpiceCursor& red_cursor, int data_size, int x, in
if (red_cursor.flags & SPICE_CURSOR_FLAGS_FROM_CACHE) {
cursor = _cursor_cache.get(red_cursor.header.unique);
} else {
cursor = new CursorData(red_cursor, data_size);
cursor = new CursorData(red_cursor, red_cursor.data_size);
if (red_cursor.flags & SPICE_CURSOR_FLAGS_CACHE_ME) {
ASSERT(red_cursor.header.unique);
_cursor_cache.add(red_cursor.header.unique, cursor);
@ -560,7 +560,7 @@ void CursorChannel::handle_init(RedPeer::InMessage *message)
attach_to_screen(get_client().get_application(), get_id());
remove_cursor();
_cursor_cache.clear();
set_cursor(init->cursor, message->size() - sizeof(SpiceMsgCursorInit), init->position.x,
set_cursor(init->cursor, init->position.x,
init->position.y, init->visible != 0);
}
@ -574,7 +574,7 @@ void CursorChannel::handle_reset(RedPeer::InMessage *message)
void CursorChannel::handle_cursor_set(RedPeer::InMessage* message)
{
SpiceMsgCursorSet* set = (SpiceMsgCursorSet*)message->data();
set_cursor(set->cursor, message->size() - sizeof(SpiceMsgCursorSet), set->position.x,
set_cursor(set->cursor, set->position.x,
set->position.y, set->visible != 0);
}

View File

@ -63,7 +63,7 @@ private:
static void create_native_cursor(CursorData* cursor);
void update_display_cursor();
void set_cursor(SpiceCursor& red_cursor, int data_size, int x, int y, bool visible);
void set_cursor(SpiceCursor& red_cursor, int x, int y, bool visible);
void remove_cursor();
virtual void copy_pixels(const QRegion& dest_region, RedDrawable& dest_dc);

View File

@ -173,7 +173,8 @@ typedef struct SpiceMsgcMainMouseModeRequest {
typedef struct SpiceCursor {
uint32_t flags;
SpiceCursorHeader header;
uint8_t data[0];
uint32_t data_size;
uint8_t *data;
} SpiceCursor;
typedef struct SpiceMsgDisplayMode {

View File

@ -867,7 +867,7 @@ struct CursorHeader {
struct Cursor {
cursor_flags flags;
CursorHeader header;
uint8 data[] @end;
uint8 data[] @end @as_ptr(data_size);
};
channel CursorChannel : BaseChannel {