actions.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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+smaller_dimension*self._factor_x),
  19. event_y=int(engine_geometry.height/2+smaller_dimension*self._factor_y),
  20. # apparently root_x & root_y do not need to correspond with event_x/y.
  21. # attributes are still required to be set.
  22. root_x=0, # xkeyevent.root_x,
  23. root_y=0, # xkeyevent.root_y,
  24. child=xkeyevent.child,
  25. root=xkeyevent.root,
  26. time=xkeyevent.time, # X.CurrentTime
  27. same_screen=xkeyevent.same_screen,
  28. )
  29. if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
  30. e = Xlib.protocol.event.ButtonPress(**attr)
  31. else:
  32. e = Xlib.protocol.event.ButtonRelease(**attr)
  33. extended_controls.engine_window.send_event(e)
  34. class RewriteKeyEventAction:
  35. def __init__(self, keysym=None):
  36. self._keysym = keysym
  37. def execute(self, extended_controls, xkeyevent):
  38. ev = type(xkeyevent)(
  39. window=extended_controls.engine_window,
  40. detail=extended_controls.xdisplay.keysym_to_keycode(self._keysym)
  41. if self._keysym else xkeyevent.detail,
  42. state=xkeyevent.state,
  43. root_x=xkeyevent.root_x,
  44. root_y=xkeyevent.root_y,
  45. event_x=xkeyevent.event_x,
  46. event_y=xkeyevent.event_y,
  47. child=xkeyevent.child,
  48. root=xkeyevent.root,
  49. time=xkeyevent.time, # X.CurrentTime
  50. same_screen=xkeyevent.same_screen,
  51. )
  52. extended_controls.engine_window.send_event(ev)
  53. class ForwardKeyEventAction(RewriteKeyEventAction):
  54. def __init__(self):
  55. super().__init__(keysym=None)
  56. class ToggleExtendedControlsAction:
  57. def execute(self, extended_controls, xkeyevent):
  58. if isinstance(xkeyevent, Xlib.protocol.event.KeyPress):
  59. extended_controls.toggle()