From e341a26e90a40f619400b607368d7f94d6e6e28f Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 22 May 2026 15:02:33 -0400 Subject: [PATCH] Some fenrir shortcuts were being fenicky. Hopefully ficked it. --- .../inputDriver/x11Driver.py | 39 +++++++------------ tests/unit/test_x11_terminal_mode.py | 31 +++++++-------- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/fenrirscreenreader/inputDriver/x11Driver.py b/src/fenrirscreenreader/inputDriver/x11Driver.py index c78de3ce..ef954595 100644 --- a/src/fenrirscreenreader/inputDriver/x11Driver.py +++ b/src/fenrirscreenreader/inputDriver/x11Driver.py @@ -276,7 +276,7 @@ class driver(inputDriver): while active.value: try: self.refresh_grabs() - self.poll_modifier_interrupt_keys(event_queue) + self.poll_modifier_interrupt_keys() if not self.display.pending_events(): time.sleep(0.01) continue @@ -374,7 +374,7 @@ class driver(inputDriver): "event_x_time": getattr(event, "time", X.CurrentTime), } - def poll_modifier_interrupt_keys(self, event_queue): + def poll_modifier_interrupt_keys(self): if not self.active or not self.should_poll_modifier_interrupt_keys(): return try: @@ -387,9 +387,7 @@ class driver(inputDriver): self.modifier_state = current_state for key_name, modifier_mask in self.interrupt_modifier_masks(): if current_state & modifier_mask and not previous_state & modifier_mask: - self.queue_modifier_interrupt_event(event_queue, key_name, 1) - elif previous_state & modifier_mask and not current_state & modifier_mask: - self.queue_modifier_interrupt_event(event_queue, key_name, 0) + self.interrupt_output_on_modifier_key(key_name) def should_poll_modifier_interrupt_keys(self): try: @@ -414,26 +412,17 @@ class driver(inputDriver): ("KEY_ALT", X.Mod1Mask), ] - def queue_modifier_interrupt_event(self, event_queue, key_name, event_state): - event_time = time.time() - input_event = { - "event_name": key_name, - "event_value": 0, - "event_sec": int(event_time), - "event_usec": int((event_time % 1) * 1000000), - "event_state": event_state, - "event_type": X.KeyPress if event_state == 1 else X.KeyRelease, - "event_raw_state": self.modifier_state, - "event_x_time": X.CurrentTime, - "event_synthetic": True, - } - self.env["input"]["event_buffer"].append(input_event.copy()) - event_queue.put( - { - "Type": FenrirEventType.keyboard_input, - "data": input_event, - } - ) + def interrupt_output_on_modifier_key(self, key_name): + try: + self.env["runtime"]["OutputManager"].interrupt_output_async() + except Exception as e: + self.env["runtime"]["DebugManager"].write_debug_out( + "x11Driver modifier interrupt failed for " + + key_name + + ": " + + str(e), + debug.DebugLevel.ERROR, + ) def refresh_modifier_state(self): try: diff --git a/tests/unit/test_x11_terminal_mode.py b/tests/unit/test_x11_terminal_mode.py index 1734efc5..d95290d3 100644 --- a/tests/unit/test_x11_terminal_mode.py +++ b/tests/unit/test_x11_terminal_mode.py @@ -227,7 +227,7 @@ def test_x11_build_passive_grabs_for_fenrir_keys_and_shortcuts(): @pytest.mark.unit -def test_x11_poll_modifier_interrupt_keys_emits_press_and_release(): +def test_x11_poll_modifier_interrupt_keys_interrupts_without_input_events(): x11 = X11Driver() x11.active = True x11.modifier_interrupt_state = 0 @@ -237,31 +237,28 @@ def test_x11_poll_modifier_interrupt_keys_emits_press_and_release(): settings_manager = Mock() settings_manager.get_setting_as_bool.return_value = True settings_manager.get_setting.return_value = "" + output_manager = Mock() x11.env = { "input": {"event_buffer": []}, - "runtime": {"SettingsManager": settings_manager}, + "runtime": { + "SettingsManager": settings_manager, + "OutputManager": output_manager, + "DebugManager": Mock(), + }, } - event_queue = Mock() - x11.poll_modifier_interrupt_keys(event_queue) + x11.poll_modifier_interrupt_keys() - event_queue.put.assert_called_once() - event = event_queue.put.call_args.args[0] - assert event["data"]["event_name"] == "KEY_CTRL" - assert event["data"]["event_state"] == 1 - assert x11.env["input"]["event_buffer"][0]["event_synthetic"] is True + output_manager.interrupt_output_async.assert_called_once() + assert x11.env["input"]["event_buffer"] == [] - event_queue.reset_mock() - x11.env["input"]["event_buffer"] = [] + output_manager.interrupt_output_async.reset_mock() x11.root.query_pointer.return_value = Mock(mask=0) - x11.poll_modifier_interrupt_keys(event_queue) + x11.poll_modifier_interrupt_keys() - event_queue.put.assert_called_once() - event = event_queue.put.call_args.args[0] - assert event["data"]["event_name"] == "KEY_CTRL" - assert event["data"]["event_state"] == 0 - assert x11.env["input"]["event_buffer"][0]["event_synthetic"] is True + output_manager.interrupt_output_async.assert_not_called() + assert x11.env["input"]["event_buffer"] == [] @pytest.mark.unit