diff --git a/Maccy/FilterMenuItemView.swift b/Maccy/FilterMenuItemView.swift index 9b2ef423..baf28631 100644 --- a/Maccy/FilterMenuItemView.swift +++ b/Maccy/FilterMenuItemView.swift @@ -162,7 +162,7 @@ class FilterMenuItemView: NSView, NSTextFieldDelegate { guard let key = Key(carbonKeyCode: UInt32(event.keyCode)) else { return false } - let modifierFlags = event.modifierFlags + let modifierFlags = event.modifierFlags.intersection(.deviceIndependentFlagsMask) if Keys.shouldPassThrough(key) { return false @@ -180,11 +180,12 @@ class FilterMenuItemView: NSView, NSTextFieldDelegate { } if key == Key.return || key == Key.keypadEnter || key == Key.upArrow || key == Key.downArrow { - if let menu = customMenu { - processSelectionKey(menu: menu, key: key, modifierFlags: modifierFlags) - return true - } + processSelectionKey(menu: customMenu, key: key, modifierFlags: modifierFlags) + return true + } + if key == GlobalHotKey.key && modifierFlags == GlobalHotKey.modifierFlags { + customMenu?.cancelTracking() return false } @@ -208,21 +209,21 @@ class FilterMenuItemView: NSView, NSTextFieldDelegate { } } - private func processSelectionKey(menu: Menu, key: Key, modifierFlags: NSEvent.ModifierFlags) { + private func processSelectionKey(menu: Menu?, key: Key, modifierFlags: NSEvent.ModifierFlags) { switch key { case .return, .keypadEnter: - menu.select() + menu?.select() case .upArrow: if modifierFlags.contains(.command) { - menu.selectFirst() + menu?.selectFirst() } else { - menu.selectPrevious(alt: modifierFlags.contains(.option)) + menu?.selectPrevious(alt: modifierFlags.contains(.option)) } case .downArrow: if modifierFlags.contains(.command) { - menu.selectLast() + menu?.selectLast() } else { - menu.selectNext(alt: modifierFlags.contains(.option)) + menu?.selectNext(alt: modifierFlags.contains(.option)) } default: () } diff --git a/Maccy/GlobalHotKey.swift b/Maccy/GlobalHotKey.swift index 5fef86a7..93ebb33b 100644 --- a/Maccy/GlobalHotKey.swift +++ b/Maccy/GlobalHotKey.swift @@ -1,7 +1,10 @@ import HotKey class GlobalHotKey { - private var hotKey: HotKey? + static public var key: Key? + static public var modifierFlags: NSEvent.ModifierFlags? + + private var hotKey: HotKey! private var handler: HotKey.Handler private var hotKeyPrefObserver: NSKeyValueObservation? @@ -12,7 +15,11 @@ class GlobalHotKey { hotKeyPrefObserver = UserDefaults.standard.observe(\.hotKey, options: [.initial, .new], changeHandler: { _, _ in if let (key, modifiers) = self.parseHotKey() { self.hotKey = HotKey(key: key, modifiers: modifiers) - self.hotKey?.keyDownHandler = self.handler + self.hotKey.keyDownHandler = { + self.hotKey.isPaused = true + self.handler() + self.hotKey.isPaused = false + } } }) } @@ -46,6 +53,9 @@ class GlobalHotKey { } } + GlobalHotKey.key = key + GlobalHotKey.modifierFlags = modifiers + return (key, modifiers) } } diff --git a/MaccyUITests/MaccyUITests.swift b/MaccyUITests/MaccyUITests.swift index aa55e0e4..b6aa41f3 100644 --- a/MaccyUITests/MaccyUITests.swift +++ b/MaccyUITests/MaccyUITests.swift @@ -40,6 +40,17 @@ class MaccyUITests: XCTestCase { XCTAssertTrue(app.menuItems[copy2].exists) } + func testCloseWithHotkey() { + popUpWithHotkey() + let historyItem = app.menuItems[copy1] + expectation(for: NSPredicate(format: "exists = 0"), evaluatedWith: historyItem) + + for event in popUpEvents { + event.post(tap: .cghidEventTap) + } + waitForExpectations(timeout: 3) + } + func testPopupWithMenubar() { popUpWithMouse() XCTAssertTrue(app.menuItems[copy1].exists)