Yep. AI rewrote the whole thing.

This commit is contained in:
2026-03-13 03:24:24 +11:00
parent e4719cb9f4
commit fe6c7d8c12
47 changed files with 5348 additions and 1182 deletions

View File

@@ -1,11 +1,13 @@
import AppKit
import Carbon.HIToolbox
import Combine
/// Manages global and local hotkeys.
///
/// The toggle hotkey uses Carbon's `RegisterEventHotKey` which works
/// system-wide without Accessibility permission. Tab-level hotkeys
/// use a local `NSEvent` monitor (only fires when our app is active).
@MainActor
class HotkeyManager {
static let shared = HotkeyManager()
@@ -27,37 +29,35 @@ class HotkeyManager {
private var hotKeyRef: EventHotKeyRef?
private var eventHandlerRef: EventHandlerRef?
private var localMonitor: Any?
private var defaultsObserver: NSObjectProtocol?
private let settingsProvider: TerminalSessionConfigurationProviding
private var settingsCancellable: AnyCancellable?
private init() {}
init(settingsProvider: TerminalSessionConfigurationProviding? = nil) {
self.settingsProvider = settingsProvider ?? AppSettingsController.shared
}
// MARK: - Resolved bindings (live from UserDefaults)
// MARK: - Resolved bindings from typed runtime settings
private var toggleBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyToggle) ?? .cmdReturn
settingsProvider.hotkeySettings.toggle
}
private var newTabBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyNewTab) ?? .cmdT
settingsProvider.hotkeySettings.newTab
}
private var closeTabBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyCloseTab) ?? .cmdW
settingsProvider.hotkeySettings.closeTab
}
private var nextTabBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyNextTab) ?? .cmdShiftRB
settingsProvider.hotkeySettings.nextTab
}
private var prevTabBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyPreviousTab) ?? .cmdShiftLB
settingsProvider.hotkeySettings.previousTab
}
private var detachBinding: HotkeyBinding {
binding(for: NotchSettings.Keys.hotkeyDetachTab) ?? .cmdD
settingsProvider.hotkeySettings.detachTab
}
private var sizePresets: [TerminalSizePreset] {
TerminalSizePresetStore.load()
}
private func binding(for key: String) -> HotkeyBinding? {
guard let json = UserDefaults.standard.string(forKey: key) else { return nil }
return HotkeyBinding.fromJSON(json)
settingsProvider.terminalSizePresets
}
// MARK: - Start / Stop
@@ -73,10 +73,7 @@ class HotkeyManager {
unregisterToggleHotkey()
removeCarbonHandler()
removeLocalMonitor()
if let obs = defaultsObserver {
NotificationCenter.default.removeObserver(obs)
defaultsObserver = nil
}
settingsCancellable = nil
}
// MARK: - Carbon global hotkey (toggle)
@@ -130,7 +127,7 @@ class HotkeyManager {
let binding = toggleBinding
let carbonMods = carbonModifiers(from: binding.modifiers)
var hotKeyID = EventHotKeyID(
let hotKeyID = EventHotKeyID(
signature: OSType(0x444E5452), // "DNTR"
id: 1
)
@@ -163,15 +160,17 @@ class HotkeyManager {
}
}
/// Re-register the toggle hotkey whenever the user changes it in settings.
/// Re-register the toggle hotkey whenever the typed settings change.
private func observeToggleHotkeyChanges() {
defaultsObserver = NotificationCenter.default.addObserver(
forName: UserDefaults.didChangeNotification,
object: nil,
queue: .main
) { [weak self] _ in
self?.registerToggleHotkey()
}
guard let settingsProvider = settingsProvider as? AppSettingsController else { return }
settingsCancellable = settingsProvider.$settings
.map(\.hotkeys.toggle)
.removeDuplicates()
.dropFirst()
.sink { [weak self] _ in
self?.registerToggleHotkey()
}
}
// MARK: - Local monitor (tab-level hotkeys, only when our app is active)