diff --git a/docs/changelog.rst b/docs/changelog.rst index 3bf8428c8..da9981de6 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -52,6 +52,8 @@ Detailed list of changes - Fix a single key mapping not overriding a previously defined multi-key mapping +- macOS: Fix :code:`kitten @ select-window` leaving the keyboard in a partially functional state (:iss:`7074`) + 0.32.1 [2024-01-26] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/kitty/boss.py b/kitty/boss.py index beaec1972..528283d9d 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -295,7 +295,6 @@ class VisualSelect: set_os_window_title(self.os_window_id, '') boss = get_boss() redirect_mouse_handling(False) - boss.mappings.clear_keyboard_modes() for wid in self.window_ids: w = boss.window_id_map.get(wid) if w is not None: diff --git a/kitty/keys.py b/kitty/keys.py index a15928329..ecd1a4b0b 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -80,6 +80,7 @@ class Mappings: def clear_keyboard_modes(self) -> None: self.keyboard_mode_stack = [] + self.set_ignore_os_keyboard_processing(False) def pop_keyboard_mode(self) -> bool: passthrough = True diff --git a/kitty_tests/keys.py b/kitty_tests/keys.py index d557e09c6..ae1c8c292 100644 --- a/kitty_tests/keys.py +++ b/kitty_tests/keys.py @@ -527,6 +527,7 @@ class TestKeys(BaseTest): bad_lines = [] self.options = load_config(overrides=lines, accumulate_bad_lines=bad_lines) af(bad_lines) + self.ignore_os_keyboard_processing = False super().__init__() def get_active_window(self): @@ -555,7 +556,7 @@ class TestKeys(BaseTest): return bool(action_definition) def set_ignore_os_keyboard_processing(self, on: bool) -> None: - pass + self.ignore_os_keyboard_processing = on def set_cocoa_global_shortcuts(self, opts): return {} @@ -640,3 +641,9 @@ class TestKeys(BaseTest): self.ae(tm.actions, ['neighboring_window left']) self.ae(tm('x'), [True]) af(tm.keyboard_mode_stack) + + # modal mapping with --on-action=end must restore OS keyboard processing + tm = TM('map --new-mode mw --on-action end m', 'map --mode mw a new_window') + self.ae(tm('m', 'a'), [True, True]) + self.ae(tm.actions, ['push_keyboard_mode mw', 'new_window']) + af(tm.ignore_os_keyboard_processing)