diff --git a/MyVoxtral/MyVoxtral/Utilities/GlobalShortcut.swift b/MyVoxtral/MyVoxtral/Utilities/GlobalShortcut.swift new file mode 100644 index 0000000..1edf79b --- /dev/null +++ b/MyVoxtral/MyVoxtral/Utilities/GlobalShortcut.swift @@ -0,0 +1,31 @@ +import Cocoa + +final class GlobalShortcut { + private var monitor: Any? + var onTrigger: (() -> Void)? + + func register(keyCode: UInt16, modifiers: UInt) { + unregister() + guard keyCode != 0 || modifiers != 0 else { return } + + let requiredFlags = NSEvent.ModifierFlags(rawValue: modifiers) + + monitor = NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { [weak self] event in + let mask: NSEvent.ModifierFlags = [.command, .option, .control, .shift] + if event.keyCode == keyCode && event.modifierFlags.intersection(mask) == requiredFlags { + self?.onTrigger?() + } + } + } + + func unregister() { + if let monitor { + NSEvent.removeMonitor(monitor) + } + monitor = nil + } + + deinit { + unregister() + } +}