Vuo 2.4.2
Loading...
Searching...
No Matches
VuoKey.c
Go to the documentation of this file.
1
11#include <Carbon/Carbon.h>
12
13#include "type.h"
14#include "VuoKey.h"
15#include "VuoList_VuoKey.h"
16#include "VuoApp.h"
17
19#ifdef VUO_COMPILER
21 "title" : "Key",
22 "version" : "1.0.0",
23 "dependencies" : [
24 "VuoText",
25 "VuoList_VuoKey",
26 "Carbon.framework"
27 ],
28 });
29#endif
31
37{
38 const char *valueAsString = "";
39 if (json_object_get_type(js) == json_type_string)
40 valueAsString = json_object_get_string(js);
41
42 VuoKey value = VuoKey_Any;
43
44 if (! strcmp(valueAsString, "any")) {
45 value = VuoKey_Any;
46 } else if (! strcmp(valueAsString, "A")) {
47 value = VuoKey_A;
48 } else if (! strcmp(valueAsString, "S")) {
49 value = VuoKey_S;
50 } else if (! strcmp(valueAsString, "D")) {
51 value = VuoKey_D;
52 } else if (! strcmp(valueAsString, "F")) {
53 value = VuoKey_F;
54 } else if (! strcmp(valueAsString, "H")) {
55 value = VuoKey_H;
56 } else if (! strcmp(valueAsString, "G")) {
57 value = VuoKey_G;
58 } else if (! strcmp(valueAsString, "Z")) {
59 value = VuoKey_Z;
60 } else if (! strcmp(valueAsString, "X")) {
61 value = VuoKey_X;
62 } else if (! strcmp(valueAsString, "C")) {
63 value = VuoKey_C;
64 } else if (! strcmp(valueAsString, "V")) {
65 value = VuoKey_V;
66 } else if (! strcmp(valueAsString, "B")) {
67 value = VuoKey_B;
68 } else if (! strcmp(valueAsString, "Q")) {
69 value = VuoKey_Q;
70 } else if (! strcmp(valueAsString, "W")) {
71 value = VuoKey_W;
72 } else if (! strcmp(valueAsString, "E")) {
73 value = VuoKey_E;
74 } else if (! strcmp(valueAsString, "R")) {
75 value = VuoKey_R;
76 } else if (! strcmp(valueAsString, "Y")) {
77 value = VuoKey_Y;
78 } else if (! strcmp(valueAsString, "T")) {
79 value = VuoKey_T;
80 } else if (! strcmp(valueAsString, "1")) {
81 value = VuoKey_1;
82 } else if (! strcmp(valueAsString, "2")) {
83 value = VuoKey_2;
84 } else if (! strcmp(valueAsString, "3")) {
85 value = VuoKey_3;
86 } else if (! strcmp(valueAsString, "4")) {
87 value = VuoKey_4;
88 } else if (! strcmp(valueAsString, "6")) {
89 value = VuoKey_6;
90 } else if (! strcmp(valueAsString, "5")) {
91 value = VuoKey_5;
92 } else if (! strcmp(valueAsString, "Equal")) {
93 value = VuoKey_Equal;
94 } else if (! strcmp(valueAsString, "9")) {
95 value = VuoKey_9;
96 } else if (! strcmp(valueAsString, "7")) {
97 value = VuoKey_7;
98 } else if (! strcmp(valueAsString, "Minus")) {
99 value = VuoKey_Minus;
100 } else if (! strcmp(valueAsString, "8")) {
101 value = VuoKey_8;
102 } else if (! strcmp(valueAsString, "0")) {
103 value = VuoKey_0;
104 } else if (! strcmp(valueAsString, "RightBracket")) {
105 value = VuoKey_RightBracket;
106 } else if (! strcmp(valueAsString, "O")) {
107 value = VuoKey_O;
108 } else if (! strcmp(valueAsString, "U")) {
109 value = VuoKey_U;
110 } else if (! strcmp(valueAsString, "LeftBracket")) {
111 value = VuoKey_LeftBracket;
112 } else if (! strcmp(valueAsString, "I")) {
113 value = VuoKey_I;
114 } else if (! strcmp(valueAsString, "P")) {
115 value = VuoKey_P;
116 } else if (! strcmp(valueAsString, "L")) {
117 value = VuoKey_L;
118 } else if (! strcmp(valueAsString, "J")) {
119 value = VuoKey_J;
120 } else if (! strcmp(valueAsString, "Quote")) {
121 value = VuoKey_Quote;
122 } else if (! strcmp(valueAsString, "K")) {
123 value = VuoKey_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")) {
133 value = VuoKey_N;
134 } else if (! strcmp(valueAsString, "M")) {
135 value = VuoKey_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")) {
179 value = VuoKey_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")) {
205 value = VuoKey_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")) {
211 value = VuoKey_Mute;
212 } else if (! strcmp(valueAsString, "F18")) {
213 value = VuoKey_F18;
214 } else if (! strcmp(valueAsString, "F19")) {
215 value = VuoKey_F19;
216 } else if (! strcmp(valueAsString, "F20")) {
217 value = VuoKey_F20;
218 } else if (! strcmp(valueAsString, "F5")) {
219 value = VuoKey_F5;
220 } else if (! strcmp(valueAsString, "F6")) {
221 value = VuoKey_F6;
222 } else if (! strcmp(valueAsString, "F7")) {
223 value = VuoKey_F7;
224 } else if (! strcmp(valueAsString, "F3")) {
225 value = VuoKey_F3;
226 } else if (! strcmp(valueAsString, "F8")) {
227 value = VuoKey_F8;
228 } else if (! strcmp(valueAsString, "F9")) {
229 value = VuoKey_F9;
230 } else if (! strcmp(valueAsString, "F11")) {
231 value = VuoKey_F11;
232 } else if (! strcmp(valueAsString, "F13")) {
233 value = VuoKey_F13;
234 } else if (! strcmp(valueAsString, "F16")) {
235 value = VuoKey_F16;
236 } else if (! strcmp(valueAsString, "F14")) {
237 value = VuoKey_F14;
238 } else if (! strcmp(valueAsString, "F10")) {
239 value = VuoKey_F10;
240 } else if (! strcmp(valueAsString, "F12")) {
241 value = VuoKey_F12;
242 } else if (! strcmp(valueAsString, "F15")) {
243 value = VuoKey_F15;
244 } else if (! strcmp(valueAsString, "Help")) {
245 value = VuoKey_Help;
246 } else if (! strcmp(valueAsString, "Home")) {
247 value = VuoKey_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")) {
253 value = VuoKey_F4;
254 } else if (! strcmp(valueAsString, "End")) {
255 value = VuoKey_End;
256 } else if (! strcmp(valueAsString, "F2")) {
257 value = VuoKey_F2;
258 } else if (! strcmp(valueAsString, "PageDown")) {
259 value = VuoKey_PageDown;
260 } else if (! strcmp(valueAsString, "F1")) {
261 value = VuoKey_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")) {
271 value = VuoKey_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")) {
277 value = VuoKey_Eisu;
278 } else if (! strcmp(valueAsString, "Kana")) {
279 value = VuoKey_Kana;
280 }
281
282 return value;
283}
284
290{
291 char *valueAsString = "";
292
293 switch (value) {
294 case VuoKey_Any:
295 valueAsString = "any";
296 break;
297 case VuoKey_A:
298 valueAsString = "A";
299 break;
300 case VuoKey_S:
301 valueAsString = "S";
302 break;
303 case VuoKey_D:
304 valueAsString = "D";
305 break;
306 case VuoKey_F:
307 valueAsString = "F";
308 break;
309 case VuoKey_H:
310 valueAsString = "H";
311 break;
312 case VuoKey_G:
313 valueAsString = "G";
314 break;
315 case VuoKey_Z:
316 valueAsString = "Z";
317 break;
318 case VuoKey_X:
319 valueAsString = "X";
320 break;
321 case VuoKey_C:
322 valueAsString = "C";
323 break;
324 case VuoKey_V:
325 valueAsString = "V";
326 break;
327 case VuoKey_B:
328 valueAsString = "B";
329 break;
330 case VuoKey_Q:
331 valueAsString = "Q";
332 break;
333 case VuoKey_W:
334 valueAsString = "W";
335 break;
336 case VuoKey_E:
337 valueAsString = "E";
338 break;
339 case VuoKey_R:
340 valueAsString = "R";
341 break;
342 case VuoKey_Y:
343 valueAsString = "Y";
344 break;
345 case VuoKey_T:
346 valueAsString = "T";
347 break;
348 case VuoKey_1:
349 valueAsString = "1";
350 break;
351 case VuoKey_2:
352 valueAsString = "2";
353 break;
354 case VuoKey_3:
355 valueAsString = "3";
356 break;
357 case VuoKey_4:
358 valueAsString = "4";
359 break;
360 case VuoKey_6:
361 valueAsString = "6";
362 break;
363 case VuoKey_5:
364 valueAsString = "5";
365 break;
366 case VuoKey_Equal:
367 valueAsString = "Equal";
368 break;
369 case VuoKey_9:
370 valueAsString = "9";
371 break;
372 case VuoKey_7:
373 valueAsString = "7";
374 break;
375 case VuoKey_Minus:
376 valueAsString = "Minus";
377 break;
378 case VuoKey_8:
379 valueAsString = "8";
380 break;
381 case VuoKey_0:
382 valueAsString = "0";
383 break;
384 case VuoKey_RightBracket:
385 valueAsString = "RightBracket";
386 break;
387 case VuoKey_O:
388 valueAsString = "O";
389 break;
390 case VuoKey_U:
391 valueAsString = "U";
392 break;
393 case VuoKey_LeftBracket:
394 valueAsString = "LeftBracket";
395 break;
396 case VuoKey_I:
397 valueAsString = "I";
398 break;
399 case VuoKey_P:
400 valueAsString = "P";
401 break;
402 case VuoKey_L:
403 valueAsString = "L";
404 break;
405 case VuoKey_J:
406 valueAsString = "J";
407 break;
408 case VuoKey_Quote:
409 valueAsString = "Quote";
410 break;
411 case VuoKey_K:
412 valueAsString = "K";
413 break;
414 case VuoKey_Semicolon:
415 valueAsString = "Semicolon";
416 break;
417 case VuoKey_Backslash:
418 valueAsString = "Backslash";
419 break;
420 case VuoKey_Comma:
421 valueAsString = "Comma";
422 break;
423 case VuoKey_Slash:
424 valueAsString = "Slash";
425 break;
426 case VuoKey_N:
427 valueAsString = "N";
428 break;
429 case VuoKey_M:
430 valueAsString = "M";
431 break;
432 case VuoKey_Period:
433 valueAsString = "Period";
434 break;
435 case VuoKey_Grave:
436 valueAsString = "Grave";
437 break;
438 case VuoKey_KeypadDecimal:
439 valueAsString = "KeypadDecimal";
440 break;
441 case VuoKey_KeypadMultiply:
442 valueAsString = "KeypadMultiply";
443 break;
444 case VuoKey_KeypadPlus:
445 valueAsString = "KeypadPlus";
446 break;
447 case VuoKey_KeypadClear:
448 valueAsString = "KeypadClear";
449 break;
450 case VuoKey_KeypadDivide:
451 valueAsString = "KeypadDivide";
452 break;
453 case VuoKey_KeypadEnter:
454 valueAsString = "KeypadEnter";
455 break;
456 case VuoKey_KeypadMinus:
457 valueAsString = "KeypadMinus";
458 break;
459 case VuoKey_KeypadEquals:
460 valueAsString = "KeypadEquals";
461 break;
462 case VuoKey_Keypad0:
463 valueAsString = "Keypad0";
464 break;
465 case VuoKey_Keypad1:
466 valueAsString = "Keypad1";
467 break;
468 case VuoKey_Keypad2:
469 valueAsString = "Keypad2";
470 break;
471 case VuoKey_Keypad3:
472 valueAsString = "Keypad3";
473 break;
474 case VuoKey_Keypad4:
475 valueAsString = "Keypad4";
476 break;
477 case VuoKey_Keypad5:
478 valueAsString = "Keypad5";
479 break;
480 case VuoKey_Keypad6:
481 valueAsString = "Keypad6";
482 break;
483 case VuoKey_Keypad7:
484 valueAsString = "Keypad7";
485 break;
486 case VuoKey_Keypad8:
487 valueAsString = "Keypad8";
488 break;
489 case VuoKey_Keypad9:
490 valueAsString = "Keypad9";
491 break;
492 case VuoKey_Return:
493 valueAsString = "Return";
494 break;
495 case VuoKey_Tab:
496 valueAsString = "Tab";
497 break;
498 case VuoKey_Space:
499 valueAsString = "Space";
500 break;
501 case VuoKey_Delete:
502 valueAsString = "Delete";
503 break;
504 case VuoKey_Escape:
505 valueAsString = "Escape";
506 break;
507 case VuoKey_Command:
508 valueAsString = "Command";
509 break;
510 case VuoKey_Shift:
511 valueAsString = "Shift";
512 break;
513 case VuoKey_CapsLock:
514 valueAsString = "CapsLock";
515 break;
516 case VuoKey_Option:
517 valueAsString = "Option";
518 break;
519 case VuoKey_Control:
520 valueAsString = "Control";
521 break;
522 case VuoKey_RightShift:
523 valueAsString = "RightShift";
524 break;
525 case VuoKey_RightOption:
526 valueAsString = "RightOption";
527 break;
528 case VuoKey_RightControl:
529 valueAsString = "RightControl";
530 break;
531 case VuoKey_Function:
532 valueAsString = "Function";
533 break;
534 case VuoKey_F17:
535 valueAsString = "F17";
536 break;
537 case VuoKey_VolumeUp:
538 valueAsString = "VolumeUp";
539 break;
540 case VuoKey_VolumeDown:
541 valueAsString = "VolumeDown";
542 break;
543 case VuoKey_Mute:
544 valueAsString = "Mute";
545 break;
546 case VuoKey_F18:
547 valueAsString = "F18";
548 break;
549 case VuoKey_F19:
550 valueAsString = "F19";
551 break;
552 case VuoKey_F20:
553 valueAsString = "F20";
554 break;
555 case VuoKey_F5:
556 valueAsString = "F5";
557 break;
558 case VuoKey_F6:
559 valueAsString = "F6";
560 break;
561 case VuoKey_F7:
562 valueAsString = "F7";
563 break;
564 case VuoKey_F3:
565 valueAsString = "F3";
566 break;
567 case VuoKey_F8:
568 valueAsString = "F8";
569 break;
570 case VuoKey_F9:
571 valueAsString = "F9";
572 break;
573 case VuoKey_F11:
574 valueAsString = "F11";
575 break;
576 case VuoKey_F13:
577 valueAsString = "F13";
578 break;
579 case VuoKey_F16:
580 valueAsString = "F16";
581 break;
582 case VuoKey_F14:
583 valueAsString = "F14";
584 break;
585 case VuoKey_F10:
586 valueAsString = "F10";
587 break;
588 case VuoKey_F12:
589 valueAsString = "F12";
590 break;
591 case VuoKey_F15:
592 valueAsString = "F15";
593 break;
594 case VuoKey_Help:
595 valueAsString = "Help";
596 break;
597 case VuoKey_Home:
598 valueAsString = "Home";
599 break;
600 case VuoKey_PageUp:
601 valueAsString = "PageUp";
602 break;
603 case VuoKey_ForwardDelete:
604 valueAsString = "ForwardDelete";
605 break;
606 case VuoKey_F4:
607 valueAsString = "F4";
608 break;
609 case VuoKey_End:
610 valueAsString = "End";
611 break;
612 case VuoKey_F2:
613 valueAsString = "F2";
614 break;
615 case VuoKey_PageDown:
616 valueAsString = "PageDown";
617 break;
618 case VuoKey_F1:
619 valueAsString = "F1";
620 break;
621 case VuoKey_LeftArrow:
622 valueAsString = "LeftArrow";
623 break;
624 case VuoKey_RightArrow:
625 valueAsString = "RightArrow";
626 break;
627 case VuoKey_DownArrow:
628 valueAsString = "DownArrow";
629 break;
630 case VuoKey_UpArrow:
631 valueAsString = "UpArrow";
632 break;
633 case VuoKey_Yen:
634 valueAsString = "Yen";
635 break;
636 case VuoKey_Underscore:
637 valueAsString = "Underscore";
638 break;
639 case VuoKey_KeypadComma:
640 valueAsString = "KeypadComma";
641 break;
642 case VuoKey_Eisu:
643 valueAsString = "Eisu";
644 break;
645 case VuoKey_Kana:
646 valueAsString = "Kana";
647 break;
648 }
649
650 return json_object_new_string(valueAsString);
651}
652
657{
659 for (VuoKey key = VuoKey_Any; key <= VuoKey_Kana; ++key)
661 return l;
662}
663
668char * VuoKey_getSummary(const VuoKey value)
669{
670 int keyCode;
671 bool isVisibleChar = true;
672
673 switch (value) {
674 case VuoKey_A:
675 keyCode = kVK_ANSI_A;
676 break;
677 case VuoKey_S:
678 keyCode = kVK_ANSI_S;
679 break;
680 case VuoKey_D:
681 keyCode = kVK_ANSI_D;
682 break;
683 case VuoKey_F:
684 keyCode = kVK_ANSI_F;
685 break;
686 case VuoKey_H:
687 keyCode = kVK_ANSI_H;
688 break;
689 case VuoKey_G:
690 keyCode = kVK_ANSI_G;
691 break;
692 case VuoKey_Z:
693 keyCode = kVK_ANSI_Z;
694 break;
695 case VuoKey_X:
696 keyCode = kVK_ANSI_X;
697 break;
698 case VuoKey_C:
699 keyCode = kVK_ANSI_C;
700 break;
701 case VuoKey_V:
702 keyCode = kVK_ANSI_V;
703 break;
704 case VuoKey_B:
705 keyCode = kVK_ANSI_B;
706 break;
707 case VuoKey_Q:
708 keyCode = kVK_ANSI_Q;
709 break;
710 case VuoKey_W:
711 keyCode = kVK_ANSI_W;
712 break;
713 case VuoKey_E:
714 keyCode = kVK_ANSI_E;
715 break;
716 case VuoKey_R:
717 keyCode = kVK_ANSI_R;
718 break;
719 case VuoKey_Y:
720 keyCode = kVK_ANSI_Y;
721 break;
722 case VuoKey_T:
723 keyCode = kVK_ANSI_T;
724 break;
725 case VuoKey_1:
726 keyCode = kVK_ANSI_1;
727 break;
728 case VuoKey_2:
729 keyCode = kVK_ANSI_2;
730 break;
731 case VuoKey_3:
732 keyCode = kVK_ANSI_3;
733 break;
734 case VuoKey_4:
735 keyCode = kVK_ANSI_4;
736 break;
737 case VuoKey_6:
738 keyCode = kVK_ANSI_6;
739 break;
740 case VuoKey_5:
741 keyCode = kVK_ANSI_5;
742 break;
743 case VuoKey_Equal:
744 keyCode = kVK_ANSI_Equal;
745 break;
746 case VuoKey_9:
747 keyCode = kVK_ANSI_9;
748 break;
749 case VuoKey_7:
750 keyCode = kVK_ANSI_7;
751 break;
752 case VuoKey_Minus:
753 keyCode = kVK_ANSI_Minus;
754 break;
755 case VuoKey_8:
756 keyCode = kVK_ANSI_8;
757 break;
758 case VuoKey_0:
759 keyCode = kVK_ANSI_0;
760 break;
761 case VuoKey_RightBracket:
762 keyCode = kVK_ANSI_RightBracket;
763 break;
764 case VuoKey_O:
765 keyCode = kVK_ANSI_O;
766 break;
767 case VuoKey_U:
768 keyCode = kVK_ANSI_U;
769 break;
770 case VuoKey_LeftBracket:
771 keyCode = kVK_ANSI_LeftBracket;
772 break;
773 case VuoKey_I:
774 keyCode = kVK_ANSI_I;
775 break;
776 case VuoKey_P:
777 keyCode = kVK_ANSI_P;
778 break;
779 case VuoKey_L:
780 keyCode = kVK_ANSI_L;
781 break;
782 case VuoKey_J:
783 keyCode = kVK_ANSI_J;
784 break;
785 case VuoKey_Quote:
786 keyCode = kVK_ANSI_Quote;
787 break;
788 case VuoKey_K:
789 keyCode = kVK_ANSI_K;
790 break;
791 case VuoKey_Semicolon:
792 keyCode = kVK_ANSI_Semicolon;
793 break;
794 case VuoKey_Backslash:
795 keyCode = kVK_ANSI_Backslash;
796 break;
797 case VuoKey_Comma:
798 keyCode = kVK_ANSI_Comma;
799 break;
800 case VuoKey_Slash:
801 keyCode = kVK_ANSI_Slash;
802 break;
803 case VuoKey_N:
804 keyCode = kVK_ANSI_N;
805 break;
806 case VuoKey_M:
807 keyCode = kVK_ANSI_M;
808 break;
809 case VuoKey_Period:
810 keyCode = kVK_ANSI_Period;
811 break;
812 case VuoKey_Grave:
813 keyCode = kVK_ANSI_Grave;
814 break;
815 case VuoKey_KeypadDecimal:
816 keyCode = kVK_ANSI_KeypadDecimal;
817 break;
818 case VuoKey_KeypadMultiply:
819 keyCode = kVK_ANSI_KeypadMultiply;
820 break;
821 case VuoKey_KeypadPlus:
822 keyCode = kVK_ANSI_KeypadPlus;
823 break;
824 case VuoKey_KeypadClear:
825 keyCode = kVK_ANSI_KeypadClear;
826 break;
827 case VuoKey_KeypadDivide:
828 keyCode = kVK_ANSI_KeypadDivide;
829 break;
830 case VuoKey_KeypadEnter:
831 keyCode = kVK_ANSI_KeypadEnter;
832 break;
833 case VuoKey_KeypadMinus:
834 keyCode = kVK_ANSI_KeypadMinus;
835 break;
836 case VuoKey_KeypadEquals:
837 keyCode = kVK_ANSI_KeypadEquals;
838 break;
839 case VuoKey_Keypad0:
840 keyCode = kVK_ANSI_Keypad0;
841 break;
842 case VuoKey_Keypad1:
843 keyCode = kVK_ANSI_Keypad1;
844 break;
845 case VuoKey_Keypad2:
846 keyCode = kVK_ANSI_Keypad2;
847 break;
848 case VuoKey_Keypad3:
849 keyCode = kVK_ANSI_Keypad3;
850 break;
851 case VuoKey_Keypad4:
852 keyCode = kVK_ANSI_Keypad4;
853 break;
854 case VuoKey_Keypad5:
855 keyCode = kVK_ANSI_Keypad5;
856 break;
857 case VuoKey_Keypad6:
858 keyCode = kVK_ANSI_Keypad6;
859 break;
860 case VuoKey_Keypad7:
861 keyCode = kVK_ANSI_Keypad7;
862 break;
863 case VuoKey_Keypad8:
864 keyCode = kVK_ANSI_Keypad8;
865 break;
866 case VuoKey_Keypad9:
867 keyCode = kVK_ANSI_Keypad9;
868 break;
869 case VuoKey_Yen:
870 keyCode = kVK_JIS_Yen;
871 break;
872 case VuoKey_Underscore:
873 keyCode = kVK_JIS_Underscore;
874 break;
875 case VuoKey_KeypadComma:
876 keyCode = kVK_JIS_KeypadComma;
877 break;
878 case VuoKey_Eisu:
879 keyCode = kVK_JIS_Eisu;
880 break;
881 case VuoKey_Kana:
882 keyCode = kVK_JIS_Kana;
883 break;
884 default:
885 // VuoKey_Any or corresponds to a position-independent virtual key code that doesn't type a visible character
886 isVisibleChar = false;
887 }
888
889 char *summary = NULL;
890
891 if (isVisibleChar)
892 {
893 UInt32 deadKeyState = 0;
894 summary = VuoKey_getCharactersForMacVirtualKeyCode(keyCode, 0, &deadKeyState);
895
896 if (!summary)
897 isVisibleChar = false;
898 else if (strlen(summary) == 0 || (strlen(summary) == 1 && summary[0] <= ' '))
899 {
900 // corresponds to a virtual key code that doesn't type a visible character on the user's keyboard
901 isVisibleChar = false;
902 free(summary);
903 }
904 }
905
906 if (! isVisibleChar)
907 {
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 ,");
914 else
915 {
916 json_object *keyAsJson = VuoKey_getJson(value);
917 const char *keyAsString = json_object_get_string(keyAsJson);
918 summary = strdup(keyAsString);
919 json_object_put(keyAsJson);
920 }
921 }
922
923 if (isVisibleChar && ((VuoKey_KeypadDecimal <= value && value <= VuoKey_Keypad9) || value == VuoKey_KeypadComma))
924 {
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);
930 free(summary);
931 summary = tmp;
932 }
933
934 return summary;
935}
936
948char * VuoKey_getCharactersForMacVirtualKeyCode(unsigned short keyCode, unsigned long flags, unsigned int *deadKeyState)
949{
950 __block char *characters = NULL;
952 // https://stackoverflow.com/questions/22566665/how-to-capture-unicode-from-key-events-without-an-nstextview
953 // https://stackoverflow.com/questions/12547007/convert-key-code-into-key-equivalent-string
954 // https://stackoverflow.com/questions/8263618/convert-virtual-key-code-to-unicode-string
955
956 TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
957 CFDataRef layoutData = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
958 if (!layoutData)
959 return;
960 const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
961
962 UInt32 modifierKeyState = (flags >> 16) & 0xFF;
963
964 const UniCharCount unicodeStringLength = 4;
965 UniChar unicodeString[unicodeStringLength];
966 UniCharCount realLength;
967
968 UCKeyTranslate(keyboardLayout,
969 keyCode,
970 kUCKeyActionDown,
971 modifierKeyState,
972 LMGetKbdType(),
973 0,
974 deadKeyState,
975 unicodeStringLength,
976 &realLength,
977 unicodeString);
978 CFRelease(currentKeyboard);
979 CFStringRef cfString = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeString, (CFIndex)realLength);
980
981 VuoText t = VuoText_makeFromCFString(cfString);
982 VuoRetain(t);
983 characters = strdup(t);
984 VuoRelease(t);
985 CFRelease(cfString);
986 });
987 return characters;
988}
989
994{
995 switch (keyCode) {
996 case kVK_ANSI_A:
997 return VuoKey_A;
998 case kVK_ANSI_S:
999 return VuoKey_S;
1000 case kVK_ANSI_D:
1001 return VuoKey_D;
1002 case kVK_ANSI_F:
1003 return VuoKey_F;
1004 case kVK_ANSI_H:
1005 return VuoKey_H;
1006 case kVK_ANSI_G:
1007 return VuoKey_G;
1008 case kVK_ANSI_Z:
1009 return VuoKey_Z;
1010 case kVK_ANSI_X:
1011 return VuoKey_X;
1012 case kVK_ANSI_C:
1013 return VuoKey_C;
1014 case kVK_ANSI_V:
1015 return VuoKey_V;
1016 case kVK_ANSI_B:
1017 return VuoKey_B;
1018 case kVK_ANSI_Q:
1019 return VuoKey_Q;
1020 case kVK_ANSI_W:
1021 return VuoKey_W;
1022 case kVK_ANSI_E:
1023 return VuoKey_E;
1024 case kVK_ANSI_R:
1025 return VuoKey_R;
1026 case kVK_ANSI_Y:
1027 return VuoKey_Y;
1028 case kVK_ANSI_T:
1029 return VuoKey_T;
1030 case kVK_ANSI_1:
1031 return VuoKey_1;
1032 case kVK_ANSI_2:
1033 return VuoKey_2;
1034 case kVK_ANSI_3:
1035 return VuoKey_3;
1036 case kVK_ANSI_4:
1037 return VuoKey_4;
1038 case kVK_ANSI_6:
1039 return VuoKey_6;
1040 case kVK_ANSI_5:
1041 return VuoKey_5;
1042 case kVK_ANSI_Equal:
1043 return VuoKey_Equal;
1044 case kVK_ANSI_9:
1045 return VuoKey_9;
1046 case kVK_ANSI_7:
1047 return VuoKey_7;
1048 case kVK_ANSI_Minus:
1049 return VuoKey_Minus;
1050 case kVK_ANSI_8:
1051 return VuoKey_8;
1052 case kVK_ANSI_0:
1053 return VuoKey_0;
1054 case kVK_ANSI_RightBracket:
1055 return VuoKey_RightBracket;
1056 case kVK_ANSI_O:
1057 return VuoKey_O;
1058 case kVK_ANSI_U:
1059 return VuoKey_U;
1060 case kVK_ANSI_LeftBracket:
1061 return VuoKey_LeftBracket;
1062 case kVK_ANSI_I:
1063 return VuoKey_I;
1064 case kVK_ANSI_P:
1065 return VuoKey_P;
1066 case kVK_ANSI_L:
1067 return VuoKey_L;
1068 case kVK_ANSI_J:
1069 return VuoKey_J;
1070 case kVK_ANSI_Quote:
1071 return VuoKey_Quote;
1072 case kVK_ANSI_K:
1073 return VuoKey_K;
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;
1082 case kVK_ANSI_N:
1083 return VuoKey_N;
1084 case kVK_ANSI_M:
1085 return VuoKey_M;
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;
1126 case kVK_Return:
1127 return VuoKey_Return;
1128 case kVK_Tab:
1129 return VuoKey_Tab;
1130 case kVK_Space:
1131 return VuoKey_Space;
1132 case kVK_Delete:
1133 return VuoKey_Delete;
1134 case kVK_Escape:
1135 return VuoKey_Escape;
1136 case kVK_Command:
1137 return VuoKey_Command;
1138 case kVK_Shift:
1139 return VuoKey_Shift;
1140 case kVK_CapsLock:
1141 return VuoKey_CapsLock;
1142 case kVK_Option:
1143 return VuoKey_Option;
1144 case kVK_Control:
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;
1152 case kVK_Function:
1153 return VuoKey_Function;
1154 case kVK_F17:
1155 return VuoKey_F17;
1156 case kVK_VolumeUp:
1157 return VuoKey_VolumeUp;
1158 case kVK_VolumeDown:
1159 return VuoKey_VolumeDown;
1160 case kVK_Mute:
1161 return VuoKey_Mute;
1162 case kVK_F18:
1163 return VuoKey_F18;
1164 case kVK_F19:
1165 return VuoKey_F19;
1166 case kVK_F20:
1167 return VuoKey_F20;
1168 case kVK_F5:
1169 return VuoKey_F5;
1170 case kVK_F6:
1171 return VuoKey_F6;
1172 case kVK_F7:
1173 return VuoKey_F7;
1174 case kVK_F3:
1175 return VuoKey_F3;
1176 case kVK_F8:
1177 return VuoKey_F8;
1178 case kVK_F9:
1179 return VuoKey_F9;
1180 case kVK_F11:
1181 return VuoKey_F11;
1182 case kVK_F13:
1183 return VuoKey_F13;
1184 case kVK_F16:
1185 return VuoKey_F16;
1186 case kVK_F14:
1187 return VuoKey_F14;
1188 case kVK_F10:
1189 return VuoKey_F10;
1190 case kVK_F12:
1191 return VuoKey_F12;
1192 case kVK_F15:
1193 return VuoKey_F15;
1194 case kVK_Help:
1195 return VuoKey_Help;
1196 case kVK_Home:
1197 return VuoKey_Home;
1198 case kVK_PageUp:
1199 return VuoKey_PageUp;
1200 case kVK_ForwardDelete:
1201 return VuoKey_ForwardDelete;
1202 case kVK_F4:
1203 return VuoKey_F4;
1204 case kVK_End:
1205 return VuoKey_End;
1206 case kVK_F2:
1207 return VuoKey_F2;
1208 case kVK_PageDown:
1209 return VuoKey_PageDown;
1210 case kVK_F1:
1211 return VuoKey_F1;
1212 case kVK_LeftArrow:
1213 return VuoKey_LeftArrow;
1214 case kVK_RightArrow:
1215 return VuoKey_RightArrow;
1216 case kVK_DownArrow:
1217 return VuoKey_DownArrow;
1218 case kVK_UpArrow:
1219 return VuoKey_UpArrow;
1220 case kVK_JIS_Yen:
1221 return VuoKey_Yen;
1222 case kVK_JIS_Underscore:
1223 return VuoKey_Underscore;
1224 case kVK_JIS_KeypadComma:
1225 return VuoKey_KeypadComma;
1226 case kVK_JIS_Eisu:
1227 return VuoKey_Eisu;
1228 case kVK_JIS_Kana:
1229 return VuoKey_Kana;
1230 }
1231
1232 return VuoKey_Any;
1233}
1234
1238bool VuoKey_doesMacVirtualKeyCodeMatch(unsigned short keyCode, VuoKey key)
1239{
1240 if (key == VuoKey_Any)
1241 return true;
1242
1243 return (key == VuoKey_makeFromMacVirtualKeyCode(keyCode));
1244}