From 69f2bbe52ea6b04714f037d09a991d0d97141abd Mon Sep 17 00:00:00 2001 From: Carsten Abele Date: Tue, 7 Apr 2026 19:40:19 +0200 Subject: [PATCH] feat: add configurable global keyboard shortcut --- .../MyVoxtral/Utilities/GlobalShortcut.swift | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 MyVoxtral/MyVoxtral/Utilities/GlobalShortcut.swift 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() + } +}