import CoreGraphics
|
import Foundation
|
|
enum PostKeyError: Error, CustomStringConvertible {
|
case unsupportedArguments([String])
|
case eventCreationFailed
|
|
var description: String {
|
switch self {
|
case .unsupportedArguments(let arguments):
|
return "Unsupported post-round1-key arguments: \(arguments.joined(separator: " "))"
|
case .eventCreationFailed:
|
return "CGEvent creation failed."
|
}
|
}
|
}
|
|
struct KeySpec {
|
let keyCode: CGKeyCode
|
let flags: CGEventFlags
|
|
static func parse(arguments: [String]) throws -> KeySpec {
|
if arguments.contains("--option-tab") {
|
return KeySpec(keyCode: 48, flags: .maskAlternate)
|
}
|
if arguments.contains("--escape") {
|
return KeySpec(keyCode: 53, flags: [])
|
}
|
if arguments.contains("--command-option-escape") {
|
return KeySpec(keyCode: 53, flags: [.maskCommand, .maskAlternate])
|
}
|
|
throw PostKeyError.unsupportedArguments(arguments)
|
}
|
}
|
|
func post(_ spec: KeySpec, keyDown: Bool, source: CGEventSource?) throws {
|
guard let event = CGEvent(keyboardEventSource: source, virtualKey: spec.keyCode, keyDown: keyDown) else {
|
throw PostKeyError.eventCreationFailed
|
}
|
|
event.flags = keyDown ? spec.flags : []
|
event.post(tap: .cghidEventTap)
|
}
|
|
do {
|
let spec = try KeySpec.parse(arguments: Array(CommandLine.arguments.dropFirst()))
|
let source = CGEventSource(stateID: .combinedSessionState)
|
try post(spec, keyDown: true, source: source)
|
usleep(80_000)
|
try post(spec, keyDown: false, source: source)
|
} catch {
|
fputs("post-round1-key failed: \(error)\n", stderr)
|
exit(1)
|
}
|