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