[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