[Spice-devel] [spice-gtk 2/2] Handle pause key correctly

Pavel Grunt pgrunt at redhat.com
Tue Jul 26 11:51:30 UTC 2016


Hi Frediano,

On Tue, 2016-07-26 at 10:04 +0100, Frediano Ziglio wrote:
> Windows does not like Pause key sent with same scancodes as Break.
> Although is the same physical key the two functions send two complitely
typo - completely
> different set of codes.
> Tested with Linux and Windows clients.
> Tested with Linux, Windows and DOS guests.
> On Windows guest VK_PAUSE was not arriving correctly.
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  src/spice-widget.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index c7dd553..7890f70 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -1286,6 +1286,25 @@ static gboolean key_press_delayed(gpointer data)
>      return FALSE;
>  }
>  
> +static bool send_pause(SpiceDisplay *display, GdkEventType type)
> +{
> +    SpiceInputsChannel *inputs = display->priv->inputs;
> +
> +    /* Send proper scancodes.
> +     * Note that this key send all scancode when pressed
> +     * but nothing when released.

What is the reason for that ?

So (in client):
 Press "Pause"
 Press something else
 Release something else
 Release "Pause" 
will produce (in guest):
 Press "Pause"
 Release "Pause"
 Press something else
 Release something else

It is a different behavior than in the client

> +     * The 0x21d is a sort of Third-Ctrl while
> +     * 0x45 is the NumLock.
> +     */
> +    if (type == GDK_KEY_PRESS) {
> +        spice_inputs_key_press(inputs, 0x21d);
> +        spice_inputs_key_press(inputs, 0x45);
> +        spice_inputs_key_release(inputs, 0x21d);
> +        spice_inputs_key_release(inputs, 0x45);

Do you know why it is needed to enter these "manually" ? Is the keymap wrongly
generated?

> +    }
> +    return true;
> +}
> +
>  static void send_key(SpiceDisplay *display, int scancode, SendKeyType type,
> gboolean press_delayed)
>  {
>      SpiceDisplayPrivate *d = display->priv;
> @@ -1479,6 +1498,14 @@ static gboolean key_event(GtkWidget *widget,
> GdkEventKey *key)
>      if (!d->inputs)
>          return true;
>  
> +    if (key->keyval == GDK_KEY_Pause
> +#ifdef G_OS_WIN32
> +        /* for some reason GDK does not fill keyval for VK_PAUSE */

rather bug for gtk ?

> +        || key->hardware_keycode == VK_PAUSE
> +#endif
> +        ) {
> +        return send_pause(display, key->type);
> +    }
>      if (!scancode)
>          scancode = vnc_display_keymap_gdk2xtkbd(d->keycode_map, d-
> >keycode_maplen,
>                                                  key->hardware_keycode);


Thanks,
Pavel



More information about the Spice-devel mailing list