56 lines
1.3 KiB
Swift
56 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 of EventMonitor")
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|