home · contact · privacy
Refactor key input handling into proper keybindings mapping.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 30 May 2025 14:42:16 +0000 (16:42 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 30 May 2025 14:42:16 +0000 (16:42 +0200)
ircplom.py

index 227a814d458dd619b736d452eb0847f8a08f4110..6f5d3aefdfe5c56bdfdbb3478c09d78ee0777562 100755 (executable)
@@ -21,6 +21,11 @@ TIMEOUT_CONNECT = 5
 TIMEOUT_LOOP = 0.1
 INPUT_PROMPT = ':'
 
+KEYBINDINGS = {
+    'KEY_BACKSPACE': 'prompt_backspace',
+    'KEY_ENTER': 'prompt_enter'
+}
+
 IRCSPEC_LINE_SEPARATOR = b'\r\n'
 IRCSPEC_TAG_ESCAPES = ((r'\:', ';'),
                        (r'\s', ' '),
@@ -363,14 +368,10 @@ class TuiLoop(Loop):
         elif event.type_ == 'SEND':
             self._log_buffer += [f'---> {event.payload}']
             self._draw_log()
-        elif event.type_ == 'INPUT_PROMPT':
-            if event.payload[0] == 'ENTER' and self._prompt:
-                self.broadcast('PROMPT_COMMAND', self._prompt)
-                self._prompt = ''
-            elif event.payload[0] == 'BACKSPACE':
-                self._prompt = self._prompt[:-1]
-            elif event.payload[0] == 'CHARACTER':
-                self._prompt += event.payload[1]
+        elif event.type_ == 'KEYBINDING':
+            getattr(self, f'_kb__{event.payload}')()
+        elif event.type_ == 'INPUT_CHAR':
+            self._prompt += event.payload
             self._draw_prompt()
         elif event.type_ == 'SIGWINCH':
             self._calc_and_draw_all()
@@ -385,6 +386,16 @@ class TuiLoop(Loop):
         self._term.flush()
         return True
 
+    def _kb__prompt_backspace(self) -> None:
+        self._prompt = self._prompt[:-1]
+        self._draw_prompt()
+
+    def _kb__prompt_enter(self) -> None:
+        if self._prompt:
+            self.broadcast('PROMPT_COMMAND', self._prompt)
+        self._prompt = ''
+        self._draw_prompt()
+
     def _calc_and_draw_all(self) -> None:
         self._term.clear()
         self._term.calc_geometry()
@@ -419,12 +430,10 @@ class KeyboardLoop(Loop):
     'Loop receiving and translating keyboard events towards main loop.'
 
     def process_bonus(self, yielded: str) -> None:
-        if yielded == 'KEY_ENTER':
-            self.broadcast('INPUT_PROMPT', ('ENTER',))
-        elif yielded == 'KEY_BACKSPACE':
-            self.broadcast('INPUT_PROMPT', ('BACKSPACE',))
+        if yielded in KEYBINDINGS:
+            self.broadcast('KEYBINDING', KEYBINDINGS[yielded])
         elif len(yielded) == 1:
-            self.broadcast('INPUT_PROMPT', ('CHARACTER', yielded))
+            self.broadcast('INPUT_CHAR', yielded)
         else:
             self.broadcast('ALERT', f'unknown keyboard input: {yielded}')