diff options
Diffstat (limited to 'Sources/DDHotKey/DDHotKeyTranslation.swift')
| -rw-r--r-- | Sources/DDHotKey/DDHotKeyTranslation.swift | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/Sources/DDHotKey/DDHotKeyTranslation.swift b/Sources/DDHotKey/DDHotKeyTranslation.swift new file mode 100644 index 0000000..ce66d0d --- /dev/null +++ b/Sources/DDHotKey/DDHotKeyTranslation.swift @@ -0,0 +1,59 @@ +// +// DDHotKeyTranslation.swift +// DDHotKey +// +// Created by Dave DeLong on 8/28/19. +// + +import Cocoa +import Carbon + +fileprivate let standardModifiers: Dictionary<Int, NSEvent.ModifierFlags> = [ + kVK_Option: .option, + kVK_Shift: .shift, + kVK_Command: .command, + kVK_Control: .control +] + +internal func keyCodeAndModifiers(from string: String) -> (CGKeyCode, NSEvent.ModifierFlags)? { + var flags = NSEvent.ModifierFlags() + var keyCode: Int? + + for character in string { + guard let code = keycode(for: String(character)) else { return nil } + if let modifier = standardModifiers[code] { + flags.insert(modifier) + } else if keyCode == nil { + keyCode = code + } else { + return nil + } + } + + guard let code = keyCode else { return nil } + + return (CGKeyCode(code), flags) +} + +internal func stringFrom(keyCode: CGKeyCode, modifiers: NSEvent.ModifierFlags) -> String { + var final = "" + if modifiers.contains(.control) { + final += string(for: kVK_Control)! + } + if modifiers.contains(.option) { + final += string(for: kVK_Option)! + } + if modifiers.contains(.shift) { + final += string(for: kVK_Shift)! + } + if modifiers.contains(.command) { + final += string(for: kVK_Command)! + } + + if standardModifiers[Int(keyCode)] != nil { return final } + + if let mapped = string(for: Int(keyCode), carbonModifiers: carbonModifiers(from: modifiers)) { + final += mapped + } + return final +} |
