From 90c987b3c3f04bfbc46363b0311becbb35cfa1ba Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Fri, 30 May 2025 16:42:16 +0200 Subject: [PATCH] Refactor key input handling into proper keybindings mapping. --- ircplom.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/ircplom.py b/ircplom.py index 227a814..6f5d3ae 100755 --- a/ircplom.py +++ b/ircplom.py @@ -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}') -- 2.30.2