diff --git a/src/fenrirscreenreader/screenDriver/ptyDriver.py b/src/fenrirscreenreader/screenDriver/ptyDriver.py index 5574dab8..2a55ea10 100644 --- a/src/fenrirscreenreader/screenDriver/ptyDriver.py +++ b/src/fenrirscreenreader/screenDriver/ptyDriver.py @@ -343,7 +343,7 @@ class driver(screenDriver): if not self.is_vmenu_active(): return False key_name = self.vmenu_stdin_key_name(msg_bytes) - if key_name: + if key_name and not self.vmenu_key_already_handled(key_name): self.queue_keypress(key_name, event_queue) return True @@ -375,6 +375,12 @@ class driver(screenDriver): return "KEY_" + char.upper() return None + def vmenu_key_already_handled(self, key_name): + try: + return key_name in self.env["input"]["curr_input"] + except Exception: + return False + def queue_keypress(self, key_name, event_queue): event_time = time.time() for event_state in [1, 0]: diff --git a/tests/unit/test_pty_terminal_sequences.py b/tests/unit/test_pty_terminal_sequences.py index 835c6907..915bc997 100644 --- a/tests/unit/test_pty_terminal_sequences.py +++ b/tests/unit/test_pty_terminal_sequences.py @@ -226,6 +226,24 @@ def test_pty_vmenu_unknown_stdin_is_consumed_without_injection(): event_queue.put.assert_not_called() +@pytest.mark.unit +def test_pty_vmenu_stdin_does_not_duplicate_current_x11_key(): + pty_driver = PtyDriver() + event_queue = Mock() + pty_driver.env = { + "input": {"curr_input": ["KEY_RIGHT"]}, + "runtime": { + "VmenuManager": Mock(get_active=Mock(return_value=True)), + }, + } + pty_driver.inject_text_to_screen = Mock() + + pty_driver.handle_stdin_input(b"\x1b[C", event_queue) + + pty_driver.inject_text_to_screen.assert_not_called() + event_queue.put.assert_not_called() + + @pytest.mark.unit def test_pty_stdin_input_honors_interrupt_disabled(): pty_driver = PtyDriver()