Bladeren bron

extended controls: introduced actions (tooncher/actions.py)

Fabian Peter Hammerle 6 jaren geleden
bovenliggende
commit
bc14a69614
2 gewijzigde bestanden met toevoegingen van 60 en 20 verwijderingen
  1. 44 0
      tooncher/actions.py
  2. 16 20
      tooncher/controls.py

+ 44 - 0
tooncher/actions.py

@@ -0,0 +1,44 @@
+try:
+    import Xlib.protocol.event
+except ImportError:
+    pass
+
+
+class RewriteKeyEventAction:
+
+    def __init__(self, keysym=None):
+        self._keysym = keysym
+
+    def execute(self, extended_controls, xkeyevent):
+        attr = dict(
+            window=extended_controls.engine_window,
+            detail=xkeyevent.detail,
+            state=xkeyevent.state,
+            root_x=xkeyevent.root_x,
+            root_y=xkeyevent.root_y,
+            event_x=xkeyevent.event_x,
+            event_y=xkeyevent.event_y,
+            child=xkeyevent.child,
+            root=xkeyevent.root,
+            time=xkeyevent.time,  # X.CurrentTime
+            same_screen=xkeyevent.same_screen,
+        )
+        if self._keysym:
+            attr['detail'] = extended_controls.xdisplay.keysym_to_keycode(
+                self._keysym)
+        extended_controls.engine_window.send_event(
+            type(xkeyevent)(**attr),
+        )
+
+
+class ForwardKeyEventAction(RewriteKeyEventAction):
+
+    def __init__(self):
+        super().__init__(keysym=None)
+
+
+class ToggleExtendedControlsAction:
+
+    def execute(self, extended_controls, xkeyevent):
+        if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
+            extended_controls.toggle()

+ 16 - 20
tooncher/controls.py

@@ -1,5 +1,6 @@
 import copy
 import time
+from tooncher.actions import *
 try:
     import psutil
 except ImportError:
@@ -80,6 +81,14 @@ class ExtendedControls:
     def engine_running(self):
         return psutil.pid_exists(self._engine_pid)
 
+    @property
+    def xdisplay(self):
+        return self._xdisplay
+
+    @property
+    def engine_window(self):
+        return self._engine_window
+
     def _wait_for_engine_window(self, timeout_seconds=20, search_interval_seconds=2):
         start_epoch = time.time()
         while self.engine_running and (time.time() - start_epoch) <= timeout_seconds:
@@ -115,32 +124,19 @@ class ExtendedControls:
             self._handle_xkeyevent(xevent)
 
     def _handle_xkeyevent(self, xkeyevent):
-        # TODO map keycodes instead of keysyms
         keysym_in = self._xdisplay.keycode_to_keysym(
             xkeyevent.detail,
             index=0,
         )
         if keysym_in == self._toggle_keysym:
-            if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
-                self.toggle()
+            action = ToggleExtendedControlsAction()
+        elif self.enabled and keysym_in in self._keysym_mappings:
+            action = RewriteKeyEventAction(
+                keysym=self._keysym_mappings[keysym_in],
+            )
         else:
-            if self.enabled and keysym_in in self._keysym_mappings:
-                keysym_out = self._keysym_mappings[keysym_in]
-            else:
-                keysym_out = keysym_in
-            self._engine_window.send_event(type(xkeyevent)(
-                window=self._engine_window,
-                detail=self._xdisplay.keysym_to_keycode(keysym_out),
-                state=0,
-                root_x=xkeyevent.root_x,
-                root_y=xkeyevent.root_y,
-                event_x=xkeyevent.event_x,
-                event_y=xkeyevent.event_y,
-                child=xkeyevent.child,
-                root=xkeyevent.root,
-                time=xkeyevent.time,  # X.CurrentTime
-                same_screen=xkeyevent.same_screen,
-            ))
+            action = ForwardKeyEventAction()
+        action.execute(self, xkeyevent)
 
     def enable(self):
         for keysym in self._keysym_mappings.keys():