[gtk-vnc] Add support for Wayland and Xwayland keymap



commit 309d957aeb5618df816586518f2cedd24bab2a53
Author: Daniel P. Berrange <berrange redhat com>
Date:   Fri Feb 6 11:40:40 2015 +0000

    Add support for Wayland and Xwayland keymap
    
    Both Wayland and Xwayland use the evdev + 8 map for keycodes,
    just as regular Xorg with evdev does.
    
    Signed-off-by: Daniel P. Berrange <berrange redhat com>

 src/vncdisplaykeymap.c |   51 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 47 insertions(+), 4 deletions(-)
---
diff --git a/src/vncdisplaykeymap.c b/src/vncdisplaykeymap.c
index 7f11e7c..d7fc778 100644
--- a/src/vncdisplaykeymap.c
+++ b/src/vncdisplaykeymap.c
@@ -12,6 +12,8 @@
 
 #include <gdk/gdk.h>
 #include <gdk/gdkkeysyms.h>
+#include <stdlib.h>
+
 #include "vncdisplaykeymap.h"
 #include "vncutil.h"
 
@@ -56,6 +58,15 @@ static struct {
 
 static unsigned int ref_count_for_untranslated_keys = 0;
 
+#ifdef GDK_WINDOWING_WAYLAND
+#include <gdk/gdkwayland.h>
+#endif
+
+#if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND)
+/* Wayland or Xorg Linux + evdev (offset evdev keycodes) */
+#include "vncdisplaykeymap_xorgevdev2rfb.c"
+#endif
+
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 #include <X11/XKBlib.h>
@@ -64,8 +75,6 @@ static unsigned int ref_count_for_untranslated_keys = 0;
 
 /* Xorg Linux + kbd (offset + mangled XT keycodes) */
 #include "vncdisplaykeymap_xorgkbd2rfb.c"
-/* Xorg Linux + evdev (offset evdev keycodes) */
-#include "vncdisplaykeymap_xorgevdev2rfb.c"
 /* Xorg OS-X aka XQuartz (offset OS-X keycodes) */
 #include "vncdisplaykeymap_xorgxquartz2rfb.c"
 /* Xorg Cygwin aka XWin (offset + mangled XT keycodes) */
@@ -105,6 +114,8 @@ static gboolean check_for_xwin(GdkDisplay *dpy)
 {
     char *vendor = ServerVendor(gdk_x11_display_get_xdisplay(dpy));
 
+    VNC_DEBUG("Server vendor is '%s'", vendor);
+
     if (strstr(vendor, "Cygwin/X"))
         return TRUE;
 
@@ -119,6 +130,7 @@ static gboolean check_for_xquartz(GdkDisplay *dpy)
     char **extensions = XListExtensions(gdk_x11_display_get_xdisplay(dpy),
                                         &nextensions);
     for (i = 0 ; extensions != NULL && i < nextensions ; i++) {
+        VNC_DEBUG("Found extension '%s'", extensions[i]);
         if (strcmp(extensions[i], "Apple-WM") == 0 ||
             strcmp(extensions[i], "Apple-DRI") == 0)
             match = TRUE;
@@ -128,6 +140,18 @@ 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");
+
+    VNC_DEBUG("Wayland display '%s'", dpystr ? dpystr : "<none>");
+    return dpystr != NULL;
+}
 #endif
 
 const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
@@ -139,6 +163,7 @@ const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
         XkbDescPtr desc;
         const gchar *keycodes = NULL;
 
+        VNC_DEBUG("Using X11 backend");
         /* There is no easy way to determine what X11 server
          * and platform & keyboard driver is in use. Thus we
          * do best guess heuristics.
@@ -155,8 +180,14 @@ const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
                 keycodes = gdk_x11_get_xatom_name(desc->names->keycodes);
                 if (!keycodes)
                     g_warning("could not lookup keycode name");
+                else
+                    VNC_DEBUG("XKB keyboard map name '%s'", keycodes);
+            } else {
+                VNC_DEBUG("No XKB keyboard keyboard map name");
             }
             XkbFreeKeyboard(desc, XkbGBN_AllComponentsMask, True);
+        } else {
+            VNC_DEBUG("No XKB keyboard description available");
         }
 
         if (check_for_xwin(dpy)) {
@@ -167,6 +198,10 @@ const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
             VNC_DEBUG("Using xquartz keycode mapping");
             *maplen = G_N_ELEMENTS(keymap_xorgxquartz2rfb);
             return keymap_xorgxquartz2rfb;
+        } else if (check_for_xwayland(dpy)) {
+            VNC_DEBUG("Using wayland evdec keycode mapping");
+            *maplen = G_N_ELEMENTS(keymap_xorgevdev2rfb);
+            return keymap_xorgevdev2rfb;
         } else if (keycodes && STRPREFIX(keycodes, "evdev_")) {
             VNC_DEBUG("Using evdev keycode mapping");
             *maplen = G_N_ELEMENTS(keymap_xorgevdev2rfb);
@@ -176,7 +211,7 @@ const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
             *maplen = G_N_ELEMENTS(keymap_xorgkbd2rfb);
             return keymap_xorgkbd2rfb;
         } else {
-            g_warning("Unknown keycode mapping '%s'.\n"
+            g_warning("Unknown X11 keycode mapping '%s'.\n"
                       "Please report to gtk-vnc-list gnome org\n"
                       "including the following information:\n"
                       "\n"
@@ -185,12 +220,20 @@ const guint16 *vnc_display_keymap_gdk2rfb_table(size_t *maplen)
                       "  - X11 Server\n"
                       "  - xprop -root\n"
                       "  - xdpyinfo\n",
-                      keycodes);
+                      keycodes ? keycodes : "<null>");
             return NULL;
         }
     }
 #endif
 
+#ifdef GDK_WINDOWING_WAYLAND
+    if (GDK_IS_WAYLAND_DISPLAY(dpy)) {
+        VNC_DEBUG("Using Wayland evdev virtual keycode mapping");
+        *maplen = G_N_ELEMENTS(keymap_evdev2rfb);
+        return keymap_evdev2rfb;
+    }
+#endif
+
 #ifdef GDK_WINDOWING_WIN32
     if (GDK_IS_WIN32_DISPLAY(dpy)) {
         VNC_DEBUG("Using Win32 virtual keycode mapping");


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