From: Christophe de Dinechin <dinechin@xxxxxxxxxx> Signed-off-by: Christophe de Dinechin <dinechin@xxxxxxxxxx> --- src/spice-streaming-agent.cpp | 49 +++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp index a55e1a5..7a3a46d 100644 --- a/src/spice-streaming-agent.cpp +++ b/src/spice-streaming-agent.cpp @@ -53,6 +53,12 @@ struct SpiceStreamDataMessage StreamMsgData msg; }; +struct SpiceStreamCursorMessage +{ + StreamDevHeader hdr; + StreamMsgCursorSet msg; +}; + struct Stream { Stream(const char *name, int &fd): fd(fd) @@ -310,38 +316,41 @@ static void usage(const char *progname) } static void -send_cursor(unsigned width, unsigned height, int hotspot_x, int hotspot_y, +send_cursor(uint16_t width, uint16_t height, + uint16_t hotspot_x, uint16_t hotspot_y, std::function<void(uint32_t *)> fill_cursor) { if (width >= STREAM_MSG_CURSOR_SET_MAX_WIDTH || height >= STREAM_MSG_CURSOR_SET_MAX_HEIGHT) return; - size_t cursor_size = - sizeof(StreamDevHeader) + sizeof(StreamMsgCursorSet) + - width * height * sizeof(uint32_t); - std::unique_ptr<uint8_t[]> msg(new uint8_t[cursor_size]); - - StreamDevHeader &dev_hdr(*reinterpret_cast<StreamDevHeader*>(msg.get())); - memset(&dev_hdr, 0, sizeof(dev_hdr)); - dev_hdr.protocol_version = STREAM_DEVICE_PROTOCOL; - dev_hdr.type = STREAM_TYPE_CURSOR_SET; - dev_hdr.size = cursor_size - sizeof(StreamDevHeader); + const uint32_t cursor_msgsize = + sizeof(SpiceStreamCursorMessage) + width * height * sizeof(uint32_t); + const uint32_t hdrsize = sizeof(StreamDevHeader); - StreamMsgCursorSet &cursor_msg(*reinterpret_cast<StreamMsgCursorSet *>(msg.get() + sizeof(StreamDevHeader))); - memset(&cursor_msg, 0, sizeof(cursor_msg)); + std::unique_ptr<uint8_t[]> storage(new uint8_t[cursor_msgsize]); - cursor_msg.type = SPICE_CURSOR_TYPE_ALPHA; - cursor_msg.width = width; - cursor_msg.height = height; - cursor_msg.hot_spot_x = hotspot_x; - cursor_msg.hot_spot_y = hotspot_y; + SpiceStreamCursorMessage *cursor_msg = + new(storage.get()) SpiceStreamCursorMessage { + .hdr = { + .protocol_version = STREAM_DEVICE_PROTOCOL, + .type = STREAM_TYPE_CURSOR_SET, + .size = cursor_msgsize - hdrsize + }, + .msg = { + .type = SPICE_CURSOR_TYPE_ALPHA, + .width = width, + .height = height, + .hot_spot_x = hotspot_x, + .hot_spot_y = hotspot_y + } + }; - uint32_t *pixels = reinterpret_cast<uint32_t *>(cursor_msg.data); + uint32_t *pixels = reinterpret_cast<uint32_t *>(cursor_msg->msg.data); fill_cursor(pixels); std::lock_guard<std::mutex> stream_guard(stream_mtx); - write_all(streamfd, msg.get(), cursor_size); + write_all(streamfd, storage.get(), cursor_msgsize); } static void cursor_changes(Display *display, int event_base) -- 2.13.5 (Apple Git-94) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel