]> git.mxchange.org Git - flightgear.git/commitdiff
- move temporary keyboard fix from input.cxx to fg_os{,_sdl}.cxx.
authormfranz <mfranz>
Mon, 12 Nov 2007 19:29:08 +0000 (19:29 +0000)
committermfranz <mfranz>
Mon, 12 Nov 2007 19:29:08 +0000 (19:29 +0000)
  This is required to make sure the same letter key gets released,
  which got the press event. (After Ctrl-press -> a-press -> Ctrl-release
  a-release we want the Ctrl-a binding released, not the a binding.)

- add key listener interface for direct key access from Nasal space

src/Input/input.cxx
src/Input/input.hxx
src/Main/FGManipulator.cxx
src/Main/FGManipulator.hxx
src/Main/fg_os.cxx
src/Main/fg_os_sdl.cxx

index ca38a2d376c22bb76efbf417e6094fea386a9c2b..704b25be86f5d58014f1a195dd47f95a56942665 100644 (file)
@@ -108,7 +108,8 @@ getModAlt ()
 ////////////////////////////////////////////////////////////////////////
 
 
-FGInput::FGInput ()
+FGInput::FGInput () :
+    _key_event(fgGetNode("/devices/status/keyboard/event", true))
 {
     if (default_input == 0)
         default_input = this;
@@ -150,6 +151,13 @@ FGInput::bind ()
   fgTie("/devices/status/keyboard/shift", getModShift);
   fgTie("/devices/status/keyboard/ctrl", getModCtrl);
   fgTie("/devices/status/keyboard/alt", getModAlt);
+
+  _key_event->tie("key", SGRawValuePointer<int>(&_key_code));
+  _key_event->tie("pressed", SGRawValuePointer<bool>(&_key_pressed));
+  _key_event->tie("modifier", SGRawValuePointer<int>(&_key_modifiers));
+  _key_event->tie("modifier/shift", SGRawValuePointer<bool>(&_key_shift));
+  _key_event->tie("modifier/ctrl", SGRawValuePointer<bool>(&_key_ctrl));
+  _key_event->tie("modifier/alt", SGRawValuePointer<bool>(&_key_alt));
 }
 
 void
@@ -158,6 +166,13 @@ FGInput::unbind ()
   fgUntie("/devices/status/keyboard/shift");
   fgUntie("/devices/status/keyboard/ctrl");
   fgUntie("/devices/status/keyboard/alt");
+
+  _key_event->untie("key");
+  _key_event->untie("pressed");
+  _key_event->untie("modifier");
+  _key_event->untie("modifier/shift");
+  _key_event->untie("modifier/ctrl");
+  _key_event->untie("modifier/alt");
 }
 
 void 
@@ -204,6 +219,16 @@ FGInput::doKey (int k, int modifiers, int x, int y)
     return;
   }
 
+  _key_code = k;
+  _key_modifiers = modifiers & ~KEYMOD_RELEASED;
+  _key_pressed = bool(!(modifiers & KEYMOD_RELEASED));
+  _key_shift = bool(modifiers & KEYMOD_SHIFT);
+  _key_ctrl = bool(modifiers & KEYMOD_CTRL);
+  _key_alt = bool(modifiers & KEYMOD_ALT);
+  _key_event->fireValueChanged();
+  if (!_key_code)
+      return;
+
   button &b = _key_bindings[k];
 
                                 // Key pressed.
@@ -227,23 +252,6 @@ FGInput::doKey (int k, int modifiers, int x, int y)
       for (unsigned int i = 0; i < bindings.size(); i++)
         bindings[i]->fire();
       b.last_state = 0;
-    } else {
-      if (k >= 1 && k <= 26) {
-        if (_key_bindings[k + '@'].last_state)
-          doKey(k + '@', KEYMOD_RELEASED, x, y);
-        if (_key_bindings[k + '`'].last_state)
-          doKey(k + '`', KEYMOD_RELEASED, x, y);
-      } else if (k >= 'A' && k <= 'Z') {
-        if (_key_bindings[k - '@'].last_state)
-          doKey(k - '@', KEYMOD_RELEASED, x, y);
-        if (_key_bindings[tolower(k)].last_state)
-          doKey(tolower(k), KEYMOD_RELEASED, x, y);
-      } else if (k >= 'a' && k <= 'z') {
-        if (_key_bindings[k - '`'].last_state)
-          doKey(k - '`', KEYMOD_RELEASED, x, y);
-        if (_key_bindings[toupper(k)].last_state)
-          doKey(toupper(k), KEYMOD_RELEASED, x, y);
-      }
     }
   }
 }
index a9dd5303f23c5a22025107ceba17944a2629fdcb..3b3803e9fe7877100dd4ce4ee80b48dc6a38325d 100644 (file)
@@ -328,6 +328,17 @@ private:
    * List of currently pressed mouse button events
    */
   std::map<int, std::list<SGSharedPtr<SGPickCallback> > > _activePickCallbacks;
+
+  /**
+   * Key listener interface.
+   */
+  SGPropertyNode_ptr _key_event;
+  int  _key_code;
+  int  _key_modifiers;
+  bool _key_pressed;
+  bool _key_ctrl;
+  bool _key_alt;
+  bool _key_shift;
 };
 
 #endif // _INPUT_HXX
index 058641981b68b29451e18a58f7c3948b36f39a20..bf6935de481928adfb7569123ae42f14873b91db 100644 (file)
@@ -276,5 +276,24 @@ void FGManipulator::handleKey(const osgGA::GUIEventAdapter& ea, int& key,
     currentModifiers = modifiers;
     if (eventType == osgGA::GUIEventAdapter::KEYUP)
        modifiers |= KEYMOD_RELEASED;
+
+    // Release the letter key, for which the keypress was reported
+    if (key >= 0 && key < int(sizeof(release_keys))) {
+        if (modifiers & KEYMOD_RELEASED) {
+            key = release_keys[key];
+        } else {
+            release_keys[key] = key;
+            if (key >= 1 && key <= 26) {
+                release_keys[key + '@'] = key;
+                release_keys[key + '`'] = key;
+            } else if (key >= 'A' && key <= 'Z') {
+                release_keys[key - '@'] = key;
+                release_keys[tolower(key)] = key;
+            } else if (key >= 'a' && key <= 'z') {
+                release_keys[key - '`'] = key;
+                release_keys[toupper(key)] = key;
+            }
+        }
+    }
 }
 
index 4ad190d19ae6f09345319032957acf283c9f5f1a..edfcd9f3de40108ead97e22a945742c8bc736cd3 100644 (file)
@@ -139,5 +139,6 @@ protected:
     bool mouseWarped;
     // workaround for osgViewer double scroll events
     bool scrollButtonPressed;
+    int release_keys[128];
 };
 #endif
index a9fcf86c9ad358e5188fc6c2a40bc66f922b0eff..acff231dc2aabe23664aff240a3406de4ccdeb45 100644 (file)
@@ -105,15 +105,28 @@ static void GLUTspecialkey(int k, int x, int y)
     callKeyHandler(256 + k, fgGetKeyModifiers(), x, y);
 }
 
+static unsigned char release_keys[256];
+
 static void GLUTkeyup(unsigned char k, int x, int y)
 {
     GlutModifiers = glutGetModifiers();
-    callKeyHandler(k, fgGetKeyModifiers() | KEYMOD_RELEASED, x, y);
+    callKeyHandler(release_keys[k], fgGetKeyModifiers() | KEYMOD_RELEASED, x, y);
 }
 
 static void GLUTkey(unsigned char k, int x, int y)
 {
     GlutModifiers = glutGetModifiers();
+    release_keys[k] = k;
+    if (k >= 1 && k <= 26) {
+        release_keys[k + '@'] = k;
+        release_keys[k + '`'] = k;
+    } else if (k >= 'A' && k <= 'Z') {
+        release_keys[k - '@'] = k;
+        release_keys[tolower(k)] = k;
+    } else if (k >= 'a' && k <= 'z') {
+        release_keys[k - '`'] = k;
+        release_keys[toupper(k)] = k;
+    }
     callKeyHandler(k, fgGetKeyModifiers(), x, y);
 }
 
index 7917832075409f7473ffa640c15a00a1ac243957..81f2e4c5a0a8dede19c15a20f523775be400cf3e 100644 (file)
@@ -184,10 +184,8 @@ static void handleKey(int key, int raw, int keyup)
 
     if(modmask == 0 && KeyHandler) {
         if (keymod & KEYMOD_RELEASED) {
-            if (keys[raw].mod) {
-                key = keys[raw].unicode;
-                keys[raw].mod = 0;
-            }
+            key = keys[raw].unicode;
+
         } else {
             keys[raw].mod = keymod;
             keys[raw].unicode = key;