Revision: 4434
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4434&view=rev
Author:   ossman_
Date:     2011-05-20 12:05:20 +0000 (Fri, 20 May 2011)

Log Message:
-----------
Better handling of the numpad by looking at FLTK's "original key code".

Modified Paths:
--------------
    trunk/vncviewer/Viewport.cxx
    trunk/vncviewer/Viewport.h

Modified: trunk/vncviewer/Viewport.cxx
===================================================================
--- trunk/vncviewer/Viewport.cxx        2011-05-19 14:55:12 UTC (rev 4433)
+++ trunk/vncviewer/Viewport.cxx        2011-05-20 12:05:20 UTC (rev 4434)
@@ -248,11 +248,13 @@
       return 1;
     }
 
-    handleKeyEvent(Fl::event_key(), Fl::event_text(), true);
+    handleKeyEvent(Fl::event_key(), Fl::event_original_key(),
+                   Fl::event_text(), true);
     return 1;
 
   case FL_KEYUP:
-    handleKeyEvent(Fl::event_key(), Fl::event_text(), false);
+    handleKeyEvent(Fl::event_key(), Fl::event_original_key(),
+                   Fl::event_text(), false);
     return 1;
   }
 
@@ -322,7 +324,7 @@
 }
 
 
-rdr::U32 Viewport::translateKeyEvent(int keyCode, const char *keyText)
+rdr::U32 Viewport::translateKeyEvent(int keyCode, int origKeyCode, const char 
*keyText)
 {
   unsigned ucs;
 
@@ -334,6 +336,40 @@
   if ((keyCode >= (FL_KP + '0')) && (keyCode <= (FL_KP + '9')))
     return XK_KP_0 + (keyCode - (FL_KP + '0'));
 
+  // FLTK does some special remapping of numpad keys when numlock is off
+  if ((origKeyCode >= FL_KP) && (origKeyCode <= FL_KP_Last)) {
+    switch (keyCode) {
+    case FL_F+1:
+      return XK_KP_F1;
+    case FL_F+2:
+      return XK_KP_F2;
+    case FL_F+3:
+      return XK_KP_F3;
+    case FL_F+4:
+      return XK_KP_F4;
+    case FL_Home:
+      return XK_KP_Home;
+    case FL_Left:
+      return XK_KP_Left;
+    case FL_Up:
+      return XK_KP_Up;
+    case FL_Right:
+      return XK_KP_Right;
+    case FL_Down:
+      return XK_KP_Down;
+    case FL_Page_Up:
+      return XK_KP_Page_Up;
+    case FL_Page_Down:
+      return XK_KP_Page_Down;
+    case FL_End:
+      return XK_KP_End;
+    case FL_Insert:
+      return XK_KP_Insert;
+    case FL_Delete:
+      return XK_KP_Delete;
+    }
+  }
+
   // Then other special keys
   switch (keyCode) {
   case FL_BackSpace:
@@ -437,7 +473,7 @@
 }
 
 
-void Viewport::handleKeyEvent(int keyCode, const char *keyText, bool down)
+void Viewport::handleKeyEvent(int keyCode, int origKeyCode, const char 
*keyText, bool down)
 {
   rdr::U32 keySym;
 
@@ -451,13 +487,14 @@
   if (!down) {
     DownMap::iterator iter;
 
-    iter = downKeySym.find(keyCode);
+    iter = downKeySym.find(origKeyCode);
     if (iter == downKeySym.end()) {
-      vlog.error(_("Unexpected release of FLTK key code %d (0x%04x)"), 
keyCode, keyCode);
+      vlog.error(_("Unexpected release of FLTK key code %d (0x%04x)"),
+                 origKeyCode, origKeyCode);
       return;
     }
 
-    vlog.debug("Key released: 0x%04x => 0x%04x", keyCode, iter->second);
+    vlog.debug("Key released: 0x%04x => 0x%04x", origKeyCode, iter->second);
 
     cc->writer()->keyEvent(iter->second, false);
 
@@ -466,13 +503,14 @@
     return;
   }
 
-  keySym = translateKeyEvent(keyCode, keyText);
+  keySym = translateKeyEvent(keyCode, origKeyCode, keyText);
   if (keySym == XK_VoidSymbol)
     return;
 
-  vlog.debug("Key pressed: 0x%04x '%s' => 0x%04x", keyCode, keyText, keySym);
+  vlog.debug("Key pressed: 0x%04x (0x%04x) '%s' => 0x%04x",
+             origKeyCode, keyCode, keyText, keySym);
 
-  downKeySym[keyCode] = keySym;
+  downKeySym[origKeyCode] = keySym;
   cc->writer()->keyEvent(keySym, down);
 }
 
@@ -481,6 +519,8 @@
 {
   contextMenu->add(_("Exit viewer"), 0, NULL, (void*)ID_EXIT, FL_MENU_DIVIDER);
 
+  contextMenu->add(_("Full screen"), 0, NULL, (void*)ID_FULLSCREEN, 
FL_MENU_TOGGLE | FL_MENU_DIVIDER);
+
   contextMenu->add(_("Ctrl"), 0, NULL, (void*)ID_CTRL, FL_MENU_TOGGLE);
   contextMenu->add(_("Alt"), 0, NULL, (void*)ID_ALT, FL_MENU_TOGGLE);
   CharArray menuKeyStr(menuKey.getData());

Modified: trunk/vncviewer/Viewport.h
===================================================================
--- trunk/vncviewer/Viewport.h  2011-05-19 14:55:12 UTC (rev 4433)
+++ trunk/vncviewer/Viewport.h  2011-05-20 12:05:20 UTC (rev 4434)
@@ -98,8 +98,8 @@
   void handlePointerEvent(const rfb::Point& pos, int buttonMask);
   static void handlePointerTimeout(void *data);
 
-  rdr::U32 translateKeyEvent(int keyCode, const char *keyText);
-  void handleKeyEvent(int keyCode, const char *keyText, bool down);
+  rdr::U32 translateKeyEvent(int keyCode, int origKeyCode, const char 
*keyText);
+  void handleKeyEvent(int keyCode, int origKeyCode, const char *keyText, bool 
down);
 
   void initContextMenu();
   void popupContextMenu();


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to