[Spice-devel] [PATCH spice-gtk] vncdisplaykeymap: Add support for Xwayland keymap
Marc-André Lureau
mlureau at redhat.com
Wed Feb 18 06:59:05 PST 2015
----- Original Message -----
> On Wed, Feb 18, 2015 at 09:47:55AM -0500, Marc-André Lureau wrote:
> >
> >
> > ----- Original Message -----
> > > From: "Daniel P. Berrange" <berrange at redhat.com>
> > >
> > > Both Wayland and Xwayland use the evdev + 8 map for keycodes,
> > > just as regular Xorg with evdev does.
> > >
> > > This code is copied from gtk-vnc.
> > >
> > > Fixes https://bugs.freedesktop.org/show_bug.cgi?id=89105
> > > ---
> > > gtk/vncdisplaykeymap.c | 16 ++++++++++++++++
> > > 1 file changed, 16 insertions(+)
> > >
> > > diff --git a/gtk/vncdisplaykeymap.c b/gtk/vncdisplaykeymap.c
> > > index 340a86f..32fdac5 100644
> > > --- a/gtk/vncdisplaykeymap.c
> > > +++ b/gtk/vncdisplaykeymap.c
> > > @@ -12,6 +12,7 @@
> > > #include <gtk/gtk.h>
> > > #include <gdk/gdk.h>
> > > #include <gdk/gdkkeysyms.h>
> > > +#include <stdlib.h>
> > > #include "gtk-compat.h"
> > > #include "vncdisplaykeymap.h"
> > >
> > > @@ -156,6 +157,17 @@ static gboolean check_for_xquartz(GdkDisplay *dpy)
> > >
> > > return match;
> > > }
> > > +
> > > +static gboolean check_for_xwayland(GdkDisplay *dpy G_GNUC_UNUSED)
> > > +{
> > > + /* There is no obvious extension name or root window property
> > > + * that identifies as Xwayland. It also does not report any
> > > + * XKB info. So this env var check is least-worst option left
> > > + */
> > > + char *dpystr = getenv("WAYLAND_DISPLAY");
> > > +
> > > + return dpystr != NULL;
> > > +}
> > > #endif
> > >
> > > const guint16 *vnc_display_keymap_gdk2xtkbd_table(GdkWindow *window,
> > > @@ -195,6 +207,10 @@ const guint16
> > > *vnc_display_keymap_gdk2xtkbd_table(GdkWindow *window,
> > > VNC_DEBUG("Using xquartz keycode mapping");
> > > *maplen = G_N_ELEMENTS(keymap_xorgxquartz2xtkbd);
> > > return keymap_xorgxquartz2xtkbd;
> > > + } else if (check_for_xwayland(dpy)) {
> > > + VNC_DEBUG("Using wayland evdec keycode mapping");
> > > + *maplen = G_N_ELEMENTS(keymap_xorgevdev2xtkbd);
> > > + return keymap_xorgevdev2xtkbd;
> > > } else if (keycodes && STRPREFIX(keycodes, "evdev_")) {
> > > VNC_DEBUG("Using evdev keycode mapping");
> > > *maplen = G_N_ELEMENTS(keymap_xorgevdev2xtkbd);
> > > --
> > > 2.3.0
> >
> > We already have wayland input support since:
> >
> > commit 577263aaf4cffe260e31d19eb4b8bca1c253eff3
> > Author: Marc-André Lureau <marcandre.lureau at redhat.com>
> > Date: Mon May 13 01:11:07 2013 +0200
> >
> > vncdisplaykeymap: add wayland support
> >
> > The Wayland keycode are just Linux evdev, but the Gdk backend
> > add the +8 offset used by Xorg evdev.
> >
> >
> > Not sure about XWayland, but I would assume this was enough,
> > and didn't rely on a not so reliable environment variable.
>
> Your change only works when the GTK application is running as a
> native Wayland client. This fix works when the GTK application
> is runing as an X11 client on Xwayland.
>
> The use of the env variable is certainly sucky, but I've not
> found any other way to identify that the X server is the
> Xwayland one :-( It doesn't report any XKB keyboard info,
> the server vendor string is completely generic and there's no
> wayland specific extension present.
Why didn't you consider this a XWayland bug instead? Sounds wrong to me that X apps under XWayland have to be modified.
More information about the Spice-devel
mailing list