ping... again! ----- Original Message ----- > From: "Frediano Ziglio" <fziglio@xxxxxxxxxx> > To: spice-devel@xxxxxxxxxxxxxxxxxxxxx > Sent: Monday, May 9, 2016 12:15:15 PM > Subject: Re: [spice-gtk v3] Spice-widget: Use new gdk_event_get_scancode if available > > ping > > ----- Original Message ----- > > From: "Frediano Ziglio" <fziglio@xxxxxxxxxx> > > To: spice-devel@xxxxxxxxxxxxxxxxxxxxx > > Cc: "Frediano Ziglio" <fziglio@xxxxxxxxxx> > > Sent: Monday, April 25, 2016 4:36:45 PM > > Subject: [spice-gtk v3] Spice-widget: Use new gdk_event_get_scancode if > > available > > > > This new Gdk API allows in Windows to retrieve the raw scancodes sent > > by Windows. > > This allows us to do some translations getting the right value without > > many hacks and supporting all possible layouts. > > Windows convert the scancodes into virtual key codes. The translation is > > 1 -> N based on different condition. Also a single virtual key code can > > be originated from different scancodes. This make quite complicated > > (if not impossible) to get the original scancode from the hardware_keycode > > field (which in Windows is the virtual key). > > The additional check for native_scancode after calling this function > > allows to support key injection. > > > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > > --- > > configure.ac | 12 ++++++++++++ > > src/spice-widget.c | 22 +++++++++++++++++++--- > > 2 files changed, 31 insertions(+), 3 deletions(-) > > > > Changes from v2: > > - remove GTK_CHECK_VERSION check, use just a single check; > > - added some comment to configure.ac; > > - extend commit message. > > > > Changes from v1: > > - added configure.ac code so users using Gdk from > > master can use it. > > > > diff --git a/configure.ac b/configure.ac > > index ce80d88..ef60604 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -142,6 +142,18 @@ AC_SUBST(GTK_CFLAGS) > > AC_SUBST(GTK_LIBS) > > SPICE_GTK_REQUIRES="${SPICE_GTK_REQUIRES} gtk+-3.0 >= $GTK_REQUIRED" > > > > +# Check for gdk_event_get_scancode function > > +# This was added in Gdk 3.22 > > +# The check allows the usage of the function in case the function is > > +# backported or in case of compilation from Gdk master branch > > +old_LIBS="$LIBS" > > +old_CFLAGS="$CFLAGS" > > +CFLAGS="$CFLAGS $GTK_CFLAGS" > > +LIBS="$LIBS $GTK_LIBS" > > +AC_CHECK_FUNCS(gdk_event_get_scancode) > > +LIBS="$old_LIBS" > > +CFLAGS="$old_CFLAGS" > > + > > PKG_CHECK_EXISTS([gtk+-quartz-$with_gtk], [have_quartz=yes], > > [have_quartz=no]) > > AS_IF([test "x$have_quartz" = "xyes"], [AC_DEFINE([HAVE_QUARTZ], 1, [Have > > Quartz?])]) > > AM_CONDITIONAL([WITH_DISPLAY_QUARTZ], [test "x$have_quartz" = "xyes"]) > > diff --git a/src/spice-widget.c b/src/spice-widget.c > > index b458909..1299ae4 100644 > > --- a/src/spice-widget.c > > +++ b/src/spice-widget.c > > @@ -1455,9 +1455,25 @@ static gboolean key_event(GtkWidget *widget, > > GdkEventKey *key) > > scancode = vnc_display_keymap_gdk2xtkbd(d->keycode_map, > > d->keycode_maplen, > > key->hardware_keycode); > > #ifdef G_OS_WIN32 > > - native_scancode = MapVirtualKey(key->hardware_keycode, > > MAPVK_VK_TO_VSC); > > - /* MapVirtualKey doesn't return scancode with needed higher byte */ > > - scancode = native_scancode | (scancode & 0xff00); > > + /* Try to get scancode with gdk_event_get_scancode. > > + * This API is available from 3.22 or if backported. > > + */ > > +#if HAVE_GDK_EVENT_GET_SCANCODE > > + native_scancode = gdk_event_get_scancode((GdkEvent *) key); > > + if (native_scancode) { > > + scancode = native_scancode & 0x1ff; > > + /* Windows always set extended attribute for these keys */ > > + if (scancode == (0x100|DIK_NUMLOCK) || scancode == > > (0x100|DIK_RSHIFT)) > > + scancode &= 0xff; > > + } > > +#else > > + native_scancode = 0; > > +#endif > > + if (!native_scancode) { > > + native_scancode = MapVirtualKey(key->hardware_keycode, > > MAPVK_VK_TO_VSC); > > + /* MapVirtualKey doesn't return scancode with needed higher byte > > */ > > + scancode = native_scancode | (scancode & 0xff00); > > + } > > > > /* Some virtual-key codes are missed in MapVirtualKey(). */ > > switch (langid) { > > -- > > 2.5.5 > > > > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel