Vuo  2.3.2
VuoKey.c
Go to the documentation of this file.
1 
10 #include "VuoMacOSSDKWorkaround.h"
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 
668 char * 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 
948 char * 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 
1238 bool VuoKey_doesMacVirtualKeyCodeMatch(unsigned short keyCode, VuoKey key)
1239 {
1240  if (key == VuoKey_Any)
1241  return true;
1242 
1243  return (key == VuoKey_makeFromMacVirtualKeyCode(keyCode));
1244 }