Initial commit.

This commit is contained in:
2024-12-27 15:25:41 -08:00
commit d6e097506a
26 changed files with 1433 additions and 0 deletions

74
src/GlobalEventTap.swift Normal file
View File

@@ -0,0 +1,74 @@
import AppKit
import Carbon
import OSLog
fileprivate func handleGlobalEvents(proxy: CGEventTapProxy,
type: CGEventType, event: CGEvent,
refcon: UnsafeMutableRawPointer?
) -> Unmanaged<CGEvent>? {
let logger = Logger(
subsystem: Bundle.main.bundleIdentifier!,
category: String(describing: AppDelegate.self)
)
switch type {
case .keyDown:
//logger.debug(".keyDown")
if (event.flags.rawValue & CGEventFlags.maskAlternate.rawValue) == CGEventFlags.maskAlternate.rawValue &&
(event.flags.rawValue & (CGEventFlags.maskShift.rawValue | CGEventFlags.maskControl.rawValue | CGEventFlags.maskCommand.rawValue)) == 0 {
logger.debug("maskAlternate")
}
logger.debug("Option rawValue=\(CGEventFlags.maskAlternate.rawValue)")
// var keyCode = event.getIntegerValueField(.keyboardEventKeycode)
//if keyCode == 49 {
// logger.debug("EVENT TAP")
// return nil
//}
case .keyUp:
//logger.debug(".keyUp")
break
default:
break
}
//event.setIntegerValueField(.keyboardEventKeycode, value: keyCode) // NOTE: ???
return Unmanaged.passUnretained(event)
}
final class GlobalEventTap {
fileprivate static let logger = Logger(
subsystem: Bundle.main.bundleIdentifier!,
category: String(describing: GlobalEventTap.self)
)
static let shared = GlobalEventTap()
private init() {}
deinit {}
func enable() {
let eventMask = (1 << CGEventType.keyDown.rawValue) | (1 << CGEventType.keyUp.rawValue)
guard let eventTap = CGEvent.tapCreate(tap: .cgSessionEventTap,
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: CGEventMask(eventMask),
callback: handleGlobalEvents,
userInfo: nil) else {
Self.logger.debug("Failed to create event.")
return
}
Self.logger.debug("Event was created.")
let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes)
CGEvent.tapEnable(tap: eventTap, enable: true)
CFRunLoopRun()
}
}