> > 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) Does not compile on gcc Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel