[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