|
@@ -1,9 +1,16 @@
|
|
import abc
|
|
import abc
|
|
import logging
|
|
import logging
|
|
|
|
+import random
|
|
|
|
+import time
|
|
import typing
|
|
import typing
|
|
|
|
|
|
import Xlib.protocol.event
|
|
import Xlib.protocol.event
|
|
import Xlib.X
|
|
import Xlib.X
|
|
|
|
+import Xlib.XK
|
|
|
|
+
|
|
|
|
+_XKEYEVENT_TYPE = typing.Union[
|
|
|
|
+ Xlib.protocol.event.KeyPress, Xlib.protocol.event.KeyRelease
|
|
|
|
+]
|
|
|
|
|
|
|
|
|
|
class EngineAction:
|
|
class EngineAction:
|
|
@@ -14,19 +21,13 @@ class EngineAction:
|
|
def execute_on_window(
|
|
def execute_on_window(
|
|
self,
|
|
self,
|
|
overlay: "rescriptoon.Overlay",
|
|
overlay: "rescriptoon.Overlay",
|
|
- xkeyevent: typing.Union[
|
|
+ xkeyevent: _XKEYEVENT_TYPE,
|
|
- Xlib.protocol.event.KeyPress, Xlib.protocol.event.KeyRelease
|
|
|
|
- ],
|
|
|
|
engine_window: "Xlib.display.Window",
|
|
engine_window: "Xlib.display.Window",
|
|
):
|
|
):
|
|
raise NotImplementedError()
|
|
raise NotImplementedError()
|
|
|
|
|
|
def execute(
|
|
def execute(
|
|
- self,
|
|
+ self, overlay: "rescriptoon.Overlay", xkeyevent: _XKEYEVENT_TYPE,
|
|
- overlay: "rescriptoon.Overlay",
|
|
|
|
- xkeyevent: typing.Union[
|
|
|
|
- Xlib.protocol.event.KeyPress, Xlib.protocol.event.KeyRelease
|
|
|
|
- ],
|
|
|
|
):
|
|
):
|
|
if self._target_engine_index is None:
|
|
if self._target_engine_index is None:
|
|
for target_window in overlay.engine_windows:
|
|
for target_window in overlay.engine_windows:
|
|
@@ -49,9 +50,7 @@ class CenterClickAction(EngineAction):
|
|
def execute_on_window(
|
|
def execute_on_window(
|
|
self,
|
|
self,
|
|
overlay: "rescriptoon.Overlay",
|
|
overlay: "rescriptoon.Overlay",
|
|
- xkeyevent: typing.Union[
|
|
+ xkeyevent: _XKEYEVENT_TYPE,
|
|
- Xlib.protocol.event.KeyPress, Xlib.protocol.event.KeyRelease
|
|
|
|
- ],
|
|
|
|
engine_window: "Xlib.display.Window",
|
|
engine_window: "Xlib.display.Window",
|
|
):
|
|
):
|
|
engine_geometry = engine_window.get_geometry()
|
|
engine_geometry = engine_window.get_geometry()
|
|
@@ -93,6 +92,31 @@ class SelectGagAction(CenterClickAction):
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
+def _send_rewritten_xkeyevent(
|
|
|
|
+ event_template: _XKEYEVENT_TYPE,
|
|
|
|
+ window: "Xlib.display.Window",
|
|
|
|
+ event_type: typing.Optional[typing.Type] = None,
|
|
|
|
+ keycode=None,
|
|
|
|
+) -> _XKEYEVENT_TYPE:
|
|
|
|
+ if not event_type:
|
|
|
|
+ event_type = type(event_template)
|
|
|
|
+ window.send_event(
|
|
|
|
+ event_type(
|
|
|
|
+ window=window,
|
|
|
|
+ detail=keycode if keycode else event_template.detail,
|
|
|
|
+ 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,
|
|
|
|
+ same_screen=event_template.same_screen,
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+
|
|
class RewriteKeyEventAction(EngineAction):
|
|
class RewriteKeyEventAction(EngineAction):
|
|
def __init__(self, target_engine_index: typing.Optional[int] = None, keysym=None):
|
|
def __init__(self, target_engine_index: typing.Optional[int] = None, keysym=None):
|
|
super().__init__(target_engine_index=target_engine_index,)
|
|
super().__init__(target_engine_index=target_engine_index,)
|
|
@@ -101,27 +125,41 @@ class RewriteKeyEventAction(EngineAction):
|
|
def execute_on_window(
|
|
def execute_on_window(
|
|
self,
|
|
self,
|
|
overlay: "rescriptoon.Overlay",
|
|
overlay: "rescriptoon.Overlay",
|
|
- xkeyevent: typing.Union[
|
|
+ xkeyevent: _XKEYEVENT_TYPE,
|
|
- Xlib.protocol.event.KeyPress, Xlib.protocol.event.KeyRelease
|
|
|
|
- ],
|
|
|
|
engine_window: "Xlib.display.Window",
|
|
engine_window: "Xlib.display.Window",
|
|
):
|
|
):
|
|
- engine_window.send_event(
|
|
+ _send_rewritten_xkeyevent(
|
|
- type(xkeyevent)(
|
|
+ event_template=xkeyevent,
|
|
- window=engine_window,
|
|
+ window=engine_window,
|
|
- detail=overlay.xdisplay.keysym_to_keycode(self._keysym)
|
|
+ keycode=overlay.xdisplay.keysym_to_keycode(self._keysym),
|
|
- if self._keysym
|
|
+ )
|
|
- else xkeyevent.detail,
|
|
+
|
|
- state=xkeyevent.state,
|
|
+
|
|
- root_x=xkeyevent.root_x,
|
|
+class LowThrowAction(EngineAction):
|
|
- root_y=xkeyevent.root_y,
|
|
+
|
|
- event_x=xkeyevent.event_x,
|
|
+ _THROW_KEYSYM = Xlib.XK.XK_Delete
|
|
- event_y=xkeyevent.event_y,
|
|
+
|
|
- child=xkeyevent.child,
|
|
+ def execute_on_window(
|
|
- root=xkeyevent.root,
|
|
+ self,
|
|
- time=xkeyevent.time,
|
|
+ overlay: "rescriptoon.Overlay",
|
|
- same_screen=xkeyevent.same_screen,
|
|
+ xkeyevent: _XKEYEVENT_TYPE,
|
|
- )
|
|
+ engine_window: "Xlib.display.Window",
|
|
|
|
+ ):
|
|
|
|
+ if isinstance(xkeyevent, Xlib.protocol.event.KeyRelease):
|
|
|
|
+ return
|
|
|
|
+ keycode = overlay.xdisplay.keysym_to_keycode(self._THROW_KEYSYM)
|
|
|
|
+ _send_rewritten_xkeyevent(
|
|
|
|
+ event_template=xkeyevent,
|
|
|
|
+ window=engine_window,
|
|
|
|
+ keycode=keycode,
|
|
|
|
+ event_type=Xlib.protocol.event.KeyPress,
|
|
|
|
+ )
|
|
|
|
+ time.sleep(random.uniform(0.04, 0.08))
|
|
|
|
+ _send_rewritten_xkeyevent(
|
|
|
|
+ event_template=xkeyevent,
|
|
|
|
+ window=engine_window,
|
|
|
|
+ keycode=keycode,
|
|
|
|
+ event_type=Xlib.protocol.event.KeyRelease,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|