Browse Source

x11: fix raw button events for dead keys

rdb 5 years ago
parent
commit
329abe2b3e

+ 33 - 54
panda/src/x11display/x11GraphicsWindow.cxx

@@ -309,10 +309,6 @@ process_events() {
   bool changed_properties = false;
   bool changed_properties = false;
 
 
   while (XCheckIfEvent(_display, &event, check_event, (char *)this)) {
   while (XCheckIfEvent(_display, &event, check_event, (char *)this)) {
-    if (XFilterEvent(&event, None)) {
-      continue;
-    }
-
     if (got_keyrelease_event) {
     if (got_keyrelease_event) {
       // If a keyrelease event is immediately followed by a matching keypress
       // If a keyrelease event is immediately followed by a matching keypress
       // event, that's just key repeat and we should treat the two events
       // event, that's just key repeat and we should treat the two events
@@ -323,22 +319,42 @@ process_events() {
       if (event.type == KeyPress &&
       if (event.type == KeyPress &&
           event.xkey.keycode == keyrelease_event.keycode &&
           event.xkey.keycode == keyrelease_event.keycode &&
           (event.xkey.time - keyrelease_event.time <= 1)) {
           (event.xkey.time - keyrelease_event.time <= 1)) {
-        // In particular, we only generate down messages for the repeated
-        // keys, not down-and-up messages.
-        handle_keystroke(event.xkey);
-
-        // We thought about not generating the keypress event, but we need
-        // that repeat for backspace.  Rethink later.
-        handle_keyrepeat(event.xkey);
+        if (!XFilterEvent(&event, None)) {
+          // In particular, we only generate down messages for the repeated
+          // keys, not down-and-up messages.
+          handle_keystroke(event.xkey);
+
+          // We thought about not generating the keypress event, but we need
+          // that repeat for backspace.  Rethink later.
+          handle_keypress(event.xkey);
+        }
         continue;
         continue;
 
 
       } else {
       } else {
         // This keyrelease event is not immediately followed by a matching
         // This keyrelease event is not immediately followed by a matching
         // keypress event, so it's a genuine release.
         // keypress event, so it's a genuine release.
+        ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
+        if (raw_button != ButtonHandle::none()) {
+          _input->raw_button_up(raw_button);
+        }
+
         handle_keyrelease(keyrelease_event);
         handle_keyrelease(keyrelease_event);
       }
       }
     }
     }
 
 
+    // Send out a raw key press event before we do XFilterEvent, which will
+    // filter out dead keys and such.
+    if (event.type == KeyPress) {
+      ButtonHandle raw_button = map_raw_button(event.xkey.keycode);
+      if (raw_button != ButtonHandle::none()) {
+        _input->raw_button_down(raw_button);
+      }
+    }
+
+    if (XFilterEvent(&event, None)) {
+      continue;
+    }
+
     ButtonHandle button;
     ButtonHandle button;
 
 
     switch (event.type) {
     switch (event.type) {
@@ -545,6 +561,11 @@ process_events() {
   if (got_keyrelease_event) {
   if (got_keyrelease_event) {
     // This keyrelease event is not immediately followed by a matching
     // This keyrelease event is not immediately followed by a matching
     // keypress event, so it's a genuine release.
     // keypress event, so it's a genuine release.
+    ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
+    if (raw_button != ButtonHandle::none()) {
+      _input->raw_button_up(raw_button);
+    }
+
     handle_keyrelease(keyrelease_event);
     handle_keyrelease(keyrelease_event);
   }
   }
 }
 }
@@ -1490,41 +1511,6 @@ handle_keypress(XKeyEvent &event) {
     }
     }
     _input->button_down(button);
     _input->button_down(button);
   }
   }
-
-  if (event.keycode >= 9 && event.keycode <= 135) {
-    ButtonHandle raw_button = map_raw_button(event.keycode);
-    if (raw_button != ButtonHandle::none()) {
-      _input->raw_button_down(raw_button);
-    }
-  }
-}
-
-/**
- * Generates a keyrepeat corresponding to the indicated X KeyPress event.
- */
-void x11GraphicsWindow::
-handle_keyrepeat(XKeyEvent &event) {
-  if (_properties.get_mouse_mode() != WindowProperties::M_relative) {
-    _input->set_pointer_in_window(event.x, event.y);
-  }
-
-  // Now get the raw unshifted button.
-  ButtonHandle button = get_button(event, false);
-  if (button != ButtonHandle::none()) {
-    if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) {
-      _input->button_down(KeyboardButton::control());
-    }
-    if (button == KeyboardButton::lshift() || button == KeyboardButton::rshift()) {
-      _input->button_down(KeyboardButton::shift());
-    }
-    if (button == KeyboardButton::lalt() || button == KeyboardButton::ralt()) {
-      _input->button_down(KeyboardButton::alt());
-    }
-    if (button == KeyboardButton::lmeta() || button == KeyboardButton::rmeta()) {
-      _input->button_down(KeyboardButton::meta());
-    }
-    _input->button_down(button);
-  }
 }
 }
 
 
 /**
 /**
@@ -1553,13 +1539,6 @@ handle_keyrelease(XKeyEvent &event) {
     }
     }
     _input->button_up(button);
     _input->button_up(button);
   }
   }
-
-  if (event.keycode >= 9 && event.keycode <= 135) {
-    ButtonHandle raw_button = map_raw_button(event.keycode);
-    if (raw_button != ButtonHandle::none()) {
-      _input->raw_button_up(raw_button);
-    }
-  }
 }
 }
 
 
 /**
 /**
@@ -1986,7 +1965,7 @@ map_raw_button(KeyCode key) const {
   // In any case, this means we can use the same mapping as our raw
   // In any case, this means we can use the same mapping as our raw
   // input code, which uses evdev directly.
   // input code, which uses evdev directly.
   int index = key - 8;
   int index = key - 8;
-  if (index >= 0) {
+  if (index > 0 && index < 128) {
     return EvdevInputDevice::map_button(index);
     return EvdevInputDevice::map_button(index);
   }
   }
 #endif
 #endif

+ 0 - 1
panda/src/x11display/x11GraphicsWindow.h

@@ -59,7 +59,6 @@ protected:
   virtual void setup_colormap(XVisualInfo *visual);
   virtual void setup_colormap(XVisualInfo *visual);
   void handle_keystroke(XKeyEvent &event);
   void handle_keystroke(XKeyEvent &event);
   void handle_keypress(XKeyEvent &event);
   void handle_keypress(XKeyEvent &event);
-  void handle_keyrepeat(XKeyEvent &event);
   void handle_keyrelease(XKeyEvent &event);
   void handle_keyrelease(XKeyEvent &event);
 
 
   ButtonHandle get_button(XKeyEvent &key_event, bool allow_shift);
   ButtonHandle get_button(XKeyEvent &key_event, bool allow_shift);