Files
Grapp/src/EventMonitor.swift
2025-01-03 16:05:03 -08:00

58 lines
1.3 KiB
Swift

import Cocoa
class EventMonitor {
fileprivate let mask: NSEvent.EventTypeMask
fileprivate var monitor: Any?
fileprivate init(mask: NSEvent.EventTypeMask) {
self.mask = mask
}
deinit {
stop()
}
func start() {
fatalError("start must be implemented by a subclass")
}
func stop() {
if monitor != nil {
NSEvent.removeMonitor(monitor!)
monitor = nil
}
}
}
final class LocalEventMonitor: EventMonitor {
typealias Handler = (NSEvent) -> NSEvent?
private let handler: Handler
init(mask: NSEvent.EventTypeMask, handler: @escaping Handler) {
self.handler = handler
super.init(mask: mask)
}
override func start() {
monitor = NSEvent.addLocalMonitorForEvents(matching: mask,
handler: handler)
}
}
final class GlobalEventMonitor: EventMonitor {
typealias Handler = (NSEvent) -> Void
private let handler: Handler
init(mask: NSEvent.EventTypeMask, handler: @escaping Handler) {
self.handler = handler
super.init(mask: mask)
}
override func start() {
monitor = NSEvent.addGlobalMonitorForEvents(matching: mask,
handler: handler)
}
}