Bladeren bron

ExtendedControls.run main loop: added timeout when waiting for a xevent
to be queued

https://gist.github.com/fphammerle/d81ca3ff0a169f062a9f28e57b18f04d

Fabian Peter Hammerle 6 jaren geleden
bovenliggende
commit
e74dd2e785
1 gewijzigde bestanden met toevoegingen van 19 en 3 verwijderingen
  1. 19 3
      tooncher/controls.py

+ 19 - 3
tooncher/controls.py

@@ -1,4 +1,5 @@
 import copy
+import select
 import time
 from tooncher.actions import *
 try:
@@ -40,6 +41,19 @@ def x_find_window_by_pid(display, pid):
     return x_find_window(display.screen().root, filter_callback)
 
 
+def x_wait_for_event(xdisplay, timeout_seconds):
+    """ Wait up to `timeout_seconds` seconds for a xevent.
+        Return True, if a xevent is available.
+        Return False, if the timeout was reached. """
+    rlist = select.select(
+        [xdisplay.display.socket], # rlist
+        [], # wlist
+        [], # xlist
+        timeout_seconds, # timeout [seconds]
+    )[0]
+    return len(rlist) > 0
+
+
 class ExtendedControls:
 
     def __init__(self, engine_pid,
@@ -72,7 +86,8 @@ class ExtendedControls:
         if self._toggle_keysym in self._keysym_mappings:
             print("INFO Extended Controls:"
                   + " Ignoring mapping for toggle key '{}'".format(toggle_keysym_name))
-        self._keysym_mappings[self._toggle_keysym] = ToggleExtendedControlsAction()
+        self._keysym_mappings[self._toggle_keysym] \
+            = ToggleExtendedControlsAction()
         self._default_action = ForwardKeyEventAction()
         self._engine_window = None
         self._enabled = False
@@ -114,8 +129,9 @@ class ExtendedControls:
             print("INFO Extended Controls are currently disabled."
                   + " Press key '{}' to enable.".format(keysym_name))
         while self.engine_running:
-            # TODO don't block here, engine might have already been stopped
-            self._handle_xevent(self._xdisplay.next_event())
+            while self.xdisplay.pending_events():
+                self._handle_xevent(self._xdisplay.next_event())
+            x_wait_for_event(self.xdisplay, timeout_seconds=1)
 
     def _handle_xevent(self, xevent):
         # TODO investigate why some release events get lost