]> git.mxchange.org Git - flightgear.git/commitdiff
#389: NumPad keys not working when NumLock is off
authorThorstenB <brehmt@gmail.com>
Sun, 7 Aug 2011 16:24:13 +0000 (18:24 +0200)
committerThorstenB <brehmt@gmail.com>
Sun, 7 Aug 2011 16:24:13 +0000 (18:24 +0200)
Map keys to something useful when NumLock is off (arrow keys etc),
since keycode was completely ignored (out of range) otherwise

src/Main/FGEventHandler.cxx
src/Main/FGEventHandler.hxx

index d6be62054e365fd9704147a01678a43ba014d6e4..5599723fa9228781a666630a8a0cebdadea4e01e 100644 (file)
@@ -60,6 +60,20 @@ FGEventHandler::FGEventHandler() :
     numlockKeyMap[GUIEventAdapter::KEY_KP_Home] = '7';
     numlockKeyMap[GUIEventAdapter::KEY_KP_Up] = '8';
     numlockKeyMap[GUIEventAdapter::KEY_KP_Page_Up] = '9';
+    numlockKeyMap[GUIEventAdapter::KEY_KP_Delete] = '.';
+
+    // mapping when NumLock is off
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Insert]     = PU_KEY_INSERT;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_End]        = PU_KEY_END;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Down]       = PU_KEY_DOWN;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Page_Down]  = PU_KEY_PAGE_DOWN;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Left]       = PU_KEY_LEFT;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Begin]      = '5';
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Right]      = PU_KEY_RIGHT;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Home]       = PU_KEY_HOME;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Up]         = PU_KEY_UP;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Page_Up]    = PU_KEY_PAGE_UP;
+    noNumlockKeyMap[GUIEventAdapter::KEY_KP_Delete]     = 127;
 
     for (int i = 0; i < 128; i++)
         release_keys[i] = i;
@@ -259,7 +273,6 @@ void FGEventHandler::handleKey(const osgGA::GUIEventAdapter& ea, int& key,
     case GUIEventAdapter::KEY_F10:         key = PU_KEY_F10;       break;
     case GUIEventAdapter::KEY_F11:         key = PU_KEY_F11;       break;
     case GUIEventAdapter::KEY_F12:         key = PU_KEY_F12;       break;
-    case GUIEventAdapter::KEY_KP_Delete:   key = '.';  break;
     case GUIEventAdapter::KEY_KP_Enter:    key = '\r'; break;
     case GUIEventAdapter::KEY_KP_Add:      key = '+';  break;
     case GUIEventAdapter::KEY_KP_Divide:   key = '/';  break;
@@ -268,18 +281,30 @@ void FGEventHandler::handleKey(const osgGA::GUIEventAdapter& ea, int& key,
     }
     osgGA::GUIEventAdapter::EventType eventType = ea.getEventType();
 
+#ifdef __APPLE__
+    // Num Lock is always true on Mac
     std::map<int, int>::iterator numPadIter = numlockKeyMap.find(key);
-
     if (numPadIter != numlockKeyMap.end()) {
-#ifdef __APPLE__
-        // Num Lock is always true on Mac
         key = numPadIter->second;
+    }
 #else
-        if (ea.getModKeyMask() & osgGA::GUIEventAdapter::MODKEY_NUM_LOCK) {
+    if (ea.getModKeyMask() & osgGA::GUIEventAdapter::MODKEY_NUM_LOCK)
+    {
+        // NumLock on: map to numeric keys
+        std::map<int, int>::iterator numPadIter = numlockKeyMap.find(key);
+        if (numPadIter != numlockKeyMap.end()) {
+            key = numPadIter->second;
+        }
+    }
+    else
+    {
+        // NumLock off: map to PU arrow keys
+        std::map<int, int>::iterator numPadIter = noNumlockKeyMap.find(key);
+        if (numPadIter != noNumlockKeyMap.end()) {
             key = numPadIter->second;
         }
-#endif
     }
+#endif
 
     modifiers = osgToFGModifiers(ea.getModKeyMask());
     currentModifiers = modifiers;
index 080d5afa1e73e9a9eb5cdbd292575b709cb7f39c..652b2b74dc4bf305fa5bfbef8b1ed1ff6a2a6b64 100644 (file)
@@ -113,6 +113,7 @@ protected:
     int statsType;
     int currentModifiers;
     std::map<int, int> numlockKeyMap;
+    std::map<int, int> noNumlockKeyMap;
     void handleKey(const osgGA::GUIEventAdapter& ea, int& key, int& modifiers);
     bool resizable;
     bool mouseWarped;