diff --git a/macos/Sources/Ghostty/Ghostty.MenuShortcutManager.swift b/macos/Sources/Ghostty/Ghostty.MenuShortcutManager.swift index f09d2f6cc..d7145745f 100644 --- a/macos/Sources/Ghostty/Ghostty.MenuShortcutManager.swift +++ b/macos/Sources/Ghostty/Ghostty.MenuShortcutManager.swift @@ -23,23 +23,10 @@ extension Ghostty { func syncMenuShortcut(_ config: Ghostty.Config, action: String?, menuItem: NSMenuItem?) { guard let menu = menuItem else { return } - guard - let action, let shortcut = config.keyboardShortcut(for: action), - // Build a direct lookup for key-equivalent dispatch so we don't need to - // linearly walk the full menu hierarchy at event time. - let key = MenuShortcutKey(shortcut) - else { - // No shortcut, clear the menu item + if !updateMenuShortcut(config, action: action, menuItem: menu) { menu.keyEquivalent = "" menu.keyEquivalentModifierMask = [] - return } - - menu.keyEquivalent = key.keyEquivalent - menu.keyEquivalentModifierMask = key.modifierFlags - - // Later registrations intentionally override earlier ones for the same key. - menuItemsByShortcut[key] = .init(menu) } /// Attempts to perform a menu key equivalent only for menu items that represent @@ -86,6 +73,31 @@ extension Ghostty { } } +private extension Ghostty.MenuShortcutManager { + /// Syncs a single menu shortcut for the given action. The action string is the same + /// action string used for the Ghostty configuration. + /// + /// - Returns: Whether the menu item is updated and saved in ``menuItemsByShortcut`` + func updateMenuShortcut(_ config: Ghostty.Config, action: String?, menuItem menu: NSMenuItem) -> Bool { + guard + let action, + let shortcut = config.keyboardShortcut(for: action), + // Build a direct lookup for key-equivalent dispatch so we don't need to + // linearly walk the full menu hierarchy at event time. + let key = MenuShortcutKey(shortcut) + else { + return false + } + + menu.keyEquivalent = key.keyEquivalent + menu.keyEquivalentModifierMask = key.modifierFlags + + // Later registrations intentionally override earlier ones for the same key. + menuItemsByShortcut[key] = .init(menu) + return true + } +} + extension Ghostty.MenuShortcutManager { /// Hashable key for a menu shortcut match, normalized for quick lookup. struct MenuShortcutKey: Hashable {