summaryrefslogtreecommitdiffstats
path: root/Sources/DDHotKey/DDHotKeyTranslation.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sources/DDHotKey/DDHotKeyTranslation.swift')
-rw-r--r--Sources/DDHotKey/DDHotKeyTranslation.swift59
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
+}