69 lines
2.2 KiB
Swift
69 lines
2.2 KiB
Swift
import Carbon
|
|
import OSLog
|
|
|
|
final class HotKeyManager {
|
|
static let shared = HotKeyManager()
|
|
|
|
private var eventType = EventTypeSpec(eventClass: OSType(kEventClassKeyboard), eventKind: UInt32(kEventHotKeyPressed))
|
|
private var eventHandlerRef: EventHandlerRef?
|
|
public var handler: EventHandlerUPP?
|
|
|
|
private var hotKeyRef: EventHotKeyRef?
|
|
private let hotKeyID: EventHotKeyID = EventHotKeyID(signature: OSType("grap".fourCharCodeValue), id: 1)
|
|
|
|
private init() {}
|
|
deinit {}
|
|
|
|
// TODO: Handle errors.
|
|
public func enable() {
|
|
if eventHandlerRef != nil {
|
|
disable()
|
|
}
|
|
|
|
let err = InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, &eventHandlerRef)
|
|
if err == noErr {
|
|
print("Installed event handler.")
|
|
} else {
|
|
print("Failed to install event handler.")
|
|
}
|
|
}
|
|
|
|
public func disable() {
|
|
guard eventHandlerRef != nil else { return }
|
|
let err = RemoveEventHandler(eventHandlerRef)
|
|
if err == noErr {
|
|
eventHandlerRef = nil // WARNING: Does it remove no matter what on error?
|
|
print("Removed event handler.")
|
|
} else {
|
|
print("Failed to remove event handler.")
|
|
}
|
|
}
|
|
|
|
// TODO: Handle errors.
|
|
// NOTE: Multiple modifiers should be ORed.
|
|
public func registerHotKey(key: Int, modifiers: Int) {
|
|
if hotKeyRef != nil {
|
|
unregisterHotKey()
|
|
}
|
|
|
|
let err = RegisterEventHotKey(UInt32(key), UInt32(modifiers), hotKeyID, GetApplicationEventTarget(), UInt32(kEventHotKeyNoOptions), &hotKeyRef)
|
|
if err == noErr {
|
|
print("Registered hot key.")
|
|
} else {
|
|
print("Failed to register hot key.")
|
|
}
|
|
}
|
|
|
|
// TODO: Handle errors.
|
|
public func unregisterHotKey() {
|
|
guard hotKeyRef != nil else { return }
|
|
let err = UnregisterEventHotKey(hotKeyRef)
|
|
if err == noErr {
|
|
hotKeyRef = nil // WARNING: Does it unregister no matter what on error?
|
|
print("Successfully unregistered hot key.")
|
|
} else {
|
|
print("Failed to unregistered hot key.")
|
|
}
|
|
}
|
|
}
|