|
|
|
@ -79,8 +79,8 @@ public final class HotkeyManager { |
|
|
|
|
|
|
|
public var currentPreset: HotkeyPreset { |
|
|
|
get { |
|
|
|
let val = UserDefaults.standard.string(forKey: "SonioxHotkeyPreset") ?? HotkeyPreset.micKey.rawValue |
|
|
|
return HotkeyPreset(rawValue: val) ?? .micKey |
|
|
|
let val = UserDefaults.standard.string(forKey: "SonioxHotkeyPreset") ?? HotkeyPreset.option.rawValue |
|
|
|
return HotkeyPreset(rawValue: val) ?? .option |
|
|
|
} |
|
|
|
set { |
|
|
|
UserDefaults.standard.set(newValue.rawValue, forKey: "SonioxHotkeyPreset") |
|
|
|
@ -99,10 +99,48 @@ public final class HotkeyManager { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private init() {} |
|
|
|
private init() { |
|
|
|
setupSleepWakeObservers() |
|
|
|
} |
|
|
|
|
|
|
|
private func setupSleepWakeObservers() { |
|
|
|
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.willSleepNotification, object: nil, queue: .main) { [weak self] _ in |
|
|
|
guard let self = self else { return } |
|
|
|
print("HotkeyManager: Mac entering sleep. Resetting keys & unregistering taps.") |
|
|
|
self.resetKeyState() |
|
|
|
self.unregisterHotkeys() |
|
|
|
} |
|
|
|
|
|
|
|
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: .main) { [weak self] _ in |
|
|
|
guard let self = self else { return } |
|
|
|
print("HotkeyManager: Mac woke from sleep. Re-registering hotkeys in 0.5s...") |
|
|
|
self.resetKeyState() |
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { |
|
|
|
self.registerHotkeys() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidWakeNotification, object: nil, queue: .main) { [weak self] _ in |
|
|
|
guard let self = self else { return } |
|
|
|
print("HotkeyManager: Screens woke. Verifying hotkey event tap...") |
|
|
|
if let tap = self.eventTapPort { |
|
|
|
CGEvent.tapEnable(tap: tap, enable: true) |
|
|
|
} else { |
|
|
|
self.registerHotkeys() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public func resetKeyState() { |
|
|
|
isOptionPhysicallyDown = false |
|
|
|
isF5PhysicallyDown = false |
|
|
|
isCapsLockPhysicallyDown = false |
|
|
|
isFnPhysicallyDown = false |
|
|
|
} |
|
|
|
|
|
|
|
public func registerHotkeys() { |
|
|
|
unregisterHotkeys() |
|
|
|
resetKeyState() |
|
|
|
|
|
|
|
let preset = currentPreset |
|
|
|
print("HotkeyManager: Registering hotkey for '\(preset.rawValue)', mode: '\(currentMode.rawValue)'") |
|
|
|
@ -150,22 +188,6 @@ public final class HotkeyManager { |
|
|
|
|
|
|
|
// 3. Dual-layer fallback NSEvent monitor (catches flagsChanged/Option even after wake/sleep) |
|
|
|
setupGlobalMonitor() |
|
|
|
|
|
|
|
// 4. Watch for system and display sleep/wake to ensure event tap is always alive |
|
|
|
NotificationCenter.default.removeObserver(self, name: NSWorkspace.didWakeNotification, object: nil) |
|
|
|
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: .main) { [weak self] _ in |
|
|
|
print("HotkeyManager: System woke from sleep. Re-registering hotkeys...") |
|
|
|
self?.registerHotkeys() |
|
|
|
} |
|
|
|
NotificationCenter.default.removeObserver(self, name: NSWorkspace.screensDidWakeNotification, object: nil) |
|
|
|
NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.screensDidWakeNotification, object: nil, queue: .main) { [weak self] _ in |
|
|
|
print("HotkeyManager: Screens woke. Verifying hotkey event tap...") |
|
|
|
if let tap = self?.eventTapPort { |
|
|
|
CGEvent.tapEnable(tap: tap, enable: true) |
|
|
|
} else { |
|
|
|
self?.registerHotkeys() |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private func triggerAction() { |
|
|
|
@ -191,7 +213,7 @@ public final class HotkeyManager { |
|
|
|
if let tap = manager.eventTapPort { |
|
|
|
CGEvent.tapEnable(tap: tap, enable: true) |
|
|
|
} |
|
|
|
return Unmanaged.passRetained(event) |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
let flags = event.flags.rawValue |
|
|
|
@ -368,6 +390,7 @@ public final class HotkeyManager { |
|
|
|
} |
|
|
|
|
|
|
|
public func unregisterHotkeys() { |
|
|
|
resetKeyState() |
|
|
|
if let ref = hotKeyRef { |
|
|
|
UnregisterEventHotKey(ref) |
|
|
|
hotKeyRef = nil |
|
|
|
|