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