]> source.dussan.org Git - tigervnc.git/commitdiff
Add X11 keyboard handler
authorPierre Ossman <ossman@cendio.se>
Mon, 21 Jul 2014 14:42:12 +0000 (16:42 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 22 Aug 2014 13:10:28 +0000 (15:10 +0200)
vncviewer/Viewport.cxx
vncviewer/vncviewer.cxx

index 2b22a9738779f5adfc013d67c14906301c748368..0f627229b40c17ab31e5ebb58fb8b7de01bfe192 100644 (file)
@@ -647,6 +647,47 @@ bool Viewport::handleXEvent(void *event, void *data)
 
   assert(event);
 
+#if !defined(WIN32) && !defined(__APPLE__)
+  XEvent *xevent = (XEvent*)event;
+
+  if (xevent->type == KeyPress) {
+    char str;
+    KeySym keysym;
+
+    XLookupString(&xevent->xkey, &str, 1, &keysym, NULL);
+    if (keysym == NoSymbol) {
+      vlog.error(_("No symbol for key code %d (in the current state)"),
+                 (int)xevent->xkey.keycode);
+      return true;
+    }
+
+    switch (keysym) {
+    // For the first few years, there wasn't a good consensus on what the
+    // Windows keys should be mapped to for X11. So we need to help out a
+    // bit and map all variants to the same key...
+    case XK_Meta_L:
+    case XK_Hyper_L:
+      keysym = XK_Super_L;
+      break;
+    case XK_Meta_R:
+    case XK_Hyper_R:
+      keysym = XK_Super_R;
+      break;
+    // There has been several variants for Shift-Tab over the years.
+    // RFB states that we should always send a normal tab.
+    case XK_ISO_Left_Tab:
+      keysym = XK_Tab;
+      break;
+    }
+
+    self->handleKeyPress(xevent->xkey.keycode, keysym);
+    return true;
+  } else if (xevent->type == KeyRelease) {
+    self->handleKeyRelease(xevent->xkey.keycode);
+    return true;
+  }
+#endif
+
   return false;
 }
 
index 3f0393793f17595f662888129da731912b1bf5c5..82286ab89f34409506521714f52e96a1602ab6e0 100644 (file)
 #define mkdir(path, mode) _mkdir(path)
 #endif
 
+#if !defined(WIN32) && !defined(__APPLE__)
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#endif
+
 #include <rfb/Logger_stdio.h>
 #include <rfb/SecurityClient.h>
 #include <rfb/Security.h>
@@ -386,6 +391,11 @@ int main(int argc, char** argv)
 
   init_fltk();
 
+#if !defined(WIN32) && !defined(__APPLE__)
+  fl_open_display();
+  XkbSetDetectableAutoRepeat(fl_display, True, NULL);
+#endif
+
   Configuration::enableViewerParams();
 
   /* Load the default parameter settings */