[Spice-devel] [PATCH] server: input_channel: fix input on BE machines

Denis Kirjanov kda at linux-powerpc.org
Mon Apr 13 06:37:29 PDT 2015


The following patch fixes the input between SPICE
server on BE machine and LE client

Signed-off-by: Denis Kirjanov <kda at itsirius.su>
---
 server/inputs_channel.c |   23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/server/inputs_channel.c b/server/inputs_channel.c
index b0ba1d6..6f19492 100644
--- a/server/inputs_channel.c
+++ b/server/inputs_channel.c
@@ -28,6 +28,7 @@
 #include <spice/vd_agent.h>
 #include <spice/protocol.h>
 #include <stdbool.h>
+#include <glib.h>
 
 #include "common/marshaller.h"
 #include "common/messages.h"
@@ -326,21 +327,24 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
     InputsChannel *inputs_channel = (InputsChannel *)rcc->channel;
     InputsChannelClient *icc = (InputsChannelClient *)rcc;
     uint32_t i;
+    uint32_t key_code;
 
     spice_assert(g_inputs_channel == inputs_channel);
     switch (type) {
     case SPICE_MSGC_INPUTS_KEY_DOWN: {
         SpiceMsgcKeyDown *key_down = message;
-        if (key_down->code == CAPS_LOCK_SCAN_CODE ||
-            key_down->code == NUM_LOCK_SCAN_CODE ||
-            key_down->code == SCROLL_LOCK_SCAN_CODE) {
+               key_code = GUINT32_FROM_LE(key_down->code);
+        if (key_code == CAPS_LOCK_SCAN_CODE ||
+            key_code == NUM_LOCK_SCAN_CODE ||
+            key_code == SCROLL_LOCK_SCAN_CODE) {
             activate_modifiers_watch();
         }
     }
     case SPICE_MSGC_INPUTS_KEY_UP: {
         SpiceMsgcKeyUp *key_up = message;
+               key_code = GUINT32_FROM_LE(key_up->code);
         for (i = 0; i < 4; i++) {
-            uint8_t code = (key_up->code >> (i * 8)) & 0xff;
+            uint8_t code = (key_code >> (i * 8)) & 0xff;
             if (code == 0) {
                 break;
             }
@@ -357,6 +361,9 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
     }
     case SPICE_MSGC_INPUTS_MOUSE_MOTION: {
         SpiceMsgcMouseMotion *mouse_motion = message;
+               mouse_motion->dx = GUINT32_FROM_LE(mouse_motion->dx);
+               mouse_motion->dy = GUINT32_FROM_LE(mouse_motion->dy);
+               mouse_motion->buttons_state = GUINT32_FROM_LE(mouse_motion->buttons_state);
 
         if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
             !g_inputs_channel->src_during_migrate) {
@@ -374,6 +381,10 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
     }
     case SPICE_MSGC_INPUTS_MOUSE_POSITION: {
         SpiceMsgcMousePosition *pos = message;
+               pos->x = GUINT32_FROM_LE(pos->x);
+               pos->y = GUINT32_FROM_LE(pos->y);
+               pos->buttons_state = GUINT32_FROM_LE(pos->buttons_state);
+               pos->display_id = GUINT32_FROM_LE(pos->display_id);
 
         if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 &&
             !g_inputs_channel->src_during_migrate) {
@@ -400,6 +411,8 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
     }
     case SPICE_MSGC_INPUTS_MOUSE_PRESS: {
         SpiceMsgcMousePress *mouse_press = message;
+               mouse_press->buttons_state = GINT16_FROM_LE(mouse_press->buttons_state);
+
         int dz = 0;
         if (mouse_press->button == SPICE_MOUSE_BUTTON_UP) {
             dz = -1;
@@ -428,6 +441,8 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
     }
     case SPICE_MSGC_INPUTS_MOUSE_RELEASE: {
         SpiceMsgcMouseRelease *mouse_release = message;
+               mouse_release->buttons_state = GUINT32_FROM_LE(mouse_release->buttons_state);
+
         if (reds_get_mouse_mode() == SPICE_MOUSE_MODE_CLIENT) {
             if (reds_get_agent_mouse() && reds_has_vdagent()) {
                 inputs_channel->mouse_state.buttons =
-- 
1.7.10.4



More information about the Spice-devel mailing list