11 #include <Carbon/Carbon.h>
38 const char *valueAsString =
"";
39 if (json_object_get_type(js) == json_type_string)
40 valueAsString = json_object_get_string(js);
44 if (! strcmp(valueAsString,
"any")) {
46 }
else if (! strcmp(valueAsString,
"A")) {
48 }
else if (! strcmp(valueAsString,
"S")) {
50 }
else if (! strcmp(valueAsString,
"D")) {
52 }
else if (! strcmp(valueAsString,
"F")) {
54 }
else if (! strcmp(valueAsString,
"H")) {
56 }
else if (! strcmp(valueAsString,
"G")) {
58 }
else if (! strcmp(valueAsString,
"Z")) {
60 }
else if (! strcmp(valueAsString,
"X")) {
62 }
else if (! strcmp(valueAsString,
"C")) {
64 }
else if (! strcmp(valueAsString,
"V")) {
66 }
else if (! strcmp(valueAsString,
"B")) {
68 }
else if (! strcmp(valueAsString,
"Q")) {
70 }
else if (! strcmp(valueAsString,
"W")) {
72 }
else if (! strcmp(valueAsString,
"E")) {
74 }
else if (! strcmp(valueAsString,
"R")) {
76 }
else if (! strcmp(valueAsString,
"Y")) {
78 }
else if (! strcmp(valueAsString,
"T")) {
80 }
else if (! strcmp(valueAsString,
"1")) {
82 }
else if (! strcmp(valueAsString,
"2")) {
84 }
else if (! strcmp(valueAsString,
"3")) {
86 }
else if (! strcmp(valueAsString,
"4")) {
88 }
else if (! strcmp(valueAsString,
"6")) {
90 }
else if (! strcmp(valueAsString,
"5")) {
92 }
else if (! strcmp(valueAsString,
"Equal")) {
94 }
else if (! strcmp(valueAsString,
"9")) {
96 }
else if (! strcmp(valueAsString,
"7")) {
98 }
else if (! strcmp(valueAsString,
"Minus")) {
100 }
else if (! strcmp(valueAsString,
"8")) {
102 }
else if (! strcmp(valueAsString,
"0")) {
104 }
else if (! strcmp(valueAsString,
"RightBracket")) {
105 value = VuoKey_RightBracket;
106 }
else if (! strcmp(valueAsString,
"O")) {
108 }
else if (! strcmp(valueAsString,
"U")) {
110 }
else if (! strcmp(valueAsString,
"LeftBracket")) {
111 value = VuoKey_LeftBracket;
112 }
else if (! strcmp(valueAsString,
"I")) {
114 }
else if (! strcmp(valueAsString,
"P")) {
116 }
else if (! strcmp(valueAsString,
"L")) {
118 }
else if (! strcmp(valueAsString,
"J")) {
120 }
else if (! strcmp(valueAsString,
"Quote")) {
121 value = VuoKey_Quote;
122 }
else if (! strcmp(valueAsString,
"K")) {
124 }
else if (! strcmp(valueAsString,
"Semicolon")) {
125 value = VuoKey_Semicolon;
126 }
else if (! strcmp(valueAsString,
"Backslash")) {
127 value = VuoKey_Backslash;
128 }
else if (! strcmp(valueAsString,
"Comma")) {
129 value = VuoKey_Comma;
130 }
else if (! strcmp(valueAsString,
"Slash")) {
131 value = VuoKey_Slash;
132 }
else if (! strcmp(valueAsString,
"N")) {
134 }
else if (! strcmp(valueAsString,
"M")) {
136 }
else if (! strcmp(valueAsString,
"Period")) {
137 value = VuoKey_Period;
138 }
else if (! strcmp(valueAsString,
"Grave")) {
139 value = VuoKey_Grave;
140 }
else if (! strcmp(valueAsString,
"KeypadDecimal")) {
141 value = VuoKey_KeypadDecimal;
142 }
else if (! strcmp(valueAsString,
"KeypadMultiply")) {
143 value = VuoKey_KeypadMultiply;
144 }
else if (! strcmp(valueAsString,
"KeypadPlus")) {
145 value = VuoKey_KeypadPlus;
146 }
else if (! strcmp(valueAsString,
"KeypadClear")) {
147 value = VuoKey_KeypadClear;
148 }
else if (! strcmp(valueAsString,
"KeypadDivide")) {
149 value = VuoKey_KeypadDivide;
150 }
else if (! strcmp(valueAsString,
"KeypadEnter")) {
151 value = VuoKey_KeypadEnter;
152 }
else if (! strcmp(valueAsString,
"KeypadMinus")) {
153 value = VuoKey_KeypadMinus;
154 }
else if (! strcmp(valueAsString,
"KeypadEquals")) {
155 value = VuoKey_KeypadEquals;
156 }
else if (! strcmp(valueAsString,
"Keypad0")) {
157 value = VuoKey_Keypad0;
158 }
else if (! strcmp(valueAsString,
"Keypad1")) {
159 value = VuoKey_Keypad1;
160 }
else if (! strcmp(valueAsString,
"Keypad2")) {
161 value = VuoKey_Keypad2;
162 }
else if (! strcmp(valueAsString,
"Keypad3")) {
163 value = VuoKey_Keypad3;
164 }
else if (! strcmp(valueAsString,
"Keypad4")) {
165 value = VuoKey_Keypad4;
166 }
else if (! strcmp(valueAsString,
"Keypad5")) {
167 value = VuoKey_Keypad5;
168 }
else if (! strcmp(valueAsString,
"Keypad6")) {
169 value = VuoKey_Keypad6;
170 }
else if (! strcmp(valueAsString,
"Keypad7")) {
171 value = VuoKey_Keypad7;
172 }
else if (! strcmp(valueAsString,
"Keypad8")) {
173 value = VuoKey_Keypad8;
174 }
else if (! strcmp(valueAsString,
"Keypad9")) {
175 value = VuoKey_Keypad9;
176 }
else if (! strcmp(valueAsString,
"Return")) {
177 value = VuoKey_Return;
178 }
else if (! strcmp(valueAsString,
"Tab")) {
180 }
else if (! strcmp(valueAsString,
"Space")) {
181 value = VuoKey_Space;
182 }
else if (! strcmp(valueAsString,
"Delete")) {
183 value = VuoKey_Delete;
184 }
else if (! strcmp(valueAsString,
"Escape")) {
185 value = VuoKey_Escape;
186 }
else if (! strcmp(valueAsString,
"Command")) {
187 value = VuoKey_Command;
188 }
else if (! strcmp(valueAsString,
"Shift")) {
189 value = VuoKey_Shift;
190 }
else if (! strcmp(valueAsString,
"CapsLock")) {
191 value = VuoKey_CapsLock;
192 }
else if (! strcmp(valueAsString,
"Option")) {
193 value = VuoKey_Option;
194 }
else if (! strcmp(valueAsString,
"Control")) {
195 value = VuoKey_Control;
196 }
else if (! strcmp(valueAsString,
"RightShift")) {
197 value = VuoKey_RightShift;
198 }
else if (! strcmp(valueAsString,
"RightOption")) {
199 value = VuoKey_RightOption;
200 }
else if (! strcmp(valueAsString,
"RightControl")) {
201 value = VuoKey_RightControl;
202 }
else if (! strcmp(valueAsString,
"Function")) {
203 value = VuoKey_Function;
204 }
else if (! strcmp(valueAsString,
"F17")) {
206 }
else if (! strcmp(valueAsString,
"VolumeUp")) {
207 value = VuoKey_VolumeUp;
208 }
else if (! strcmp(valueAsString,
"VolumeDown")) {
209 value = VuoKey_VolumeDown;
210 }
else if (! strcmp(valueAsString,
"Mute")) {
212 }
else if (! strcmp(valueAsString,
"F18")) {
214 }
else if (! strcmp(valueAsString,
"F19")) {
216 }
else if (! strcmp(valueAsString,
"F20")) {
218 }
else if (! strcmp(valueAsString,
"F5")) {
220 }
else if (! strcmp(valueAsString,
"F6")) {
222 }
else if (! strcmp(valueAsString,
"F7")) {
224 }
else if (! strcmp(valueAsString,
"F3")) {
226 }
else if (! strcmp(valueAsString,
"F8")) {
228 }
else if (! strcmp(valueAsString,
"F9")) {
230 }
else if (! strcmp(valueAsString,
"F11")) {
232 }
else if (! strcmp(valueAsString,
"F13")) {
234 }
else if (! strcmp(valueAsString,
"F16")) {
236 }
else if (! strcmp(valueAsString,
"F14")) {
238 }
else if (! strcmp(valueAsString,
"F10")) {
240 }
else if (! strcmp(valueAsString,
"F12")) {
242 }
else if (! strcmp(valueAsString,
"F15")) {
244 }
else if (! strcmp(valueAsString,
"Help")) {
246 }
else if (! strcmp(valueAsString,
"Home")) {
248 }
else if (! strcmp(valueAsString,
"PageUp")) {
249 value = VuoKey_PageUp;
250 }
else if (! strcmp(valueAsString,
"ForwardDelete")) {
251 value = VuoKey_ForwardDelete;
252 }
else if (! strcmp(valueAsString,
"F4")) {
254 }
else if (! strcmp(valueAsString,
"End")) {
256 }
else if (! strcmp(valueAsString,
"F2")) {
258 }
else if (! strcmp(valueAsString,
"PageDown")) {
259 value = VuoKey_PageDown;
260 }
else if (! strcmp(valueAsString,
"F1")) {
262 }
else if (! strcmp(valueAsString,
"LeftArrow")) {
263 value = VuoKey_LeftArrow;
264 }
else if (! strcmp(valueAsString,
"RightArrow")) {
265 value = VuoKey_RightArrow;
266 }
else if (! strcmp(valueAsString,
"DownArrow")) {
267 value = VuoKey_DownArrow;
268 }
else if (! strcmp(valueAsString,
"UpArrow")) {
269 value = VuoKey_UpArrow;
270 }
else if (! strcmp(valueAsString,
"Yen")) {
272 }
else if (! strcmp(valueAsString,
"Underscore")) {
273 value = VuoKey_Underscore;
274 }
else if (! strcmp(valueAsString,
"KeypadComma")) {
275 value = VuoKey_KeypadComma;
276 }
else if (! strcmp(valueAsString,
"Eisu")) {
278 }
else if (! strcmp(valueAsString,
"Kana")) {
291 char *valueAsString =
"";
295 valueAsString =
"any";
367 valueAsString =
"Equal";
376 valueAsString =
"Minus";
384 case VuoKey_RightBracket:
385 valueAsString =
"RightBracket";
393 case VuoKey_LeftBracket:
394 valueAsString =
"LeftBracket";
409 valueAsString =
"Quote";
414 case VuoKey_Semicolon:
415 valueAsString =
"Semicolon";
417 case VuoKey_Backslash:
418 valueAsString =
"Backslash";
421 valueAsString =
"Comma";
424 valueAsString =
"Slash";
433 valueAsString =
"Period";
436 valueAsString =
"Grave";
438 case VuoKey_KeypadDecimal:
439 valueAsString =
"KeypadDecimal";
441 case VuoKey_KeypadMultiply:
442 valueAsString =
"KeypadMultiply";
444 case VuoKey_KeypadPlus:
445 valueAsString =
"KeypadPlus";
447 case VuoKey_KeypadClear:
448 valueAsString =
"KeypadClear";
450 case VuoKey_KeypadDivide:
451 valueAsString =
"KeypadDivide";
453 case VuoKey_KeypadEnter:
454 valueAsString =
"KeypadEnter";
456 case VuoKey_KeypadMinus:
457 valueAsString =
"KeypadMinus";
459 case VuoKey_KeypadEquals:
460 valueAsString =
"KeypadEquals";
463 valueAsString =
"Keypad0";
466 valueAsString =
"Keypad1";
469 valueAsString =
"Keypad2";
472 valueAsString =
"Keypad3";
475 valueAsString =
"Keypad4";
478 valueAsString =
"Keypad5";
481 valueAsString =
"Keypad6";
484 valueAsString =
"Keypad7";
487 valueAsString =
"Keypad8";
490 valueAsString =
"Keypad9";
493 valueAsString =
"Return";
496 valueAsString =
"Tab";
499 valueAsString =
"Space";
502 valueAsString =
"Delete";
505 valueAsString =
"Escape";
508 valueAsString =
"Command";
511 valueAsString =
"Shift";
513 case VuoKey_CapsLock:
514 valueAsString =
"CapsLock";
517 valueAsString =
"Option";
520 valueAsString =
"Control";
522 case VuoKey_RightShift:
523 valueAsString =
"RightShift";
525 case VuoKey_RightOption:
526 valueAsString =
"RightOption";
528 case VuoKey_RightControl:
529 valueAsString =
"RightControl";
531 case VuoKey_Function:
532 valueAsString =
"Function";
535 valueAsString =
"F17";
537 case VuoKey_VolumeUp:
538 valueAsString =
"VolumeUp";
540 case VuoKey_VolumeDown:
541 valueAsString =
"VolumeDown";
544 valueAsString =
"Mute";
547 valueAsString =
"F18";
550 valueAsString =
"F19";
553 valueAsString =
"F20";
556 valueAsString =
"F5";
559 valueAsString =
"F6";
562 valueAsString =
"F7";
565 valueAsString =
"F3";
568 valueAsString =
"F8";
571 valueAsString =
"F9";
574 valueAsString =
"F11";
577 valueAsString =
"F13";
580 valueAsString =
"F16";
583 valueAsString =
"F14";
586 valueAsString =
"F10";
589 valueAsString =
"F12";
592 valueAsString =
"F15";
595 valueAsString =
"Help";
598 valueAsString =
"Home";
601 valueAsString =
"PageUp";
603 case VuoKey_ForwardDelete:
604 valueAsString =
"ForwardDelete";
607 valueAsString =
"F4";
610 valueAsString =
"End";
613 valueAsString =
"F2";
615 case VuoKey_PageDown:
616 valueAsString =
"PageDown";
619 valueAsString =
"F1";
621 case VuoKey_LeftArrow:
622 valueAsString =
"LeftArrow";
624 case VuoKey_RightArrow:
625 valueAsString =
"RightArrow";
627 case VuoKey_DownArrow:
628 valueAsString =
"DownArrow";
631 valueAsString =
"UpArrow";
634 valueAsString =
"Yen";
636 case VuoKey_Underscore:
637 valueAsString =
"Underscore";
639 case VuoKey_KeypadComma:
640 valueAsString =
"KeypadComma";
643 valueAsString =
"Eisu";
646 valueAsString =
"Kana";
650 return json_object_new_string(valueAsString);
659 for (
VuoKey key = VuoKey_Any; key <= VuoKey_Kana; ++key)
671 bool isVisibleChar =
true;
675 keyCode = kVK_ANSI_A;
678 keyCode = kVK_ANSI_S;
681 keyCode = kVK_ANSI_D;
684 keyCode = kVK_ANSI_F;
687 keyCode = kVK_ANSI_H;
690 keyCode = kVK_ANSI_G;
693 keyCode = kVK_ANSI_Z;
696 keyCode = kVK_ANSI_X;
699 keyCode = kVK_ANSI_C;
702 keyCode = kVK_ANSI_V;
705 keyCode = kVK_ANSI_B;
708 keyCode = kVK_ANSI_Q;
711 keyCode = kVK_ANSI_W;
714 keyCode = kVK_ANSI_E;
717 keyCode = kVK_ANSI_R;
720 keyCode = kVK_ANSI_Y;
723 keyCode = kVK_ANSI_T;
726 keyCode = kVK_ANSI_1;
729 keyCode = kVK_ANSI_2;
732 keyCode = kVK_ANSI_3;
735 keyCode = kVK_ANSI_4;
738 keyCode = kVK_ANSI_6;
741 keyCode = kVK_ANSI_5;
744 keyCode = kVK_ANSI_Equal;
747 keyCode = kVK_ANSI_9;
750 keyCode = kVK_ANSI_7;
753 keyCode = kVK_ANSI_Minus;
756 keyCode = kVK_ANSI_8;
759 keyCode = kVK_ANSI_0;
761 case VuoKey_RightBracket:
762 keyCode = kVK_ANSI_RightBracket;
765 keyCode = kVK_ANSI_O;
768 keyCode = kVK_ANSI_U;
770 case VuoKey_LeftBracket:
771 keyCode = kVK_ANSI_LeftBracket;
774 keyCode = kVK_ANSI_I;
777 keyCode = kVK_ANSI_P;
780 keyCode = kVK_ANSI_L;
783 keyCode = kVK_ANSI_J;
786 keyCode = kVK_ANSI_Quote;
789 keyCode = kVK_ANSI_K;
791 case VuoKey_Semicolon:
792 keyCode = kVK_ANSI_Semicolon;
794 case VuoKey_Backslash:
795 keyCode = kVK_ANSI_Backslash;
798 keyCode = kVK_ANSI_Comma;
801 keyCode = kVK_ANSI_Slash;
804 keyCode = kVK_ANSI_N;
807 keyCode = kVK_ANSI_M;
810 keyCode = kVK_ANSI_Period;
813 keyCode = kVK_ANSI_Grave;
815 case VuoKey_KeypadDecimal:
816 keyCode = kVK_ANSI_KeypadDecimal;
818 case VuoKey_KeypadMultiply:
819 keyCode = kVK_ANSI_KeypadMultiply;
821 case VuoKey_KeypadPlus:
822 keyCode = kVK_ANSI_KeypadPlus;
824 case VuoKey_KeypadClear:
825 keyCode = kVK_ANSI_KeypadClear;
827 case VuoKey_KeypadDivide:
828 keyCode = kVK_ANSI_KeypadDivide;
830 case VuoKey_KeypadEnter:
831 keyCode = kVK_ANSI_KeypadEnter;
833 case VuoKey_KeypadMinus:
834 keyCode = kVK_ANSI_KeypadMinus;
836 case VuoKey_KeypadEquals:
837 keyCode = kVK_ANSI_KeypadEquals;
840 keyCode = kVK_ANSI_Keypad0;
843 keyCode = kVK_ANSI_Keypad1;
846 keyCode = kVK_ANSI_Keypad2;
849 keyCode = kVK_ANSI_Keypad3;
852 keyCode = kVK_ANSI_Keypad4;
855 keyCode = kVK_ANSI_Keypad5;
858 keyCode = kVK_ANSI_Keypad6;
861 keyCode = kVK_ANSI_Keypad7;
864 keyCode = kVK_ANSI_Keypad8;
867 keyCode = kVK_ANSI_Keypad9;
870 keyCode = kVK_JIS_Yen;
872 case VuoKey_Underscore:
873 keyCode = kVK_JIS_Underscore;
875 case VuoKey_KeypadComma:
876 keyCode = kVK_JIS_KeypadComma;
879 keyCode = kVK_JIS_Eisu;
882 keyCode = kVK_JIS_Kana;
886 isVisibleChar =
false;
889 char *summary = NULL;
893 UInt32 deadKeyState = 0;
897 isVisibleChar =
false;
898 else if (strlen(summary) == 0 || (strlen(summary) == 1 && summary[0] <=
' '))
901 isVisibleChar =
false;
908 if (value == VuoKey_KeypadClear)
909 summary = strdup(
"Keypad Clear");
910 else if (value == VuoKey_KeypadEnter)
911 summary = strdup(
"Keypad Enter");
912 else if (value == VuoKey_KeypadComma)
913 summary = strdup(
"Keypad ,");
917 const char *keyAsString = json_object_get_string(keyAsJson);
918 summary = strdup(keyAsString);
919 json_object_put(keyAsJson);
923 if (isVisibleChar && ((VuoKey_KeypadDecimal <= value && value <= VuoKey_Keypad9) || value == VuoKey_KeypadComma))
925 const char *prefix =
"Keypad ";
926 size_t mallocSize = strlen(summary) + strlen(prefix) + 1;
927 char *tmp = malloc(mallocSize);
928 strlcpy(tmp, prefix, mallocSize);
929 strlcat(tmp, summary, mallocSize);
950 __block
char *characters = NULL;
956 TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
957 CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
960 const UCKeyboardLayout *keyboardLayout = (
const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
962 UInt32 modifierKeyState = (flags >> 16) & 0xFF;
964 const UniCharCount unicodeStringLength = 4;
965 UniChar unicodeString[unicodeStringLength];
966 UniCharCount realLength;
968 UCKeyTranslate(keyboardLayout,
978 CFRelease(currentKeyboard);
979 CFStringRef cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeString, (CFIndex)realLength);
983 characters = strdup(t);
1042 case kVK_ANSI_Equal:
1043 return VuoKey_Equal;
1048 case kVK_ANSI_Minus:
1049 return VuoKey_Minus;
1054 case kVK_ANSI_RightBracket:
1055 return VuoKey_RightBracket;
1060 case kVK_ANSI_LeftBracket:
1061 return VuoKey_LeftBracket;
1070 case kVK_ANSI_Quote:
1071 return VuoKey_Quote;
1074 case kVK_ANSI_Semicolon:
1075 return VuoKey_Semicolon;
1076 case kVK_ANSI_Backslash:
1077 return VuoKey_Backslash;
1078 case kVK_ANSI_Comma:
1079 return VuoKey_Comma;
1080 case kVK_ANSI_Slash:
1081 return VuoKey_Slash;
1086 case kVK_ANSI_Period:
1087 return VuoKey_Period;
1088 case kVK_ANSI_Grave:
1089 return VuoKey_Grave;
1090 case kVK_ANSI_KeypadDecimal:
1091 return VuoKey_KeypadDecimal;
1092 case kVK_ANSI_KeypadMultiply:
1093 return VuoKey_KeypadMultiply;
1094 case kVK_ANSI_KeypadPlus:
1095 return VuoKey_KeypadPlus;
1096 case kVK_ANSI_KeypadClear:
1097 return VuoKey_KeypadClear;
1098 case kVK_ANSI_KeypadDivide:
1099 return VuoKey_KeypadDivide;
1100 case kVK_ANSI_KeypadEnter:
1101 return VuoKey_KeypadEnter;
1102 case kVK_ANSI_KeypadMinus:
1103 return VuoKey_KeypadMinus;
1104 case kVK_ANSI_KeypadEquals:
1105 return VuoKey_KeypadEquals;
1106 case kVK_ANSI_Keypad0:
1107 return VuoKey_Keypad0;
1108 case kVK_ANSI_Keypad1:
1109 return VuoKey_Keypad1;
1110 case kVK_ANSI_Keypad2:
1111 return VuoKey_Keypad2;
1112 case kVK_ANSI_Keypad3:
1113 return VuoKey_Keypad3;
1114 case kVK_ANSI_Keypad4:
1115 return VuoKey_Keypad4;
1116 case kVK_ANSI_Keypad5:
1117 return VuoKey_Keypad5;
1118 case kVK_ANSI_Keypad6:
1119 return VuoKey_Keypad6;
1120 case kVK_ANSI_Keypad7:
1121 return VuoKey_Keypad7;
1122 case kVK_ANSI_Keypad8:
1123 return VuoKey_Keypad8;
1124 case kVK_ANSI_Keypad9:
1125 return VuoKey_Keypad9;
1127 return VuoKey_Return;
1131 return VuoKey_Space;
1133 return VuoKey_Delete;
1135 return VuoKey_Escape;
1137 return VuoKey_Command;
1139 return VuoKey_Shift;
1141 return VuoKey_CapsLock;
1143 return VuoKey_Option;
1145 return VuoKey_Control;
1146 case kVK_RightShift:
1147 return VuoKey_RightShift;
1148 case kVK_RightOption:
1149 return VuoKey_RightOption;
1150 case kVK_RightControl:
1151 return VuoKey_RightControl;
1153 return VuoKey_Function;
1157 return VuoKey_VolumeUp;
1158 case kVK_VolumeDown:
1159 return VuoKey_VolumeDown;
1199 return VuoKey_PageUp;
1200 case kVK_ForwardDelete:
1201 return VuoKey_ForwardDelete;
1209 return VuoKey_PageDown;
1213 return VuoKey_LeftArrow;
1214 case kVK_RightArrow:
1215 return VuoKey_RightArrow;
1217 return VuoKey_DownArrow;
1219 return VuoKey_UpArrow;
1222 case kVK_JIS_Underscore:
1223 return VuoKey_Underscore;
1224 case kVK_JIS_KeypadComma:
1225 return VuoKey_KeypadComma;
1240 if (key == VuoKey_Any)