From b2193a20375b1353e1e1a5019e6a4e3903f2cbf8 Mon Sep 17 00:00:00 2001 From: Matthias Gansrigler Date: Mon, 1 Aug 2022 14:28:31 +0200 Subject: [PATCH 1/4] Now returns a (discardable) Bool for registering and/or enabling shortcuts, so we know if it worked or not. --- .../CarbonKeyboardShortcuts.swift | 18 ++++++++++-------- .../KeyboardShortcuts/KeyboardShortcuts.swift | 16 ++++++++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift b/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift index 501a1dd..c2ff9d9 100644 --- a/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift +++ b/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift @@ -37,12 +37,12 @@ enum CarbonKeyboardShortcuts { private static var hotKeyId = 0 private static var eventHandler: EventHandlerRef? - private static func setUpEventHandlerIfNeeded() { + private static func setUpEventHandlerIfNeeded() -> Bool { guard eventHandler == nil, let dispatcher = GetEventDispatcherTarget() else { - return + return false } let eventSpecs = [ @@ -50,21 +50,23 @@ enum CarbonKeyboardShortcuts { EventTypeSpec(eventClass: OSType(kEventClassKeyboard), eventKind: UInt32(kEventHotKeyReleased)) ] - InstallEventHandler( + guard InstallEventHandler( dispatcher, carbonKeyboardShortcutsEventHandler, eventSpecs.count, eventSpecs, nil, &eventHandler - ) + ) == noErr else { return false } + + return true } - static func register( + @discardableResult static func register( _ shortcut: KeyboardShortcuts.Shortcut, onKeyDown: @escaping (KeyboardShortcuts.Shortcut) -> Void, onKeyUp: @escaping (KeyboardShortcuts.Shortcut) -> Void - ) { + ) -> Bool { hotKeyId += 1 var eventHotKey: EventHotKeyRef? @@ -81,7 +83,7 @@ enum CarbonKeyboardShortcuts { registerError == noErr, let carbonHotKey = eventHotKey else { - return + return false } hotKeys[hotKeyId] = HotKey( @@ -92,7 +94,7 @@ enum CarbonKeyboardShortcuts { onKeyUp: onKeyUp ) - setUpEventHandlerIfNeeded() + return setUpEventHandlerIfNeeded() } private static func unregisterHotKey(_ hotKey: HotKey) { diff --git a/Sources/KeyboardShortcuts/KeyboardShortcuts.swift b/Sources/KeyboardShortcuts/KeyboardShortcuts.swift index b4b00fd..1fc9e65 100644 --- a/Sources/KeyboardShortcuts/KeyboardShortcuts.swift +++ b/Sources/KeyboardShortcuts/KeyboardShortcuts.swift @@ -37,18 +37,22 @@ public enum KeyboardShortcuts { */ static var isPaused = false - private static func register(_ shortcut: Shortcut) { + @discardableResult private static func register(_ shortcut: Shortcut) -> Bool { guard !registeredShortcuts.contains(shortcut) else { - return + return true //already registered } - CarbonKeyboardShortcuts.register( + let keyboardShortcutRegistered = CarbonKeyboardShortcuts.register( shortcut, onKeyDown: handleOnKeyDown, onKeyUp: handleOnKeyUp ) + guard keyboardShortcutRegistered else { return false } + registeredShortcuts.insert(shortcut) + + return true } /** @@ -129,12 +133,12 @@ public enum KeyboardShortcuts { /** Enable a disabled keyboard shortcut. */ - public static func enable(_ name: Name) { + @discardableResult public static func enable(_ name: Name) -> Bool { guard let shortcut = getShortcut(for: name) else { - return + return false } - register(shortcut) + return register(shortcut) } /** From 9e30631951ea2ea6fac60b8ec4ee30b4af02b1fe Mon Sep 17 00:00:00 2001 From: Matthias Gansrigler Date: Mon, 1 Aug 2022 14:43:16 +0200 Subject: [PATCH 2/4] minor fix regarding previous commit (true/false return value for registering/enabling shortcuts) --- Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift b/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift index c2ff9d9..4dbec41 100644 --- a/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift +++ b/Sources/KeyboardShortcuts/CarbonKeyboardShortcuts.swift @@ -38,12 +38,8 @@ enum CarbonKeyboardShortcuts { private static var eventHandler: EventHandlerRef? private static func setUpEventHandlerIfNeeded() -> Bool { - guard - eventHandler == nil, - let dispatcher = GetEventDispatcherTarget() - else { - return false - } + guard eventHandler == nil else { return true } + guard let dispatcher = GetEventDispatcherTarget() else { return false } let eventSpecs = [ EventTypeSpec(eventClass: OSType(kEventClassKeyboard), eventKind: UInt32(kEventHotKeyPressed)), From e31b5570751399eefe9ebf5a8a8de85120f7fb85 Mon Sep 17 00:00:00 2001 From: Matthias Gansrigler Date: Mon, 1 Aug 2022 14:52:00 +0200 Subject: [PATCH 3/4] Added an "isEnabled" calculated property to Shortcut.swift, and the appropriate function to KeyboardShortcuts.swift --- Sources/KeyboardShortcuts/KeyboardShortcuts.swift | 7 +++++++ Sources/KeyboardShortcuts/Shortcut.swift | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/Sources/KeyboardShortcuts/KeyboardShortcuts.swift b/Sources/KeyboardShortcuts/KeyboardShortcuts.swift index 1fc9e65..2f2451d 100644 --- a/Sources/KeyboardShortcuts/KeyboardShortcuts.swift +++ b/Sources/KeyboardShortcuts/KeyboardShortcuts.swift @@ -140,6 +140,13 @@ public enum KeyboardShortcuts { return register(shortcut) } + + /** + Returns whether the passed-in shortcut is currently registered. + */ + public static func shortcutIsEnabled(_ shortcut: Shortcut) -> Bool { + return registeredShortcuts.contains(shortcut) || registeredShortcuts.first(where: {$0.key == shortcut.key && $0.modifiers == shortcut.modifiers}) != nil + } /** Reset the keyboard shortcut for one or more names. diff --git a/Sources/KeyboardShortcuts/Shortcut.swift b/Sources/KeyboardShortcuts/Shortcut.swift index 7cb9e45..5f8b5e8 100644 --- a/Sources/KeyboardShortcuts/Shortcut.swift +++ b/Sources/KeyboardShortcuts/Shortcut.swift @@ -38,6 +38,13 @@ extension KeyboardShortcuts { You most likely don't need this. */ public let carbonModifiers: Int + + /** + Returns whether this shortcut is registered/enabled. + */ + public var isEnabled: Bool { + KeyboardShortcuts.shortcutIsEnabled(self) + } /** Initialize from a strongly-typed key and modifiers. From 2b5ac4e57df7cc9ab36660cbd1b89406893b6721 Mon Sep 17 00:00:00 2001 From: Matthias Gansrigler Date: Mon, 1 Aug 2022 15:15:54 +0200 Subject: [PATCH 4/4] makes Shortcut.istakenBySystem public --- Sources/KeyboardShortcuts/Shortcut.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/KeyboardShortcuts/Shortcut.swift b/Sources/KeyboardShortcuts/Shortcut.swift index 5f8b5e8..c99324b 100644 --- a/Sources/KeyboardShortcuts/Shortcut.swift +++ b/Sources/KeyboardShortcuts/Shortcut.swift @@ -104,7 +104,7 @@ extension KeyboardShortcuts.Shortcut { /** Check whether the keyboard shortcut is already taken by the system. */ - var isTakenBySystem: Bool { + public var isTakenBySystem: Bool { guard self != Self(.f12, modifiers: []) else { return false }