Browse Source

extended controls: map space -> jump, all engine windows

Fabian Peter Hammerle 7 years ago
parent
commit
eadb0df879
3 changed files with 63 additions and 29 deletions
  1. 10 9
      README.md
  2. 35 14
      tooncher/actions.py
  3. 18 6
      tooncher/controls.py

+ 10 - 9
README.md

@@ -74,12 +74,13 @@ $ tooncher --cpu-limit 70 cfo
 
 ## Extended Controls Default Mappings
 
-| Key | Action                          |
-| --- | ------------------------------- |
-| `   | turn Extended Controls on / off |
-| w   | walk forward                    |
-| s   | walk backward                   |
-| a   | turn left                       |
-| d   | turn right                      |
-| e   | select elephant trunk in battle |
-| f   | select fog in battle            |
+| Key   | Action                          | Target Window |
+| ----- | ------------------------------- | ------------- |
+| `     | turn Extended Controls on / off |               |
+| w     | walk forward                    | primary       |
+| s     | walk backward                   | primary       |
+| a     | turn left                       | primary       |
+| d     | turn right                      | primary       |
+| space | jump                            | all           |
+| e     | select elephant trunk in battle | primary       |
+| f     | select fog in battle            | primary       |

+ 35 - 14
tooncher/actions.py

@@ -39,27 +39,48 @@ class SelectGagAction:
         extended_controls.engine_window.send_event(e)
 
 
+class TargetEngine:
+    Primary = 1 << 0
+    Others = 1 << 1
+    All = Primary | Others
+
+
 class RewriteKeyEventAction:
 
-    def __init__(self, keysym=None):
+    def __init__(self, keysym=None, target_engine=TargetEngine.Primary):
         self._keysym = keysym
+        self._target_engine = target_engine
+
+    @staticmethod
+    def _send_event(event_template, keycode, target_window):
+        target_window.send_event(type(event_template)(
+            window=target_window,
+            detail=keycode,
+            state=event_template.state,
+            root_x=event_template.root_x,
+            root_y=event_template.root_y,
+            event_x=event_template.event_x,
+            event_y=event_template.event_y,
+            child=event_template.child,
+            root=event_template.root,
+            time=event_template.time,  # X.CurrentTime
+            same_screen=event_template.same_screen,
+        ))
 
     def execute(self, extended_controls, xkeyevent):
-        ev = type(xkeyevent)(
-            window=extended_controls.engine_window,
-            detail=extended_controls.xdisplay.keysym_to_keycode(self._keysym)
+        defaults = dict(
+            keycode=extended_controls.xdisplay.keysym_to_keycode(self._keysym)
                 if self._keysym else 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,
+            event_template=xkeyevent,
         )
-        extended_controls.engine_window.send_event(ev)
+        if self._target_engine & TargetEngine.Primary:
+            self._send_event(
+                target_window=extended_controls.engine_window,
+                **defaults,
+            )
+        if self._target_engine & TargetEngine.Others:
+            for win in extended_controls.find_other_engine_windows():
+                self._send_event(target_window=win, **defaults)
 
 
 class ForwardKeyEventAction(RewriteKeyEventAction):

+ 18 - 6
tooncher/controls.py

@@ -13,6 +13,7 @@ except ImportError:
     Xlib = False
 
 EXTENDED_CONTROLS_DEFAULT_TOGGLE_KEYSYM_NAME = 'grave'
+TOONTOWN_WINDOW_NAME = 'Toontown Rewritten'
 
 if Xlib:
     EXTENDED_CONTROLS_DEFAULT_KEYSYM_MAPPINGS = {
@@ -20,8 +21,12 @@ if Xlib:
         XK.XK_a: RewriteKeyEventAction(keysym=XK.XK_Left),
         XK.XK_s: RewriteKeyEventAction(keysym=XK.XK_Down),
         XK.XK_d: RewriteKeyEventAction(keysym=XK.XK_Right),
-        XK.XK_e: SelectGagAction(factor_x=0.038, factor_y=-0.047), # elephant trunk
-        XK.XK_f: SelectGagAction(factor_x=0.119, factor_y=-0.047), # foghorn
+        XK.XK_space: RewriteKeyEventAction(
+            keysym=XK.XK_Control_L,
+            target_engine=TargetEngine.All,
+        ),
+        XK.XK_e: SelectGagAction(factor_x=0.038, factor_y=-0.047),  # elephant trunk
+        XK.XK_f: SelectGagAction(factor_x=0.119, factor_y=-0.047),  # foghorn
     }
 
 
@@ -48,10 +53,10 @@ def x_wait_for_event(xdisplay, timeout_seconds):
         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]
+        [xdisplay.display.socket],  # rlist
+        [],  # wlist
+        [],  # xlist
+        timeout_seconds,  # timeout [seconds]
     )[0]
     return len(rlist) > 0
 
@@ -195,3 +200,10 @@ class ExtendedControls:
 
     def _ungrab_key(self, keycode):
         self._engine_window.ungrab_key(keycode, X.AnyModifier)
+
+    def find_other_engine_windows(self):
+        return x_find_window(
+            self.xdisplay.screen().root,
+            lambda w: w.get_wm_name() == TOONTOWN_WINDOW_NAME
+                    and w.id != self.engine_window.id,
+        )