[Spice-devel] [PATCH spice-server 2/2] stream-device: Implement mouse movement

Frediano Ziglio fziglio at redhat.com
Tue Jan 16 12:28:52 UTC 2018


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 c15742c6..1150e1d1 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;
@@ -133,6 +135,13 @@ stream_device_read_msg_from_dev(RedCharDevice *self, SpiceCharDeviceInstance *si
     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:
@@ -350,6 +359,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)
 {
-- 
2.14.3



More information about the Spice-devel mailing list