diff --git a/alt-tab-macos/logic/Keyboard.swift b/alt-tab-macos/logic/Keyboard.swift index d3aa92a54..f4db2068f 100644 --- a/alt-tab-macos/logic/Keyboard.swift +++ b/alt-tab-macos/logic/Keyboard.swift @@ -1,8 +1,10 @@ import Cocoa +var eventTap: CFMachPort? + func listenToGlobalKeyboardEvents(_ delegate: Application) { let eventMask = [CGEventType.keyDown, CGEventType.keyUp, CGEventType.flagsChanged].reduce(CGEventMask(0), { $0 | (1 << $1.rawValue) }) - let eventTap = CGEvent.tapCreate( + eventTap = CGEvent.tapCreate( tap: .cgSessionEventTap, place: .headInsertEventTap, options: .defaultTap, @@ -19,23 +21,27 @@ func listenToGlobalKeyboardEvents(_ delegate: Application) { } func keyboardHandler(_ cgEvent: CGEvent, _ delegate: Application) -> Unmanaged? { - if cgEvent.type == .keyDown || cgEvent.type == .keyUp || cgEvent.type == .flagsChanged, let event = NSEvent.init(cgEvent: cgEvent) { - let keyDown = event.type == .keyDown - let optionKeyEvent = event.keyCode == metaKey - let tabKeyEvent = event.keyCode == tabKey - if optionKeyEvent && event.modifiersDown([metaModifierFlag]) { - delegate.keyDownMeta() - } else if tabKeyEvent && event.modifiersDown([metaModifierFlag]) && keyDown { - delegate.keyDownMetaTab() - // focused app will not receive the event (will not press tab key in that app) - return nil - } else if tabKeyEvent && event.modifiersDown([metaModifierFlag, .shift]) && keyDown { - delegate.keyDownMetaShiftTab() - // focused app will not receive the event (will not press tab key in that app) - return nil - } else if optionKeyEvent && !keyDown { - delegate.keyUpMeta() + if cgEvent.type == .keyDown || cgEvent.type == .keyUp || cgEvent.type == .flagsChanged { + if let event = NSEvent.init(cgEvent: cgEvent) { + let keyDown = event.type == .keyDown + let optionKeyEvent = event.keyCode == metaKey + let tabKeyEvent = event.keyCode == tabKey + if optionKeyEvent && event.modifiersDown([metaModifierFlag]) { + delegate.keyDownMeta() + } else if tabKeyEvent && event.modifiersDown([metaModifierFlag]) && keyDown { + delegate.keyDownMetaTab() + // focused app will not receive the event (will not press tab key in that app) + return nil + } else if tabKeyEvent && event.modifiersDown([metaModifierFlag, .shift]) && keyDown { + delegate.keyDownMetaShiftTab() + // focused app will not receive the event (will not press tab key in that app) + return nil + } else if optionKeyEvent && !keyDown { + delegate.keyUpMeta() + } } + } else if cgEvent.type == .tapDisabledByUserInput || cgEvent.type == .tapDisabledByTimeout { + CGEvent.tapEnable(tap: eventTap!, enable: true) } // focused app will receive the event return Unmanaged.passRetained(cgEvent)