Re: [spice-gtk v3] Spice-widget: Use new gdk_event_get_scancode if available

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

sorry, ack.

Pavel

On Mon, 2016-05-16 at 06:06 -0400, Frediano Ziglio wrote:
> 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
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]