diff --git a/src/api-wrappers/HelperExtensions.swift b/src/api-wrappers/HelperExtensions.swift index 7a7fafbe..a3c5bd3b 100644 --- a/src/api-wrappers/HelperExtensions.swift +++ b/src/api-wrappers/HelperExtensions.swift @@ -1,5 +1,6 @@ import Cocoa import Darwin +import Carbon.HIToolbox.Events extension NSAppearance { func getThemeName() -> AppearanceThemePreference { diff --git a/src/logic/ATShortcut.swift b/src/logic/ATShortcut.swift index 79171a2e..1b2f0682 100644 --- a/src/logic/ATShortcut.swift +++ b/src/logic/ATShortcut.swift @@ -42,14 +42,16 @@ class ATShortcut { return false } - private func modifiersMatch(_ modifiers: UInt32) -> Bool { + private func modifiersMatch(_ modifiers: CarbonModifierFlags) -> Bool { + let modifiersCleaned = modifiers.cleaned() + let shortcutModifiersCleaned = shortcut.carbonModifierFlags.cleaned() // holdShortcut: contains at least if id.hasPrefix("holdShortcut") { - return modifiers == (modifiers | shortcut.carbonModifierFlags) + return modifiersCleaned == (modifiersCleaned | shortcutModifiersCleaned) } // other shortcuts: contains exactly or exactly + holdShortcut modifiers - let holdModifiers = ControlsTab.shortcuts[Preferences.indexToName("holdShortcut", App.app.shortcutIndex)]?.shortcut.carbonModifierFlags ?? 0 - return modifiers == shortcut.carbonModifierFlags || modifiers == (shortcut.carbonModifierFlags | holdModifiers) + let holdModifiersCleaned = ControlsTab.shortcuts[Preferences.indexToName("holdShortcut", App.app.shortcutIndex)]?.shortcut.carbonModifierFlags.cleaned() ?? 0 + return modifiersCleaned == shortcutModifiersCleaned || modifiersCleaned == (shortcutModifiersCleaned | holdModifiersCleaned) } func shouldTrigger() -> Bool { @@ -114,3 +116,21 @@ enum ShortcutScope { case global case local } + +extension NSEvent.ModifierFlags { + // NSEvent.addLocalMonitorForEvents may return events with broken modifiers (e.g. [.NSEventModifierFlagOption, .NSEventModifierFlagFunction, 0x120]) + // we filter modifiers to only include valid modifiers; which doesn't include fn as we don't support it as a modifier + func cleaned() -> Self { + return self.intersection([.command, .shift, .option, .control, .capsLock]) + } +} + +typealias CarbonModifierFlags = UInt32 + +extension CarbonModifierFlags { + // cocoaToCarbonFlags may remove NSEventModifierFlagFunction + // we filter modifiers to only include valid modifiers; which doesn't include fn as we don't support it as a modifier + func cleaned() -> Self { + return self & (UInt32(cmdKey) | UInt32(shiftKey) | UInt32(optionKey) | UInt32(controlKey) | UInt32(alphaLock)) + } +} diff --git a/src/logic/events/CursorEvents.swift b/src/logic/events/CursorEvents.swift index 3a824872..a23ad16d 100644 --- a/src/logic/events/CursorEvents.swift +++ b/src/logic/events/CursorEvents.swift @@ -63,7 +63,6 @@ class CursorEvents { let deltaX = event.locationInWindow.x - deadZoneInitialPosition.x let deltaY = event.locationInWindow.y - deadZoneInitialPosition.y let d = hypot(deltaX, deltaY) - Logger.error { d } isAllowedToMouseHover = d > 25 } }