From 95c44cac01f4494781051332de27069fe0a08454 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 May 2024 14:51:46 +0530 Subject: [PATCH] Better integration point for keyboard mode change notification --- kitty/boss.py | 10 ++-------- kitty/keys.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/kitty/boss.py b/kitty/boss.py index 120bc6cf7..88d3be4b2 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -377,7 +377,7 @@ class Boss: set_boss(self) self.args = args self.mouse_handler: Optional[Callable[[WindowSystemMouseEvent], None]] = None - self.mappings = Mappings(global_shortcuts) + self.mappings = Mappings(global_shortcuts, self.refresh_active_tab_bar) if is_macos: from .fast_data_types import cocoa_set_notification_activated_callback cocoa_set_notification_activated_callback(notification_activated) @@ -1390,17 +1390,13 @@ class Boss: End the current keyboard mode switching to the previous mode. ''') def pop_keyboard_mode(self) -> bool: - try: - return self.mappings.pop_keyboard_mode() - finally: - self.refresh_active_tab_bar() + return self.mappings.pop_keyboard_mode() @ac('misc', ''' Switch to the specified keyboard mode, pushing it onto the stack of keyboard modes. ''') def push_keyboard_mode(self, new_mode: str) -> None: self.mappings.push_keyboard_mode(new_mode) - self.refresh_active_tab_bar() def dispatch_possible_special_key(self, ev: KeyEvent) -> bool: return self.mappings.dispatch_possible_special_key(ev) @@ -1453,7 +1449,6 @@ class Boss: self.mappings._push_keyboard_mode(km) redirect_mouse_handling(True) self.mouse_handler = self.visual_window_select_mouse_handler - self.refresh_active_tab_bar() else: self.visual_window_select_action_trigger(self.current_visual_select.window_ids[0] if self.current_visual_select.window_ids else 0) if get_options().enable_audio_bell: @@ -1469,7 +1464,6 @@ class Boss: def trigger(window_id: int = 0) -> None: self.visual_window_select_action_trigger(window_id) self.mappings.pop_keyboard_mode_if_is('__visual_select__') - self.refresh_active_tab_bar() if ev.button == GLFW_MOUSE_BUTTON_LEFT and ev.action == GLFW_PRESS and ev.window_id: w = self.window_id_map.get(ev.window_id) diff --git a/kitty/keys.py b/kitty/keys.py index 51c908946..ae33c7670 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -2,7 +2,7 @@ # License: GPL v3 Copyright: 2016, Kovid Goyal from gettext import gettext as _ -from typing import TYPE_CHECKING, Any, Dict, Iterable, Iterator, List, Optional +from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, Iterator, List, Optional from .constants import is_macos from .fast_data_types import ( @@ -63,9 +63,10 @@ class Mappings: ' Manage all keyboard mappings ' - def __init__(self, global_shortcuts:Optional[Dict[str, SingleKey]] = None) -> None: + def __init__(self, global_shortcuts:Optional[Dict[str, SingleKey]] = None, callback_on_mode_change: Callable[[], Any] = lambda: None) -> None: self.keyboard_mode_stack: List[KeyboardMode] = [] self.update_keymap(global_shortcuts) + self.callback_on_mode_change = callback_on_mode_change @property def current_keyboard_mode_name(self) -> str: @@ -83,8 +84,11 @@ class Mappings: km.pop(sc, None) def clear_keyboard_modes(self) -> None: + had_mode = bool(self.keyboard_mode_stack) self.keyboard_mode_stack = [] self.set_ignore_os_keyboard_processing(False) + if had_mode: + self.callback_on_mode_change() def pop_keyboard_mode(self) -> bool: passthrough = True @@ -93,6 +97,7 @@ class Mappings: if not self.keyboard_mode_stack: self.set_ignore_os_keyboard_processing(False) passthrough = False + self.callback_on_mode_change() return passthrough def pop_keyboard_mode_if_is(self, name: str) -> bool: @@ -103,6 +108,7 @@ class Mappings: def _push_keyboard_mode(self, mode: KeyboardMode) -> None: self.keyboard_mode_stack.append(mode) self.set_ignore_os_keyboard_processing(True) + self.callback_on_mode_change() def push_keyboard_mode(self, new_mode: str) -> None: mode = self.keyboard_modes[new_mode] @@ -204,6 +210,7 @@ class Mappings: if consumed and not is_root_mode and mode.on_action == 'end': if mode_pos < len(self.keyboard_mode_stack) and self.keyboard_mode_stack[mode_pos] is mode: del self.keyboard_mode_stack[mode_pos] + self.callback_on_mode_change() if not self.keyboard_mode_stack: self.set_ignore_os_keyboard_processing(False) return consumed