Преглед изворни кода

extended controls: implemented workaround for 'missed key release event' bug

Fabian Peter Hammerle пре 6 година
родитељ
комит
36df6ea80f
1 измењених фајлова са 18 додато и 1 уклоњено
  1. 18 1
      tooncher/controls.py

+ 18 - 1
tooncher/controls.py

@@ -157,7 +157,9 @@ class ExtendedControls:
             while self.xdisplay.pending_events():
                 self._handle_xevent(self._xdisplay.next_event())
             self._check_active_key_registry()
-            x_wait_for_event(self.xdisplay, timeout_seconds=1)
+            # keep timeout low for _check_active_key_registry()
+            # to be called frequently
+            x_wait_for_event(self.xdisplay, timeout_seconds=0.05)
 
     def _handle_xevent(self, xevent):
         if isinstance(xevent, Xlib.protocol.event.KeyPress) \
@@ -258,3 +260,18 @@ class ExtendedControls:
         for keycode, press_event in self._active_key_registry.items():
             if not (1 << (keycode & ((1 << 3) - 1))) & keymap[keycode >> 3]:
                 print("WARN missed release event of key {}".format(keycode))
+                missed_releases.append(Xlib.protocol.event.KeyRelease(
+                    window=press_event.window,
+                    detail=press_event.detail,
+                    state=press_event.state,
+                    root_x=press_event.root_x,
+                    root_y=press_event.root_y,
+                    event_x=press_event.event_x,
+                    event_y=press_event.event_y,
+                    child=press_event.child,
+                    root=press_event.root,
+                    time=X.CurrentTime,
+                    same_screen=press_event.same_screen,
+                ))
+        for release_event in missed_releases:
+            self._handle_xkeyevent(release_event)