10 #include <Carbon/Carbon.h>
36 const char *valueAsString =
"";
37 if (json_object_get_type(js) == json_type_string)
38 valueAsString = json_object_get_string(js);
42 if (! strcmp(valueAsString,
"any")) {
44 }
else if (! strcmp(valueAsString,
"A")) {
46 }
else if (! strcmp(valueAsString,
"S")) {
48 }
else if (! strcmp(valueAsString,
"D")) {
50 }
else if (! strcmp(valueAsString,
"F")) {
52 }
else if (! strcmp(valueAsString,
"H")) {
54 }
else if (! strcmp(valueAsString,
"G")) {
56 }
else if (! strcmp(valueAsString,
"Z")) {
58 }
else if (! strcmp(valueAsString,
"X")) {
60 }
else if (! strcmp(valueAsString,
"C")) {
62 }
else if (! strcmp(valueAsString,
"V")) {
64 }
else if (! strcmp(valueAsString,
"B")) {
66 }
else if (! strcmp(valueAsString,
"Q")) {
68 }
else if (! strcmp(valueAsString,
"W")) {
70 }
else if (! strcmp(valueAsString,
"E")) {
72 }
else if (! strcmp(valueAsString,
"R")) {
74 }
else if (! strcmp(valueAsString,
"Y")) {
76 }
else if (! strcmp(valueAsString,
"T")) {
78 }
else if (! strcmp(valueAsString,
"1")) {
80 }
else if (! strcmp(valueAsString,
"2")) {
82 }
else if (! strcmp(valueAsString,
"3")) {
84 }
else if (! strcmp(valueAsString,
"4")) {
86 }
else if (! strcmp(valueAsString,
"6")) {
88 }
else if (! strcmp(valueAsString,
"5")) {
90 }
else if (! strcmp(valueAsString,
"Equal")) {
92 }
else if (! strcmp(valueAsString,
"9")) {
94 }
else if (! strcmp(valueAsString,
"7")) {
96 }
else if (! strcmp(valueAsString,
"Minus")) {
98 }
else if (! strcmp(valueAsString,
"8")) {
100 }
else if (! strcmp(valueAsString,
"0")) {
102 }
else if (! strcmp(valueAsString,
"RightBracket")) {
103 value = VuoKey_RightBracket;
104 }
else if (! strcmp(valueAsString,
"O")) {
106 }
else if (! strcmp(valueAsString,
"U")) {
108 }
else if (! strcmp(valueAsString,
"LeftBracket")) {
109 value = VuoKey_LeftBracket;
110 }
else if (! strcmp(valueAsString,
"I")) {
112 }
else if (! strcmp(valueAsString,
"P")) {
114 }
else if (! strcmp(valueAsString,
"L")) {
116 }
else if (! strcmp(valueAsString,
"J")) {
118 }
else if (! strcmp(valueAsString,
"Quote")) {
119 value = VuoKey_Quote;
120 }
else if (! strcmp(valueAsString,
"K")) {
122 }
else if (! strcmp(valueAsString,
"Semicolon")) {
123 value = VuoKey_Semicolon;
124 }
else if (! strcmp(valueAsString,
"Backslash")) {
125 value = VuoKey_Backslash;
126 }
else if (! strcmp(valueAsString,
"Comma")) {
127 value = VuoKey_Comma;
128 }
else if (! strcmp(valueAsString,
"Slash")) {
129 value = VuoKey_Slash;
130 }
else if (! strcmp(valueAsString,
"N")) {
132 }
else if (! strcmp(valueAsString,
"M")) {
134 }
else if (! strcmp(valueAsString,
"Period")) {
135 value = VuoKey_Period;
136 }
else if (! strcmp(valueAsString,
"Grave")) {
137 value = VuoKey_Grave;
138 }
else if (! strcmp(valueAsString,
"KeypadDecimal")) {
139 value = VuoKey_KeypadDecimal;
140 }
else if (! strcmp(valueAsString,
"KeypadMultiply")) {
141 value = VuoKey_KeypadMultiply;
142 }
else if (! strcmp(valueAsString,
"KeypadPlus")) {
143 value = VuoKey_KeypadPlus;
144 }
else if (! strcmp(valueAsString,
"KeypadClear")) {
145 value = VuoKey_KeypadClear;
146 }
else if (! strcmp(valueAsString,
"KeypadDivide")) {
147 value = VuoKey_KeypadDivide;
148 }
else if (! strcmp(valueAsString,
"KeypadEnter")) {
149 value = VuoKey_KeypadEnter;
150 }
else if (! strcmp(valueAsString,
"KeypadMinus")) {
151 value = VuoKey_KeypadMinus;
152 }
else if (! strcmp(valueAsString,
"KeypadEquals")) {
153 value = VuoKey_KeypadEquals;
154 }
else if (! strcmp(valueAsString,
"Keypad0")) {
155 value = VuoKey_Keypad0;
156 }
else if (! strcmp(valueAsString,
"Keypad1")) {
157 value = VuoKey_Keypad1;
158 }
else if (! strcmp(valueAsString,
"Keypad2")) {
159 value = VuoKey_Keypad2;
160 }
else if (! strcmp(valueAsString,
"Keypad3")) {
161 value = VuoKey_Keypad3;
162 }
else if (! strcmp(valueAsString,
"Keypad4")) {
163 value = VuoKey_Keypad4;
164 }
else if (! strcmp(valueAsString,
"Keypad5")) {
165 value = VuoKey_Keypad5;
166 }
else if (! strcmp(valueAsString,
"Keypad6")) {
167 value = VuoKey_Keypad6;
168 }
else if (! strcmp(valueAsString,
"Keypad7")) {
169 value = VuoKey_Keypad7;
170 }
else if (! strcmp(valueAsString,
"Keypad8")) {
171 value = VuoKey_Keypad8;
172 }
else if (! strcmp(valueAsString,
"Keypad9")) {
173 value = VuoKey_Keypad9;
174 }
else if (! strcmp(valueAsString,
"Return")) {
175 value = VuoKey_Return;
176 }
else if (! strcmp(valueAsString,
"Tab")) {
178 }
else if (! strcmp(valueAsString,
"Space")) {
179 value = VuoKey_Space;
180 }
else if (! strcmp(valueAsString,
"Delete")) {
181 value = VuoKey_Delete;
182 }
else if (! strcmp(valueAsString,
"Escape")) {
183 value = VuoKey_Escape;
184 }
else if (! strcmp(valueAsString,
"Command")) {
185 value = VuoKey_Command;
186 }
else if (! strcmp(valueAsString,
"Shift")) {
187 value = VuoKey_Shift;
188 }
else if (! strcmp(valueAsString,
"CapsLock")) {
189 value = VuoKey_CapsLock;
190 }
else if (! strcmp(valueAsString,
"Option")) {
191 value = VuoKey_Option;
192 }
else if (! strcmp(valueAsString,
"Control")) {
193 value = VuoKey_Control;
194 }
else if (! strcmp(valueAsString,
"RightShift")) {
195 value = VuoKey_RightShift;
196 }
else if (! strcmp(valueAsString,
"RightOption")) {
197 value = VuoKey_RightOption;
198 }
else if (! strcmp(valueAsString,
"RightControl")) {
199 value = VuoKey_RightControl;
200 }
else if (! strcmp(valueAsString,
"Function")) {
201 value = VuoKey_Function;
202 }
else if (! strcmp(valueAsString,
"F17")) {
204 }
else if (! strcmp(valueAsString,
"VolumeUp")) {
205 value = VuoKey_VolumeUp;
206 }
else if (! strcmp(valueAsString,
"VolumeDown")) {
207 value = VuoKey_VolumeDown;
208 }
else if (! strcmp(valueAsString,
"Mute")) {
210 }
else if (! strcmp(valueAsString,
"F18")) {
212 }
else if (! strcmp(valueAsString,
"F19")) {
214 }
else if (! strcmp(valueAsString,
"F20")) {
216 }
else if (! strcmp(valueAsString,
"F5")) {
218 }
else if (! strcmp(valueAsString,
"F6")) {
220 }
else if (! strcmp(valueAsString,
"F7")) {
222 }
else if (! strcmp(valueAsString,
"F3")) {
224 }
else if (! strcmp(valueAsString,
"F8")) {
226 }
else if (! strcmp(valueAsString,
"F9")) {
228 }
else if (! strcmp(valueAsString,
"F11")) {
230 }
else if (! strcmp(valueAsString,
"F13")) {
232 }
else if (! strcmp(valueAsString,
"F16")) {
234 }
else if (! strcmp(valueAsString,
"F14")) {
236 }
else if (! strcmp(valueAsString,
"F10")) {
238 }
else if (! strcmp(valueAsString,
"F12")) {
240 }
else if (! strcmp(valueAsString,
"F15")) {
242 }
else if (! strcmp(valueAsString,
"Help")) {
244 }
else if (! strcmp(valueAsString,
"Home")) {
246 }
else if (! strcmp(valueAsString,
"PageUp")) {
247 value = VuoKey_PageUp;
248 }
else if (! strcmp(valueAsString,
"ForwardDelete")) {
249 value = VuoKey_ForwardDelete;
250 }
else if (! strcmp(valueAsString,
"F4")) {
252 }
else if (! strcmp(valueAsString,
"End")) {
254 }
else if (! strcmp(valueAsString,
"F2")) {
256 }
else if (! strcmp(valueAsString,
"PageDown")) {
257 value = VuoKey_PageDown;
258 }
else if (! strcmp(valueAsString,
"F1")) {
260 }
else if (! strcmp(valueAsString,
"LeftArrow")) {
261 value = VuoKey_LeftArrow;
262 }
else if (! strcmp(valueAsString,
"RightArrow")) {
263 value = VuoKey_RightArrow;
264 }
else if (! strcmp(valueAsString,
"DownArrow")) {
265 value = VuoKey_DownArrow;
266 }
else if (! strcmp(valueAsString,
"UpArrow")) {
267 value = VuoKey_UpArrow;
268 }
else if (! strcmp(valueAsString,
"Yen")) {
270 }
else if (! strcmp(valueAsString,
"Underscore")) {
271 value = VuoKey_Underscore;
272 }
else if (! strcmp(valueAsString,
"KeypadComma")) {
273 value = VuoKey_KeypadComma;
274 }
else if (! strcmp(valueAsString,
"Eisu")) {
276 }
else if (! strcmp(valueAsString,
"Kana")) {
289 char *valueAsString =
"";
293 valueAsString =
"any";
365 valueAsString =
"Equal";
374 valueAsString =
"Minus";
382 case VuoKey_RightBracket:
383 valueAsString =
"RightBracket";
391 case VuoKey_LeftBracket:
392 valueAsString =
"LeftBracket";
407 valueAsString =
"Quote";
412 case VuoKey_Semicolon:
413 valueAsString =
"Semicolon";
415 case VuoKey_Backslash:
416 valueAsString =
"Backslash";
419 valueAsString =
"Comma";
422 valueAsString =
"Slash";
431 valueAsString =
"Period";
434 valueAsString =
"Grave";
436 case VuoKey_KeypadDecimal:
437 valueAsString =
"KeypadDecimal";
439 case VuoKey_KeypadMultiply:
440 valueAsString =
"KeypadMultiply";
442 case VuoKey_KeypadPlus:
443 valueAsString =
"KeypadPlus";
445 case VuoKey_KeypadClear:
446 valueAsString =
"KeypadClear";
448 case VuoKey_KeypadDivide:
449 valueAsString =
"KeypadDivide";
451 case VuoKey_KeypadEnter:
452 valueAsString =
"KeypadEnter";
454 case VuoKey_KeypadMinus:
455 valueAsString =
"KeypadMinus";
457 case VuoKey_KeypadEquals:
458 valueAsString =
"KeypadEquals";
461 valueAsString =
"Keypad0";
464 valueAsString =
"Keypad1";
467 valueAsString =
"Keypad2";
470 valueAsString =
"Keypad3";
473 valueAsString =
"Keypad4";
476 valueAsString =
"Keypad5";
479 valueAsString =
"Keypad6";
482 valueAsString =
"Keypad7";
485 valueAsString =
"Keypad8";
488 valueAsString =
"Keypad9";
491 valueAsString =
"Return";
494 valueAsString =
"Tab";
497 valueAsString =
"Space";
500 valueAsString =
"Delete";
503 valueAsString =
"Escape";
506 valueAsString =
"Command";
509 valueAsString =
"Shift";
511 case VuoKey_CapsLock:
512 valueAsString =
"CapsLock";
515 valueAsString =
"Option";
518 valueAsString =
"Control";
520 case VuoKey_RightShift:
521 valueAsString =
"RightShift";
523 case VuoKey_RightOption:
524 valueAsString =
"RightOption";
526 case VuoKey_RightControl:
527 valueAsString =
"RightControl";
529 case VuoKey_Function:
530 valueAsString =
"Function";
533 valueAsString =
"F17";
535 case VuoKey_VolumeUp:
536 valueAsString =
"VolumeUp";
538 case VuoKey_VolumeDown:
539 valueAsString =
"VolumeDown";
542 valueAsString =
"Mute";
545 valueAsString =
"F18";
548 valueAsString =
"F19";
551 valueAsString =
"F20";
554 valueAsString =
"F5";
557 valueAsString =
"F6";
560 valueAsString =
"F7";
563 valueAsString =
"F3";
566 valueAsString =
"F8";
569 valueAsString =
"F9";
572 valueAsString =
"F11";
575 valueAsString =
"F13";
578 valueAsString =
"F16";
581 valueAsString =
"F14";
584 valueAsString =
"F10";
587 valueAsString =
"F12";
590 valueAsString =
"F15";
593 valueAsString =
"Help";
596 valueAsString =
"Home";
599 valueAsString =
"PageUp";
601 case VuoKey_ForwardDelete:
602 valueAsString =
"ForwardDelete";
605 valueAsString =
"F4";
608 valueAsString =
"End";
611 valueAsString =
"F2";
613 case VuoKey_PageDown:
614 valueAsString =
"PageDown";
617 valueAsString =
"F1";
619 case VuoKey_LeftArrow:
620 valueAsString =
"LeftArrow";
622 case VuoKey_RightArrow:
623 valueAsString =
"RightArrow";
625 case VuoKey_DownArrow:
626 valueAsString =
"DownArrow";
629 valueAsString =
"UpArrow";
632 valueAsString =
"Yen";
634 case VuoKey_Underscore:
635 valueAsString =
"Underscore";
637 case VuoKey_KeypadComma:
638 valueAsString =
"KeypadComma";
641 valueAsString =
"Eisu";
644 valueAsString =
"Kana";
648 return json_object_new_string(valueAsString);
657 for (
VuoKey key = VuoKey_Any; key <= VuoKey_Kana; ++key)
669 bool isVisibleChar =
true;
673 keyCode = kVK_ANSI_A;
676 keyCode = kVK_ANSI_S;
679 keyCode = kVK_ANSI_D;
682 keyCode = kVK_ANSI_F;
685 keyCode = kVK_ANSI_H;
688 keyCode = kVK_ANSI_G;
691 keyCode = kVK_ANSI_Z;
694 keyCode = kVK_ANSI_X;
697 keyCode = kVK_ANSI_C;
700 keyCode = kVK_ANSI_V;
703 keyCode = kVK_ANSI_B;
706 keyCode = kVK_ANSI_Q;
709 keyCode = kVK_ANSI_W;
712 keyCode = kVK_ANSI_E;
715 keyCode = kVK_ANSI_R;
718 keyCode = kVK_ANSI_Y;
721 keyCode = kVK_ANSI_T;
724 keyCode = kVK_ANSI_1;
727 keyCode = kVK_ANSI_2;
730 keyCode = kVK_ANSI_3;
733 keyCode = kVK_ANSI_4;
736 keyCode = kVK_ANSI_6;
739 keyCode = kVK_ANSI_5;
742 keyCode = kVK_ANSI_Equal;
745 keyCode = kVK_ANSI_9;
748 keyCode = kVK_ANSI_7;
751 keyCode = kVK_ANSI_Minus;
754 keyCode = kVK_ANSI_8;
757 keyCode = kVK_ANSI_0;
759 case VuoKey_RightBracket:
760 keyCode = kVK_ANSI_RightBracket;
763 keyCode = kVK_ANSI_O;
766 keyCode = kVK_ANSI_U;
768 case VuoKey_LeftBracket:
769 keyCode = kVK_ANSI_LeftBracket;
772 keyCode = kVK_ANSI_I;
775 keyCode = kVK_ANSI_P;
778 keyCode = kVK_ANSI_L;
781 keyCode = kVK_ANSI_J;
784 keyCode = kVK_ANSI_Quote;
787 keyCode = kVK_ANSI_K;
789 case VuoKey_Semicolon:
790 keyCode = kVK_ANSI_Semicolon;
792 case VuoKey_Backslash:
793 keyCode = kVK_ANSI_Backslash;
796 keyCode = kVK_ANSI_Comma;
799 keyCode = kVK_ANSI_Slash;
802 keyCode = kVK_ANSI_N;
805 keyCode = kVK_ANSI_M;
808 keyCode = kVK_ANSI_Period;
811 keyCode = kVK_ANSI_Grave;
813 case VuoKey_KeypadDecimal:
814 keyCode = kVK_ANSI_KeypadDecimal;
816 case VuoKey_KeypadMultiply:
817 keyCode = kVK_ANSI_KeypadMultiply;
819 case VuoKey_KeypadPlus:
820 keyCode = kVK_ANSI_KeypadPlus;
822 case VuoKey_KeypadClear:
823 keyCode = kVK_ANSI_KeypadClear;
825 case VuoKey_KeypadDivide:
826 keyCode = kVK_ANSI_KeypadDivide;
828 case VuoKey_KeypadEnter:
829 keyCode = kVK_ANSI_KeypadEnter;
831 case VuoKey_KeypadMinus:
832 keyCode = kVK_ANSI_KeypadMinus;
834 case VuoKey_KeypadEquals:
835 keyCode = kVK_ANSI_KeypadEquals;
838 keyCode = kVK_ANSI_Keypad0;
841 keyCode = kVK_ANSI_Keypad1;
844 keyCode = kVK_ANSI_Keypad2;
847 keyCode = kVK_ANSI_Keypad3;
850 keyCode = kVK_ANSI_Keypad4;
853 keyCode = kVK_ANSI_Keypad5;
856 keyCode = kVK_ANSI_Keypad6;
859 keyCode = kVK_ANSI_Keypad7;
862 keyCode = kVK_ANSI_Keypad8;
865 keyCode = kVK_ANSI_Keypad9;
868 keyCode = kVK_JIS_Yen;
870 case VuoKey_Underscore:
871 keyCode = kVK_JIS_Underscore;
873 case VuoKey_KeypadComma:
874 keyCode = kVK_JIS_KeypadComma;
877 keyCode = kVK_JIS_Eisu;
880 keyCode = kVK_JIS_Kana;
884 isVisibleChar =
false;
887 char *summary = NULL;
891 UInt32 deadKeyState = 0;
895 isVisibleChar =
false;
896 else if (strlen(summary) == 0 || (strlen(summary) == 1 && summary[0] <=
' '))
899 isVisibleChar =
false;
906 if (value == VuoKey_KeypadClear)
907 summary = strdup(
"Keypad Clear");
908 else if (value == VuoKey_KeypadEnter)
909 summary = strdup(
"Keypad Enter");
910 else if (value == VuoKey_KeypadComma)
911 summary = strdup(
"Keypad ,");
915 const char *keyAsString = json_object_get_string(keyAsJson);
916 summary = strdup(keyAsString);
917 json_object_put(keyAsJson);
921 if (isVisibleChar && ((VuoKey_KeypadDecimal <= value && value <= VuoKey_Keypad9) || value == VuoKey_KeypadComma))
923 const char *prefix =
"Keypad ";
924 size_t mallocSize = strlen(summary) + strlen(prefix) + 1;
925 char *tmp = malloc(mallocSize);
926 strlcpy(tmp, prefix, mallocSize);
927 strlcat(tmp, summary, mallocSize);
948 __block
char *characters = NULL;
954 TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
955 CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
958 const UCKeyboardLayout *keyboardLayout = (
const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
960 UInt32 modifierKeyState = (flags >> 16) & 0xFF;
962 const UniCharCount unicodeStringLength = 4;
963 UniChar unicodeString[unicodeStringLength];
964 UniCharCount realLength;
966 UCKeyTranslate(keyboardLayout,
976 CFRelease(currentKeyboard);
977 CFStringRef cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeString, (CFIndex)realLength);
981 characters = strdup(t);
1040 case kVK_ANSI_Equal:
1041 return VuoKey_Equal;
1046 case kVK_ANSI_Minus:
1047 return VuoKey_Minus;
1052 case kVK_ANSI_RightBracket:
1053 return VuoKey_RightBracket;
1058 case kVK_ANSI_LeftBracket:
1059 return VuoKey_LeftBracket;
1068 case kVK_ANSI_Quote:
1069 return VuoKey_Quote;
1072 case kVK_ANSI_Semicolon:
1073 return VuoKey_Semicolon;
1074 case kVK_ANSI_Backslash:
1075 return VuoKey_Backslash;
1076 case kVK_ANSI_Comma:
1077 return VuoKey_Comma;
1078 case kVK_ANSI_Slash:
1079 return VuoKey_Slash;
1084 case kVK_ANSI_Period:
1085 return VuoKey_Period;
1086 case kVK_ANSI_Grave:
1087 return VuoKey_Grave;
1088 case kVK_ANSI_KeypadDecimal:
1089 return VuoKey_KeypadDecimal;
1090 case kVK_ANSI_KeypadMultiply:
1091 return VuoKey_KeypadMultiply;
1092 case kVK_ANSI_KeypadPlus:
1093 return VuoKey_KeypadPlus;
1094 case kVK_ANSI_KeypadClear:
1095 return VuoKey_KeypadClear;
1096 case kVK_ANSI_KeypadDivide:
1097 return VuoKey_KeypadDivide;
1098 case kVK_ANSI_KeypadEnter:
1099 return VuoKey_KeypadEnter;
1100 case kVK_ANSI_KeypadMinus:
1101 return VuoKey_KeypadMinus;
1102 case kVK_ANSI_KeypadEquals:
1103 return VuoKey_KeypadEquals;
1104 case kVK_ANSI_Keypad0:
1105 return VuoKey_Keypad0;
1106 case kVK_ANSI_Keypad1:
1107 return VuoKey_Keypad1;
1108 case kVK_ANSI_Keypad2:
1109 return VuoKey_Keypad2;
1110 case kVK_ANSI_Keypad3:
1111 return VuoKey_Keypad3;
1112 case kVK_ANSI_Keypad4:
1113 return VuoKey_Keypad4;
1114 case kVK_ANSI_Keypad5:
1115 return VuoKey_Keypad5;
1116 case kVK_ANSI_Keypad6:
1117 return VuoKey_Keypad6;
1118 case kVK_ANSI_Keypad7:
1119 return VuoKey_Keypad7;
1120 case kVK_ANSI_Keypad8:
1121 return VuoKey_Keypad8;
1122 case kVK_ANSI_Keypad9:
1123 return VuoKey_Keypad9;
1125 return VuoKey_Return;
1129 return VuoKey_Space;
1131 return VuoKey_Delete;
1133 return VuoKey_Escape;
1135 return VuoKey_Command;
1137 return VuoKey_Shift;
1139 return VuoKey_CapsLock;
1141 return VuoKey_Option;
1143 return VuoKey_Control;
1144 case kVK_RightShift:
1145 return VuoKey_RightShift;
1146 case kVK_RightOption:
1147 return VuoKey_RightOption;
1148 case kVK_RightControl:
1149 return VuoKey_RightControl;
1151 return VuoKey_Function;
1155 return VuoKey_VolumeUp;
1156 case kVK_VolumeDown:
1157 return VuoKey_VolumeDown;
1197 return VuoKey_PageUp;
1198 case kVK_ForwardDelete:
1199 return VuoKey_ForwardDelete;
1207 return VuoKey_PageDown;
1211 return VuoKey_LeftArrow;
1212 case kVK_RightArrow:
1213 return VuoKey_RightArrow;
1215 return VuoKey_DownArrow;
1217 return VuoKey_UpArrow;
1220 case kVK_JIS_Underscore:
1221 return VuoKey_Underscore;
1222 case kVK_JIS_KeypadComma:
1223 return VuoKey_KeypadComma;
1238 if (key == VuoKey_Any)