From 6490e4715d055e7415f2c3f9aa5e4eba0163a31c Mon Sep 17 00:00:00 2001 From: Edern Deneuville Date: Fri, 11 Sep 2026 13:23:02 +0200 Subject: [PATCH] Type first AI character automatically --- src/ai_typewriter/key_stepper.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/ai_typewriter/key_stepper.py b/src/ai_typewriter/key_stepper.py index f305a80..3555a6d 100644 --- a/src/ai_typewriter/key_stepper.py +++ b/src/ai_typewriter/key_stepper.py @@ -21,19 +21,17 @@ class KeyStepper: return if self._hook is not None: return + self.type_next_character() + if self._index >= len(self.text): + return # suppress=True blocks the physical key while the callback types the next AI character. self._hook = keyboard.hook(self._on_event, suppress=True) - def stop(self) -> None: - hook = self._hook - self._hook = None - if hook is not None: - keyboard.unhook(hook) - - def _on_event(self, event: keyboard.KeyboardEvent) -> None: - if self._injecting or event.event_type != keyboard.KEY_DOWN: - return + @property + def remaining_characters(self) -> int: + return max(len(self.text) - self._index, 0) + def type_next_character(self) -> None: with self._lock: if self._index >= len(self.text): self.stop() @@ -50,6 +48,17 @@ class KeyStepper: if self._index >= len(self.text): self.stop() + def stop(self) -> None: + hook = self._hook + self._hook = None + if hook is not None: + keyboard.unhook(hook) + + def _on_event(self, event: keyboard.KeyboardEvent) -> None: + if self._injecting or event.event_type != keyboard.KEY_DOWN: + return + self.type_next_character() + def _type_char(self, char: str) -> None: if char == "\n": keyboard.send("enter")