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@xxxxxxxxxx> > --- > 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 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel