[Spice-devel] [PATCH spice-gtk] channel-inputs: Fix sending 00 scancodes to guests with scancode cap

Alon Levy alevy at redhat.com
Thu Oct 18 08:48:27 PDT 2012


Looks good to me.

> The code for handling single key up / down events in spice-server is:
>         SpiceMsgcKeyDown *key_down = (SpiceMsgcKeyDown *)buf;
>         uint8_t *now = (uint8_t *)&key_down->code;
>         uint8_t *end = now + sizeof(key_down->code);
>         for (; now < end && *now; now++) {
>             kbd_push_scan(keyboard, *now);
>         }
> 
> Notice the *now, which makes sure that no scancodes with the value 0
> get
> send! But the new SPICE_MSGC_INPUTS_KEY_SCANCODE in the server does:
> 
>         uint8_t *code = (uint8_t *)buf;
>         for (i = 0; i < size; i++) {
>             kbd_push_scan(keyboard, code[i]);
>         }
> 
> And thus will push any 0 bytes in the buffer. Resulting in these
> message
> in the guest:
> 
> atkbd serio0: Unknown key pressed (translated set 2, code 0x0 on
> isa0060/serio0).
> atkbd serio0: Use 'setkeycodes 00 <keycode>' to make it known.
> 
> Rather then making the server skip 0 bytes I believe it is better to
> just
> make spice-gtk not send these in the first place, which is what this
> patch
> does.
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  gtk/channel-inputs.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/gtk/channel-inputs.c b/gtk/channel-inputs.c
> index c907948..ee86dc2 100644
> --- a/gtk/channel-inputs.c
> +++ b/gtk/channel-inputs.c
> @@ -537,12 +537,23 @@ void
> spice_inputs_key_press_and_release(SpiceInputsChannel
> *input_channel, guint
>  
>      if (spice_channel_test_capability(channel,
>      SPICE_INPUTS_CAP_KEY_SCANCODE)) {
>          SpiceMsgOut *msg;
> -        guint16 *code;
> +        guint16 code;
> +        guint8 *buf;
>  
>          msg = spice_msg_out_new(channel,
>          SPICE_MSGC_INPUTS_KEY_SCANCODE);
> -        code =
> (guint16*)spice_marshaller_reserve_space(msg->marshaller, 2 *
> sizeof(guint16));
> -        *code++ = spice_make_scancode(scancode, FALSE);
> -        *code = spice_make_scancode(scancode, TRUE);
> +        if (scancode < 0x100) {
> +            buf =
> (guint8*)spice_marshaller_reserve_space(msg->marshaller, 2);
> +            buf[0] = spice_make_scancode(scancode, FALSE);
> +            buf[1] = spice_make_scancode(scancode, TRUE);
> +        } else {
> +            buf =
> (guint8*)spice_marshaller_reserve_space(msg->marshaller, 4);
> +            code = spice_make_scancode(scancode, FALSE);
> +            buf[0] = code & 0xff;
> +            buf[1] = code >> 8;
> +            code = spice_make_scancode(scancode, TRUE);
> +            buf[2] = code & 0xff;
> +            buf[3] = code >> 8;
> +        }
>          spice_msg_out_send(msg);
>      } else {
>          CHANNEL_DEBUG(channel, "The server doesn't support atomic
>          press and release");
> --
> 1.7.12.1
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list