keyboard.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import traceback
  2. from typing import Callable, Dict, Optional
  3. from ..events import KeyboardAction, KeyboardKey, KeyboardModifiers, KeyEventArguments, handle_event
  4. from .custom_view import CustomView
  5. from .element import Element
  6. CustomView.use(__file__)
  7. class KeyboardView(CustomView):
  8. def __init__(self, on_key: Callable, repeating: bool):
  9. super().__init__('keyboard', active_js_events=['keydown', 'keyup', 'keypress'], repeating=repeating)
  10. self.allowed_events = ['keyboardEvent']
  11. self.style = 'display: none'
  12. self.initialize(temp=False, on_keyboardEvent=on_key)
  13. class Keyboard(Element):
  14. def __init__(self, *, on_key: Optional[Callable] = None, active: bool = True, repeating: bool = True):
  15. """
  16. Keyboard
  17. Adds global keyboard event tracking.
  18. :param on_key: callback to be executed when keyboard events occur.
  19. :param active: boolean flag indicating whether the callback should be executed or not (default: `True`)
  20. :param repeating: boolean flag indicating whether held keys should be sent repeatedly (default: `True`)
  21. """
  22. super().__init__(KeyboardView(on_key=self.handle_key, repeating=repeating))
  23. self.active = active
  24. self.key_handler = on_key
  25. def handle_key(self, msg: Dict) -> Optional[bool]:
  26. if not self.active:
  27. return False
  28. try:
  29. action = KeyboardAction(
  30. keypress=msg.key_data.action == 'keypress',
  31. keydown=msg.key_data.action == 'keydown',
  32. keyup=msg.key_data.action == 'keyup',
  33. repeat=msg.key_data.repeat,
  34. )
  35. modifiers = KeyboardModifiers(
  36. alt=msg.key_data.altKey,
  37. ctrl=msg.key_data.ctrlKey,
  38. meta=msg.key_data.metaKey,
  39. shift=msg.key_data.shiftKey,
  40. )
  41. key = KeyboardKey(
  42. name=msg.key_data.key,
  43. code=msg.key_data.code,
  44. location=msg.key_data.location,
  45. )
  46. arguments = KeyEventArguments(
  47. sender=self,
  48. socket=msg.websocket,
  49. action=action,
  50. modifiers=modifiers,
  51. key=key
  52. )
  53. return handle_event(self.key_handler, arguments)
  54. except Exception:
  55. traceback.print_exc()