actions.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. try:
  2. import Xlib.X
  3. import Xlib.protocol.event
  4. except ImportError:
  5. pass
  6. class SelectGagAction:
  7. def __init__(self, factor_x, factor_y):
  8. self._button = Xlib.X.Button1
  9. self._factor_x = factor_x
  10. self._factor_y = factor_y
  11. def execute(self, extended_controls, xkeyevent):
  12. engine_geometry = extended_controls._engine_window.get_geometry()
  13. smaller_dimension = min(engine_geometry.width, engine_geometry.height)
  14. attr = dict(
  15. window=extended_controls.engine_window,
  16. detail=self._button,
  17. state=xkeyevent.state,
  18. event_x=int(engine_geometry.width / 2
  19. + smaller_dimension * self._factor_x),
  20. event_y=int(engine_geometry.height / 2
  21. + smaller_dimension * self._factor_y),
  22. # apparently root_x & root_y do not need to correspond with event_x/y.
  23. # attributes are still required to be set.
  24. root_x=0, # xkeyevent.root_x,
  25. root_y=0, # xkeyevent.root_y,
  26. child=xkeyevent.child,
  27. root=xkeyevent.root,
  28. time=xkeyevent.time, # X.CurrentTime
  29. same_screen=xkeyevent.same_screen,
  30. )
  31. if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
  32. e = Xlib.protocol.event.ButtonPress(**attr)
  33. else:
  34. e = Xlib.protocol.event.ButtonRelease(**attr)
  35. extended_controls.engine_window.send_event(e)
  36. class TargetEngine:
  37. Primary = 1 << 0
  38. NonPrimary = 1 << 1
  39. All = Primary | NonPrimary
  40. class RewriteKeyEventAction:
  41. def __init__(self, keysym=None, target_engine=TargetEngine.Primary):
  42. self._keysym = keysym
  43. self._target_engine = target_engine
  44. @staticmethod
  45. def _send_event(event_template, keycode, target_window):
  46. target_window.send_event(type(event_template)(
  47. window=target_window,
  48. detail=keycode,
  49. state=event_template.state,
  50. root_x=event_template.root_x,
  51. root_y=event_template.root_y,
  52. event_x=event_template.event_x,
  53. event_y=event_template.event_y,
  54. child=event_template.child,
  55. root=event_template.root,
  56. time=event_template.time, # X.CurrentTime
  57. same_screen=event_template.same_screen,
  58. ))
  59. def execute(self, extended_controls, xkeyevent):
  60. defaults = dict(
  61. keycode=extended_controls.xdisplay.keysym_to_keycode(self._keysym)
  62. if self._keysym else xkeyevent.detail,
  63. event_template=xkeyevent,
  64. )
  65. if self._target_engine & TargetEngine.Primary:
  66. self._send_event(
  67. target_window=extended_controls.engine_window,
  68. **defaults,
  69. )
  70. if self._target_engine & TargetEngine.NonPrimary:
  71. for win in extended_controls.other_engine_windows:
  72. self._send_event(target_window=win, **defaults)
  73. class ForwardKeyEventAction(RewriteKeyEventAction):
  74. def __init__(self):
  75. super().__init__(keysym=None)
  76. class ToggleExtendedControlsAction:
  77. def execute(self, extended_controls, xkeyevent):
  78. if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
  79. extended_controls.toggle()