[Spice-devel] [PATCH spice-server v3 2/2] stream-device: Implement mouse movement
Jonathon Jongsma
jjongsma at redhat.com
Fri Feb 16 21:12:45 UTC 2018
On Tue, 2018-02-13 at 13:58 +0000, Frediano Ziglio wrote:
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/stream-device.c | 38 +++++++++++++++++++++++++++++++++++++-
> 1 file changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/server/stream-device.c b/server/stream-device.c
> index f6fd9108..bf03efb6 100644
> --- a/server/stream-device.c
> +++ b/server/stream-device.c
> @@ -47,6 +47,7 @@ struct StreamDevice {
> StreamMsgFormat format;
> StreamMsgCapabilities capabilities;
> StreamMsgCursorSet cursor_set;
> + StreamMsgCursorMove cursor_move;
> uint8_t buf[STREAM_MSG_CAPABILITIES_MAX_BYTES];
> } *msg;
> uint32_t msg_pos;
> @@ -70,7 +71,8 @@ G_DEFINE_TYPE(StreamDevice, stream_device,
> RED_TYPE_CHAR_DEVICE)
> typedef bool StreamMsgHandler(StreamDevice *dev,
> SpiceCharDeviceInstance *sin)
> SPICE_GNUC_WARN_UNUSED_RESULT;
>
> -static StreamMsgHandler handle_msg_format, handle_msg_data,
> handle_msg_cursor_set;
> +static StreamMsgHandler handle_msg_format, handle_msg_data,
> handle_msg_cursor_set,
> + handle_msg_cursor_move;
>
> static bool handle_msg_invalid(StreamDevice *dev,
> SpiceCharDeviceInstance *sin,
> const char *error_msg)
> SPICE_GNUC_WARN_UNUSED_RESULT;
> @@ -128,6 +130,13 @@ stream_device_partial_read(StreamDevice *dev,
> SpiceCharDeviceInstance *sin)
> case STREAM_TYPE_CURSOR_SET:
> handled = handle_msg_cursor_set(dev, sin);
> break;
> + case STREAM_TYPE_CURSOR_MOVE:
> + if (dev->hdr.size != sizeof(StreamMsgCursorMove)) {
> + handled = handle_msg_invalid(dev, sin, "Wrong size for
> StreamMsgCursorMove");
> + } else {
> + handled = handle_msg_cursor_move(dev, sin);
> + }
> + break;
> case STREAM_TYPE_CAPABILITIES:
> /* FIXME */
> default:
> @@ -371,6 +380,33 @@ handle_msg_cursor_set(StreamDevice *dev,
> SpiceCharDeviceInstance *sin)
> return true;
> }
>
> +static bool
> +handle_msg_cursor_move(StreamDevice *dev, SpiceCharDeviceInstance
> *sin)
> +{
> + SpiceCharDeviceInterface *sif =
> spice_char_device_get_interface(sin);
> + int n = sif->read(sin, dev->msg->buf + dev->msg_pos, dev-
> >hdr.size - dev->msg_pos);
> + if (n <= 0) {
> + return false;
> + }
> + dev->msg_pos += n;
> + if (dev->msg_pos != dev->hdr.size) {
> + return false;
> + }
> +
> + StreamMsgCursorMove *move = &dev->msg->cursor_move;
> + move->x = GINT32_FROM_LE(move->x);
> + move->y = GINT32_FROM_LE(move->y);
> +
> + RedCursorCmd *cmd = g_new0(RedCursorCmd, 1);
> + cmd->type = QXL_CURSOR_MOVE;
> + cmd->u.position.x = move->x;
> + cmd->u.position.y = move->y;
> +
> + cursor_channel_process_cmd(dev->cursor_channel, cmd);
> +
> + return true;
> +}
> +
> static void
> stream_device_send_msg_to_client(RedCharDevice *self, RedPipeItem
> *msg, RedClient *client)
> {
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
More information about the Spice-devel
mailing list