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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits