actions.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 RewriteKeyEventAction:
  37. def __init__(self, keysym=None):
  38. self._keysym = keysym
  39. def execute(self, extended_controls, xkeyevent):
  40. ev = type(xkeyevent)(
  41. window=extended_controls.engine_window,
  42. detail=extended_controls.xdisplay.keysym_to_keycode(self._keysym)
  43. if self._keysym else xkeyevent.detail,
  44. state=xkeyevent.state,
  45. root_x=xkeyevent.root_x,
  46. root_y=xkeyevent.root_y,
  47. event_x=xkeyevent.event_x,
  48. event_y=xkeyevent.event_y,
  49. child=xkeyevent.child,
  50. root=xkeyevent.root,
  51. time=xkeyevent.time, # X.CurrentTime
  52. same_screen=xkeyevent.same_screen,
  53. )
  54. extended_controls.engine_window.send_event(ev)
  55. class ForwardKeyEventAction(RewriteKeyEventAction):
  56. def __init__(self):
  57. super().__init__(keysym=None)
  58. class ToggleExtendedControlsAction:
  59. def execute(self, extended_controls, xkeyevent):
  60. if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
  61. extended_controls.toggle()