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

Christophe Fergeau cfergeau at redhat.com
Mon Apr 13 08:34:32 PDT 2015


Hey,

I don't really understand why this one is needed.
I've checked that before inputs_channel_handle_parsed() is called, the
data goes through parse_msgc_inputs_key_down() in
generated_server_demarshallers.c and this should byte swap the data if
needed.

I'd add a
printf("(%02x %02x %02x %02x)\n", start[0], start[1], start[2],
start[3]); somewhere in that function in
generated_server_demarshallers.c
as well as printf("%08x\n", out->code); right after
out->code = consume_uint32(&in);
to try to figure out what's going on (or you can achieve the same in gdb)

As this is a similar issue as your patch about the number of channels,
can you double check that on your big endian builds, WORDS_BIGENDIAN is
defined when generated_server_demarshallers.c is built?

Christophe

On Mon, Apr 13, 2015 at 04:37:29PM +0300, Denis Kirjanov wrote:
> 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
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150413/e0646349/attachment.sig>


More information about the Spice-devel mailing list