[Spice-devel] [spice-gtk v2] Handle pause key correctly
Pavel Grunt
pgrunt at redhat.com
Wed Jul 27 08:28:12 UTC 2016
Hi Frediano,
On Tue, 2016-07-26 at 13:32 +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 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(+)
>
> Changes from v1:
> - fixed typo in commit message;
> - separate press from release, seems that some HW keyboard
> send them separately.
>
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index c7dd553..6c00563 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. This will send same scancodes
> + * as hardware.
> + * 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);
> + } else {
> + spice_inputs_key_release(inputs, 0x21d);
> + spice_inputs_key_release(inputs, 0x45);
> + }
> + 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 */
Please open a bug for gtk about it (refence in the comment ^ would be nice)
> + || 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);
ack,
Pavel
More information about the Spice-devel
mailing list