event.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from collections import namedtuple
  2. import zmq
  3. from . import serial
  4. from .api import Api
  5. def make_sub_socket(addr="localhost", port=9485):
  6. context = zmq.Context()
  7. socket = context.socket(zmq.SUB)
  8. socket.setsockopt(zmq.SUBSCRIBE, b'')
  9. socket.connect(f"tcp://{addr}:{port}")
  10. return socket
  11. KeyMods = namedtuple("KeyMods", ["shift", "ctrl", "alt", "logo"])
  12. class EventLoop:
  13. """Subscribes to scene-graph signals over the netdebug PUB socket and
  14. dispatches them to overridable handlers. Register extra slots in a
  15. subclass constructor via self.register_slot()."""
  16. def __init__(self, api, addr="localhost"):
  17. self.api = api
  18. self.subsock = make_sub_socket(addr)
  19. self.register_slot("/window/input/keyboard", "key_down", b"kd")
  20. def register_slot(self, node_path, sig, tag):
  21. self.api.register_slot(node_path, sig, "", tag)
  22. def run(self):
  23. while True:
  24. signal_data, user_data = self.subsock.recv_multipart()
  25. cur = serial.Cursor(signal_data)
  26. match user_data:
  27. case b"kd":
  28. shift = bool(serial.read_u8(cur))
  29. ctrl = bool(serial.read_u8(cur))
  30. alt = bool(serial.read_u8(cur))
  31. logo = bool(serial.read_u8(cur))
  32. repeat = bool(serial.read_u8(cur))
  33. keycode = serial.decode_str(cur)
  34. keymods = KeyMods(shift, ctrl, alt, logo)
  35. # Sometimes these get stuck when exiting the window.
  36. # We don't need these anyway
  37. if keycode in ("LeftShift", "LeftSuper"):
  38. continue
  39. self.key_down(keycode, keymods, repeat)
  40. def key_down(self, keycode, keymods, repeat):
  41. pass