~ubuntu-branches/ubuntu/vivid/freerdp/vivid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
/**
 * WinPR: Windows Portable Runtime
 * Input Functions
 *
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WINPR_INPUT_H
#define WINPR_INPUT_H


#include <winpr/winpr.h>
#include <winpr/wtypes.h>

/**
 * Key Flags
 */

#define KBDEXT		(USHORT) 0x0100
#define KBDMULTIVK	(USHORT) 0x0200
#define KBDSPECIAL	(USHORT) 0x0400
#define KBDNUMPAD	(USHORT) 0x0800
#define KBDUNICODE	(USHORT) 0x1000
#define KBDINJECTEDVK	(USHORT) 0x2000
#define KBDMAPPEDVK	(USHORT) 0x4000
#define KBDBREAK	(USHORT) 0x8000

/*
 * Virtual Key Codes (Windows):
 * http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731/
 * http://msdn.microsoft.com/en-us/library/ms927178.aspx
 */

/* Mouse buttons */

#define VK_LBUTTON	0x01 /* Left mouse button */
#define VK_RBUTTON	0x02 /* Right mouse button */
#define VK_CANCEL	0x03 /* Control-break processing */
#define VK_MBUTTON	0x04 /* Middle mouse button (three-button mouse) */
#define VK_XBUTTON1	0x05 /* Windows 2000/XP: X1 mouse button */
#define VK_XBUTTON2	0x06 /* Windows 2000/XP: X2 mouse button */

/* 0x07 is undefined */

#define VK_BACK		0x08 /* BACKSPACE key */
#define VK_TAB		0x09 /* TAB key */

/* 0x0A to 0x0B are reserved */

#define VK_CLEAR	0x0C /* CLEAR key */
#define VK_RETURN	0x0D /* ENTER key */

/* 0x0E to 0x0F are undefined */

#define VK_SHIFT	0x10 /* SHIFT key */
#define VK_CONTROL	0x11 /* CTRL key */
#define VK_MENU		0x12 /* ALT key */
#define VK_PAUSE	0x13 /* PAUSE key */
#define VK_CAPITAL	0x14 /* CAPS LOCK key */
#define VK_KANA		0x15 /* Input Method Editor (IME) Kana mode */
#define VK_HANGUEL	0x15 /* IME Hanguel mode (maintained for compatibility; use #define VK_HANGUL) */
#define VK_HANGUL	0x15 /* IME Hangul mode */

/* 0x16 is undefined */

#define VK_JUNJA	0x17 /* IME Junja mode */
#define VK_FINAL	0x18 /* IME final mode */
#define VK_HANJA	0x19 /* IME Hanja mode */
#define VK_KANJI	0x19 /* IME Kanji mode */

/* 0x1A is undefined */

#define VK_ESCAPE	0x1B /* ESC key */
#define VK_CONVERT	0x1C /* IME convert */
#define VK_NONCONVERT	0x1D /* IME nonconvert */
#define VK_ACCEPT	0x1E /* IME accept */
#define VK_MODECHANGE	0x1F /* IME mode change request */

#define VK_SPACE	0x20 /* SPACEBAR */
#define VK_PRIOR	0x21 /* PAGE UP key */
#define VK_NEXT		0x22 /* PAGE DOWN key */
#define VK_END		0x23 /* END key */
#define VK_HOME		0x24 /* HOME key */
#define VK_LEFT		0x25 /* LEFT ARROW key */
#define VK_UP		0x26 /* UP ARROW key */
#define VK_RIGHT	0x27 /* RIGHT ARROW key */
#define VK_DOWN		0x28 /* DOWN ARROW key */
#define VK_SELECT	0x29 /* SELECT key */
#define VK_PRINT	0x2A /* PRINT key */
#define VK_EXECUTE	0x2B /* EXECUTE key */
#define VK_SNAPSHOT	0x2C /* PRINT SCREEN key */
#define VK_INSERT	0x2D /* INS key */
#define VK_DELETE	0x2E /* DEL key */
#define VK_HELP		0x2F /* HELP key */

/* Digits, the last 4 bits of the code represent the corresponding digit */

#define VK_KEY_0	0x30 /* '0' key */
#define VK_KEY_1	0x31 /* '1' key */
#define VK_KEY_2	0x32 /* '2' key */
#define VK_KEY_3	0x33 /* '3' key */
#define VK_KEY_4	0x34 /* '4' key */
#define VK_KEY_5	0x35 /* '5' key */
#define VK_KEY_6	0x36 /* '6' key */
#define VK_KEY_7	0x37 /* '7' key */
#define VK_KEY_8	0x38 /* '8' key */
#define VK_KEY_9	0x39 /* '9' key */

/* 0x3A to 0x40 are undefined */

/* The alphabet, the code corresponds to the capitalized letter in the ASCII code */

#define VK_KEY_A	0x41 /* 'A' key */
#define VK_KEY_B	0x42 /* 'B' key */
#define VK_KEY_C	0x43 /* 'C' key */
#define VK_KEY_D	0x44 /* 'D' key */
#define VK_KEY_E	0x45 /* 'E' key */
#define VK_KEY_F	0x46 /* 'F' key */
#define VK_KEY_G	0x47 /* 'G' key */
#define VK_KEY_H	0x48 /* 'H' key */
#define VK_KEY_I	0x49 /* 'I' key */
#define VK_KEY_J	0x4A /* 'J' key */
#define VK_KEY_K	0x4B /* 'K' key */
#define VK_KEY_L	0x4C /* 'L' key */
#define VK_KEY_M	0x4D /* 'M' key */
#define VK_KEY_N	0x4E /* 'N' key */
#define VK_KEY_O	0x4F /* 'O' key */
#define VK_KEY_P	0x50 /* 'P' key */
#define VK_KEY_Q	0x51 /* 'Q' key */
#define VK_KEY_R	0x52 /* 'R' key */
#define VK_KEY_S	0x53 /* 'S' key */
#define VK_KEY_T	0x54 /* 'T' key */
#define VK_KEY_U	0x55 /* 'U' key */
#define VK_KEY_V	0x56 /* 'V' key */
#define VK_KEY_W	0x57 /* 'W' key */
#define VK_KEY_X	0x58 /* 'X' key */
#define VK_KEY_Y	0x59 /* 'Y' key */
#define VK_KEY_Z	0x5A /* 'Z' key */

#define VK_LWIN		0x5B /* Left Windows key (Microsoft Natural keyboard) */
#define VK_RWIN		0x5C /* Right Windows key (Natural keyboard) */
#define VK_APPS		0x5D /* Applications key (Natural keyboard) */

/* 0x5E is reserved */

#define VK_POWER	0x5E /* Power key */

#define VK_SLEEP	0x5F /* Computer Sleep key */

/* Numeric keypad digits, the last four bits of the code represent the corresponding digit */

#define VK_NUMPAD0	0x60 /* Numeric keypad '0' key */
#define VK_NUMPAD1	0x61 /* Numeric keypad '1' key */
#define VK_NUMPAD2	0x62 /* Numeric keypad '2' key */
#define VK_NUMPAD3	0x63 /* Numeric keypad '3' key */
#define VK_NUMPAD4	0x64 /* Numeric keypad '4' key */
#define VK_NUMPAD5	0x65 /* Numeric keypad '5' key */
#define VK_NUMPAD6	0x66 /* Numeric keypad '6' key */
#define VK_NUMPAD7	0x67 /* Numeric keypad '7' key */
#define VK_NUMPAD8	0x68 /* Numeric keypad '8' key */
#define VK_NUMPAD9	0x69 /* Numeric keypad '9' key */

/* Numeric keypad operators and special keys */

#define VK_MULTIPLY	0x6A /* Multiply key */
#define VK_ADD		0x6B /* Add key */
#define VK_SEPARATOR	0x6C /* Separator key */
#define VK_SUBTRACT	0x6D /* Subtract key */
#define VK_DECIMAL	0x6E /* Decimal key */
#define VK_DIVIDE	0x6F /* Divide key */

/* Function keys, from F1 to F24 */

#define VK_F1		0x70 /* F1 key */
#define VK_F2		0x71 /* F2 key */
#define VK_F3		0x72 /* F3 key */
#define VK_F4		0x73 /* F4 key */
#define VK_F5		0x74 /* F5 key */
#define VK_F6		0x75 /* F6 key */
#define VK_F7		0x76 /* F7 key */
#define VK_F8		0x77 /* F8 key */
#define VK_F9		0x78 /* F9 key */
#define VK_F10		0x79 /* F10 key */
#define VK_F11		0x7A /* F11 key */
#define VK_F12		0x7B /* F12 key */
#define VK_F13		0x7C /* F13 key */
#define VK_F14		0x7D /* F14 key */
#define VK_F15		0x7E /* F15 key */
#define VK_F16		0x7F /* F16 key */
#define VK_F17		0x80 /* F17 key */
#define VK_F18		0x81 /* F18 key */
#define VK_F19		0x82 /* F19 key */
#define VK_F20		0x83 /* F20 key */
#define VK_F21		0x84 /* F21 key */
#define VK_F22		0x85 /* F22 key */
#define VK_F23		0x86 /* F23 key */
#define VK_F24		0x87 /* F24 key */

/* 0x88 to 0x8F are unassigned */

#define VK_NUMLOCK	0x90 /* NUM LOCK key */
#define VK_SCROLL	0x91 /* SCROLL LOCK key */

/* 0x92 to 0x96 are OEM specific */
/* 0x97 to 0x9F are unassigned */

/* Modifier keys */

#define VK_LSHIFT	0xA0 /* Left SHIFT key */
#define VK_RSHIFT	0xA1 /* Right SHIFT key */
#define VK_LCONTROL	0xA2 /* Left CONTROL key */
#define VK_RCONTROL	0xA3 /* Right CONTROL key */
#define VK_LMENU	0xA4 /* Left MENU key */
#define VK_RMENU	0xA5 /* Right MENU key */

/* Browser related keys */

#define VK_BROWSER_BACK		0xA6 /* Windows 2000/XP: Browser Back key */
#define VK_BROWSER_FORWARD	0xA7 /* Windows 2000/XP: Browser Forward key */
#define VK_BROWSER_REFRESH	0xA8 /* Windows 2000/XP: Browser Refresh key */
#define VK_BROWSER_STOP		0xA9 /* Windows 2000/XP: Browser Stop key */
#define VK_BROWSER_SEARCH	0xAA /* Windows 2000/XP: Browser Search key */
#define VK_BROWSER_FAVORITES	0xAB /* Windows 2000/XP: Browser Favorites key */
#define VK_BROWSER_HOME		0xAC /* Windows 2000/XP: Browser Start and Home key */

/* Volume related keys */

#define VK_VOLUME_MUTE		0xAD /* Windows 2000/XP: Volume Mute key */
#define VK_VOLUME_DOWN		0xAE /* Windows 2000/XP: Volume Down key */
#define VK_VOLUME_UP		0xAF /* Windows 2000/XP: Volume Up key */

/* Media player related keys */

#define VK_MEDIA_NEXT_TRACK	0xB0 /* Windows 2000/XP: Next Track key */
#define VK_MEDIA_PREV_TRACK	0xB1 /* Windows 2000/XP: Previous Track key */
#define VK_MEDIA_STOP		0xB2 /* Windows 2000/XP: Stop Media key */
#define VK_MEDIA_PLAY_PAUSE	0xB3 /* Windows 2000/XP: Play/Pause Media key */

/* Application launcher keys */

#define VK_LAUNCH_MAIL		0xB4 /* Windows 2000/XP: Start Mail key */
#define VK_MEDIA_SELECT		0xB5 /* Windows 2000/XP: Select Media key */
#define VK_LAUNCH_MEDIA_SELECT	0xB5 /* Windows 2000/XP: Select Media key */
#define VK_LAUNCH_APP1		0xB6 /* Windows 2000/XP: Start Application 1 key */
#define VK_LAUNCH_APP2		0xB7 /* Windows 2000/XP: Start Application 2 key */

/* 0xB8 and 0xB9 are reserved */

/* OEM keys */

#define VK_OEM_1	0xBA /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the ';:' key */

#define VK_OEM_PLUS	0xBB /* Windows 2000/XP: For any country/region, the '+' key */
#define VK_OEM_COMMA	0xBC /* Windows 2000/XP: For any country/region, the ',' key */
#define VK_OEM_MINUS	0xBD /* Windows 2000/XP: For any country/region, the '-' key */
#define VK_OEM_PERIOD	0xBE /* Windows 2000/XP: For any country/region, the '.' key */

#define VK_OEM_2	0xBF /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the '/?' key */

#define VK_OEM_3	0xC0 /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the '`~' key */

/* 0xC1 to 0xD7 are reserved */
#define VK_ABNT_C1	0xC1 /* Brazilian (ABNT) Keyboard */
#define VK_ABNT_C2	0xC2 /* Brazilian (ABNT) Keyboard */

/* 0xD8 to 0xDA are unassigned */

#define VK_OEM_4	0xDB /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the '[{' key */

#define VK_OEM_5	0xDC /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the '\|' key */

#define VK_OEM_6	0xDD /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the ']}' key */

#define VK_OEM_7	0xDE /* Used for miscellaneous characters; it can vary by keyboard. */
			     /* Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key */

#define VK_OEM_8	0xDF /* Used for miscellaneous characters; it can vary by keyboard. */

/* 0xE0 is reserved */

#define VK_OEM_AX	0xE1 /* AX key on Japanese AX keyboard */

#define VK_OEM_102	0xE2 /* Windows 2000/XP: Either the angle bracket key or */
			     /* the backslash key on the RT 102-key keyboard */

/* 0xE3 and 0xE4 are OEM specific */

#define VK_PROCESSKEY	0xE5 /* Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key */

/* 0xE6 is OEM specific */

#define VK_PACKET	0xE7	/* Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. */
				/* The #define VK_PACKET key is the low word of a 32-bit Virtual Key value used */
				/* for non-keyboard input methods. For more information, */
				/* see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP */

/* 0xE8 is unassigned */
/* 0xE9 to 0xF5 are OEM specific */

#define VK_OEM_RESET			0xE9
#define VK_OEM_JUMP			0xEA
#define VK_OEM_PA1			0xEB
#define VK_OEM_PA2			0xEC
#define VK_OEM_PA3			0xED
#define VK_OEM_WSCTRL			0xEE
#define VK_OEM_CUSEL			0xEF
#define VK_OEM_ATTN			0xF0
#define VK_OEM_FINISH			0xF1
#define VK_OEM_COPY			0xF2
#define VK_OEM_AUTO			0xF3
#define VK_OEM_ENLW			0xF4
#define VK_OEM_BACKTAB			0xF5

#define VK_ATTN				0xF6 /* Attn key */
#define VK_CRSEL			0xF7 /* CrSel key */
#define VK_EXSEL			0xF8 /* ExSel key */
#define VK_EREOF			0xF9 /* Erase EOF key */
#define VK_PLAY				0xFA /* Play key */
#define VK_ZOOM				0xFB /* Zoom key */
#define VK_NONAME			0xFC /* Reserved */
#define VK_PA1				0xFD /* PA1 key */
#define VK_OEM_CLEAR			0xFE /* Clear key */

#define VK_NONE				0xFF /* no key */

/**
 * For East Asian Input Method Editors (IMEs)
 * the following additional virtual keyboard definitions must be observed.
 */

#define VK_DBE_ALPHANUMERIC		0xF0 /* Changes the mode to alphanumeric. */
#define VK_DBE_KATAKANA			0xF1 /* Changes the mode to Katakana. */
#define VK_DBE_HIRAGANA			0xF2 /* Changes the mode to Hiragana. */
#define VK_DBE_SBCSCHAR			0xF3 /* Changes the mode to single-byte characters. */
#define VK_DBE_DBCSCHAR			0xF4 /* Changes the mode to double-byte characters. */
#define VK_DBE_ROMAN			0xF5 /* Changes the mode to Roman characters. */
#define VK_DBE_NOROMAN			0xF6 /* Changes the mode to non-Roman characters. */
#define VK_DBE_ENTERWORDREGISTERMODE	0xF7 /* Activates the word registration dialog box. */
#define VK_DBE_ENTERIMECONFIGMODE	0xF8 /* Activates a dialog box for setting up an IME environment. */
#define VK_DBE_FLUSHSTRING		0xF9 /* Deletes the undetermined string without determining it. */
#define VK_DBE_CODEINPUT		0xFA /* Changes the mode to code input. */
#define VK_DBE_NOCODEINPUT		0xFB /* Changes the mode to no-code input. */

/*
 * Virtual Scan Codes
 */

/**
 * Keyboard Type 4
 */

#define KBD4_T00		VK_NONE
#define KBD4_T01		VK_ESCAPE
#define KBD4_T02		VK_KEY_1
#define KBD4_T03		VK_KEY_2
#define KBD4_T04		VK_KEY_3
#define KBD4_T05		VK_KEY_4
#define KBD4_T06		VK_KEY_5
#define KBD4_T07		VK_KEY_6
#define KBD4_T08		VK_KEY_7
#define KBD4_T09		VK_KEY_8
#define KBD4_T0A		VK_KEY_9
#define KBD4_T0B		VK_KEY_0
#define KBD4_T0C		VK_OEM_MINUS
#define KBD4_T0D		VK_OEM_PLUS		/* NE */
#define KBD4_T0E		VK_BACK
#define KBD4_T0F		VK_TAB
#define KBD4_T10		VK_KEY_Q
#define KBD4_T11		VK_KEY_W
#define KBD4_T12		VK_KEY_E
#define KBD4_T13		VK_KEY_R
#define KBD4_T14		VK_KEY_T
#define KBD4_T15		VK_KEY_Y
#define KBD4_T16		VK_KEY_U
#define KBD4_T17		VK_KEY_I
#define KBD4_T18		VK_KEY_O
#define KBD4_T19		VK_KEY_P
#define KBD4_T1A		VK_OEM_4		/* NE */
#define KBD4_T1B		VK_OEM_6		/* NE */
#define KBD4_T1C		VK_RETURN
#define KBD4_T1D		VK_LCONTROL
#define KBD4_T1E		VK_KEY_A
#define KBD4_T1F		VK_KEY_S
#define KBD4_T20		VK_KEY_D
#define KBD4_T21		VK_KEY_F
#define KBD4_T22		VK_KEY_G
#define KBD4_T23		VK_KEY_H
#define KBD4_T24		VK_KEY_J
#define KBD4_T25		VK_KEY_K
#define KBD4_T26		VK_KEY_L
#define KBD4_T27		VK_OEM_1		/* NE */
#define KBD4_T28		VK_OEM_7		/* NE */
#define KBD4_T29		VK_OEM_3		/* NE */
#define KBD4_T2A		VK_LSHIFT
#define KBD4_T2B		VK_OEM_5
#define KBD4_T2C		VK_KEY_Z
#define KBD4_T2D		VK_KEY_X
#define KBD4_T2E		VK_KEY_C
#define KBD4_T2F		VK_KEY_V
#define KBD4_T30		VK_KEY_B
#define KBD4_T31		VK_KEY_N
#define KBD4_T32		VK_KEY_M
#define KBD4_T33		VK_OEM_COMMA
#define KBD4_T34		VK_OEM_PERIOD
#define KBD4_T35		VK_OEM_2
#define KBD4_T36		VK_RSHIFT
#define KBD4_T37		VK_MULTIPLY
#define KBD4_T38		VK_LMENU
#define KBD4_T39		VK_SPACE
#define KBD4_T3A		VK_CAPITAL
#define KBD4_T3B		VK_F1
#define KBD4_T3C		VK_F2
#define KBD4_T3D		VK_F3
#define KBD4_T3E		VK_F4
#define KBD4_T3F		VK_F5
#define KBD4_T40		VK_F6
#define KBD4_T41		VK_F7
#define KBD4_T42		VK_F8
#define KBD4_T43		VK_F9
#define KBD4_T44		VK_F10
#define KBD4_T45		VK_NUMLOCK
#define KBD4_T46		VK_SCROLL
#define KBD4_T47		VK_NUMPAD7		/* VK_HOME */
#define KBD4_T48		VK_NUMPAD8		/* VK_UP */
#define KBD4_T49		VK_NUMPAD9		/* VK_PRIOR */
#define KBD4_T4A		VK_SUBTRACT
#define KBD4_T4B		VK_NUMPAD4		/* VK_LEFT */
#define KBD4_T4C		VK_NUMPAD5		/* VK_CLEAR */
#define KBD4_T4D		VK_NUMPAD6		/* VK_RIGHT */
#define KBD4_T4E		VK_ADD
#define KBD4_T4F		VK_NUMPAD1		/* VK_END */
#define KBD4_T50		VK_NUMPAD2		/* VK_DOWN */
#define KBD4_T51		VK_NUMPAD3		/* VK_NEXT */
#define KBD4_T52		VK_NUMPAD0		/* VK_INSERT */
#define KBD4_T53		VK_DECIMAL		/* VK_DELETE */
#define KBD4_T54		VK_SNAPSHOT
#define KBD4_T55		VK_NONE
#define KBD4_T56		VK_OEM_102		/* NE */
#define KBD4_T57		VK_F11			/* NE */
#define KBD4_T58		VK_F12			/* NE */
#define KBD4_T59		VK_CLEAR
#define KBD4_T5A		VK_OEM_WSCTRL
#define KBD4_T5B		VK_OEM_FINISH
#define KBD4_T5C		VK_OEM_JUMP
#define KBD4_T5D		VK_EREOF
#define KBD4_T5E		VK_OEM_BACKTAB
#define KBD4_T5F		VK_OEM_AUTO
#define KBD4_T60		VK_NONE
#define KBD4_T61		VK_NONE
#define KBD4_T62		VK_ZOOM
#define KBD4_T63		VK_HELP
#define KBD4_T64		VK_F13
#define KBD4_T65		VK_F14
#define KBD4_T66		VK_F15
#define KBD4_T67		VK_F16
#define KBD4_T68		VK_F17
#define KBD4_T69		VK_F18
#define KBD4_T6A		VK_F19
#define KBD4_T6B		VK_F20
#define KBD4_T6C		VK_F21
#define KBD4_T6D		VK_F22
#define KBD4_T6E		VK_F23
#define KBD4_T6F		VK_OEM_PA3
#define KBD4_T70		VK_NONE
#define KBD4_T71		VK_OEM_RESET
#define KBD4_T72		VK_NONE
#define KBD4_T73		VK_ABNT_C1
#define KBD4_T74		VK_NONE
#define KBD4_T75		VK_NONE
#define KBD4_T76		VK_F24
#define KBD4_T77		VK_NONE
#define KBD4_T78		VK_NONE
#define KBD4_T79		VK_NONE
#define KBD4_T7A		VK_NONE
#define KBD4_T7B		VK_OEM_PA1
#define KBD4_T7C		VK_TAB
#define KBD4_T7D		VK_NONE
#define KBD4_T7E		VK_ABNT_C2
#define KBD4_T7F		VK_OEM_PA2

#define KBD4_X10		VK_MEDIA_PREV_TRACK
#define KBD4_X19		VK_MEDIA_NEXT_TRACK
#define KBD4_X1C		VK_RETURN
#define KBD4_X1D		VK_RCONTROL
#define KBD4_X20		VK_VOLUME_MUTE
#define KBD4_X21		VK_LAUNCH_APP2
#define KBD4_X22		VK_MEDIA_PLAY_PAUSE
#define KBD4_X24		VK_MEDIA_STOP
#define KBD4_X2E		VK_VOLUME_DOWN
#define KBD4_X30		VK_VOLUME_UP
#define KBD4_X32		VK_BROWSER_HOME
#define KBD4_X35		VK_DIVIDE
#define KBD4_X37		VK_SNAPSHOT
#define KBD4_X38		VK_RMENU
#define KBD4_X46		VK_PAUSE		/* VK_CANCEL */
#define KBD4_X47		VK_HOME
#define KBD4_X48		VK_UP
#define KBD4_X49		VK_PRIOR
#define KBD4_X4B		VK_LEFT
#define KBD4_X4D		VK_RIGHT
#define KBD4_X4F		VK_END
#define KBD4_X50		VK_DOWN
#define KBD4_X51		VK_NEXT			/* NE */
#define KBD4_X52		VK_INSERT
#define KBD4_X53		VK_DELETE
#define KBD4_X5B		VK_LWIN
#define KBD4_X5C		VK_RWIN
#define KBD4_X5D		VK_APPS
#define KBD4_X5E		VK_POWER
#define KBD4_X5F		VK_SLEEP
#define KBD4_X65		VK_BROWSER_SEARCH
#define KBD4_X66		VK_BROWSER_FAVORITES
#define KBD4_X67		VK_BROWSER_REFRESH
#define KBD4_X68		VK_BROWSER_STOP
#define KBD4_X69		VK_BROWSER_FORWARD
#define KBD4_X6A		VK_BROWSER_BACK
#define KBD4_X6B		VK_LAUNCH_APP1
#define KBD4_X6C		VK_LAUNCH_MAIL
#define KBD4_X6D		VK_LAUNCH_MEDIA_SELECT

#define KBD4_Y1D		VK_PAUSE

/**
 * Keyboard Type 7
 */

#define KBD7_T00		VK_NONE
#define KBD7_T01		VK_ESCAPE
#define KBD7_T02		VK_KEY_1
#define KBD7_T03		VK_KEY_2
#define KBD7_T04		VK_KEY_3
#define KBD7_T05		VK_KEY_4
#define KBD7_T06		VK_KEY_5
#define KBD7_T07		VK_KEY_6
#define KBD7_T08		VK_KEY_7
#define KBD7_T09		VK_KEY_8
#define KBD7_T0A		VK_KEY_9
#define KBD7_T0B		VK_KEY_0
#define KBD7_T0C		VK_OEM_MINUS
#define KBD7_T0D		VK_OEM_7		/* NE */
#define KBD7_T0E		VK_BACK
#define KBD7_T0F		VK_TAB
#define KBD7_T10		VK_KEY_Q
#define KBD7_T11		VK_KEY_W
#define KBD7_T12		VK_KEY_E
#define KBD7_T13		VK_KEY_R
#define KBD7_T14		VK_KEY_T
#define KBD7_T15		VK_KEY_Y
#define KBD7_T16		VK_KEY_U
#define KBD7_T17		VK_KEY_I
#define KBD7_T18		VK_KEY_O
#define KBD7_T19		VK_KEY_P
#define KBD7_T1A		VK_OEM_4		/* NE */
#define KBD7_T1B		VK_OEM_6		/* NE */
#define KBD7_T1C		VK_RETURN
#define KBD7_T1D		VK_LCONTROL
#define KBD7_T1E		VK_KEY_A
#define KBD7_T1F		VK_KEY_S
#define KBD7_T20		VK_KEY_D
#define KBD7_T21		VK_KEY_F
#define KBD7_T22		VK_KEY_G
#define KBD7_T23		VK_KEY_H
#define KBD7_T24		VK_KEY_J
#define KBD7_T25		VK_KEY_K
#define KBD7_T26		VK_KEY_L
#define KBD7_T27		VK_OEM_PLUS		/* NE */
#define KBD7_T28		VK_OEM_1		/* NE */
#define KBD7_T29		VK_OEM_3		/* NE */
#define KBD7_T2A		VK_LSHIFT
#define KBD7_T2B		VK_OEM_5		/* NE */
#define KBD7_T2C		VK_KEY_Z
#define KBD7_T2D		VK_KEY_X
#define KBD7_T2E		VK_KEY_C
#define KBD7_T2F		VK_KEY_V
#define KBD7_T30		VK_KEY_B
#define KBD7_T31		VK_KEY_N
#define KBD7_T32		VK_KEY_M
#define KBD7_T33		VK_OEM_COMMA
#define KBD7_T34		VK_OEM_PERIOD
#define KBD7_T35		VK_OEM_2
#define KBD7_T36		VK_RSHIFT
#define KBD7_T37		VK_MULTIPLY
#define KBD7_T38		VK_LMENU
#define KBD7_T39		VK_SPACE
#define KBD7_T3A		VK_DBE_ALPHANUMERIC	/* NE */
#define KBD7_T3B		VK_F1
#define KBD7_T3C		VK_F2
#define KBD7_T3D		VK_F3
#define KBD7_T3E		VK_F4
#define KBD7_T3F		VK_F5
#define KBD7_T40		VK_F6
#define KBD7_T41		VK_F7
#define KBD7_T42		VK_F8
#define KBD7_T43		VK_F9
#define KBD7_T44		VK_F10
#define KBD7_T45		VK_NUMLOCK
#define KBD7_T46		VK_SCROLL
#define KBD7_T47		VK_HOME
#define KBD7_T48		VK_UP
#define KBD7_T49		VK_PRIOR
#define KBD7_T4A		VK_SUBTRACT
#define KBD7_T4B		VK_LEFT
#define KBD7_T4C		VK_CLEAR
#define KBD7_T4D		VK_RIGHT
#define KBD7_T4E		VK_ADD
#define KBD7_T4F		VK_END
#define KBD7_T50		VK_DOWN
#define KBD7_T51		VK_NEXT
#define KBD7_T52		VK_INSERT
#define KBD7_T53		VK_DELETE
#define KBD7_T54		VK_SNAPSHOT
#define KBD7_T55		VK_NONE
#define KBD7_T56		VK_NONE			/* NE */
#define KBD7_T57		VK_F11
#define KBD7_T58		VK_F12
#define KBD7_T59		VK_CLEAR
#define KBD7_T5A		VK_NONAME		/* NE */
#define KBD7_T5B		VK_NONAME		/* NE */
#define KBD7_T5C		VK_NONAME		/* NE */
#define KBD7_T5D		VK_EREOF
#define KBD7_T5E		VK_NONE			/* NE */
#define KBD7_T5F		VK_NONAME		/* NE */
#define KBD7_T60		VK_NONE
#define KBD7_T61		VK_NONE			/* NE */
#define KBD7_T62		VK_NONE			/* NE */
#define KBD7_T63		VK_NONE
#define KBD7_T64		VK_F13
#define KBD7_T65		VK_F14
#define KBD7_T66		VK_F15
#define KBD7_T67		VK_F16
#define KBD7_T68		VK_F17
#define KBD7_T69		VK_F18
#define KBD7_T6A		VK_F19
#define KBD7_T6B		VK_F20
#define KBD7_T6C		VK_F21
#define KBD7_T6D		VK_F22
#define KBD7_T6E		VK_F23
#define KBD7_T6F		VK_NONE			/* NE */
#define KBD7_T70		VK_DBE_KATAKANA		/* NE */
#define KBD7_T71		VK_NONE			/* NE */
#define KBD7_T72		VK_NONE
#define KBD7_T73		VK_OEM_102		/* NE */
#define KBD7_T74		VK_NONE
#define KBD7_T75		VK_NONE
#define KBD7_T76		VK_F24
#define KBD7_T77		VK_DBE_SBCSCHAR		/* NE */
#define KBD7_T78		VK_NONE
#define KBD7_T79		VK_CONVERT		/* NE */
#define KBD7_T7A		VK_NONE
#define KBD7_T7B		VK_NONCONVERT		/* NE */
#define KBD7_T7C		VK_TAB
#define KBD7_T7D		VK_NONE			/* NE */
#define KBD7_T7E		VK_ABNT_C2
#define KBD7_T7F		VK_OEM_PA2

#define KBD7_X10		VK_MEDIA_PREV_TRACK
#define KBD7_X19		VK_MEDIA_NEXT_TRACK
#define KBD7_X1C		VK_RETURN
#define KBD7_X1D		VK_RCONTROL		/* NE */
#define KBD7_X20		VK_VOLUME_MUTE
#define KBD7_X21		VK_LAUNCH_APP2
#define KBD7_X22		VK_MEDIA_PLAY_PAUSE
#define KBD7_X24		VK_MEDIA_STOP
#define KBD7_X2E		VK_VOLUME_DOWN
#define KBD7_X30		VK_VOLUME_UP
#define KBD7_X32		VK_BROWSER_HOME
#define KBD7_X33		VK_OEM_8		/* NE */
#define KBD7_X35		VK_DIVIDE
#define KBD7_X37		VK_SNAPSHOT
#define KBD7_X38		VK_DBE_HIRAGANA		/* NE */
#define KBD7_X42		VK_NONE
#define KBD7_X43		VK_NONE
#define KBD7_X44		VK_NONE
#define KBD7_X46		VK_CANCEL
#define KBD7_X47		VK_HOME
#define KBD7_X48		VK_UP
#define KBD7_X49		VK_PRIOR
#define KBD7_X4B		VK_LEFT
#define KBD7_X4D		VK_RIGHT
#define KBD7_X4F		VK_END
#define KBD7_X50		VK_DOWN
#define KBD7_X51		VK_NEXT
#define KBD7_X52		VK_INSERT
#define KBD7_X53		VK_DELETE
#define KBD7_X5B		VK_LWIN
#define KBD7_X5C		VK_RWIN
#define KBD7_X5D		VK_APPS
#define KBD7_X5E		VK_POWER
#define KBD7_X5F		VK_SLEEP
#define KBD7_X65		VK_BROWSER_SEARCH
#define KBD7_X66		VK_BROWSER_FAVORITES
#define KBD7_X67		VK_BROWSER_REFRESH
#define KBD7_X68		VK_BROWSER_STOP
#define KBD7_X69		VK_BROWSER_FORWARD
#define KBD7_X6A		VK_BROWSER_BACK
#define KBD7_X6B		VK_LAUNCH_APP1
#define KBD7_X6C		VK_LAUNCH_MAIL
#define KBD7_X6D		VK_LAUNCH_MEDIA_SELECT
#define KBD7_XF1		VK_NONE			/* NE */
#define KBD7_XF2		VK_NONE			/* NE */

#define KBD7_Y1D		VK_PAUSE

/**
 * X11 Keycodes
 */

/**
 * Mac OS X
 */

#define APPLE_VK_ANSI_A			0x00
#define APPLE_VK_ANSI_S			0x01
#define APPLE_VK_ANSI_D			0x02
#define APPLE_VK_ANSI_F			0x03
#define APPLE_VK_ANSI_H			0x04
#define APPLE_VK_ANSI_G			0x05
#define APPLE_VK_ANSI_Z			0x06
#define APPLE_VK_ANSI_X			0x07
#define APPLE_VK_ANSI_C			0x08
#define APPLE_VK_ANSI_V			0x09
#define APPLE_VK_ISO_Section		0x0A
#define APPLE_VK_ANSI_B			0x0B
#define APPLE_VK_ANSI_Q			0x0C
#define APPLE_VK_ANSI_W			0x0D
#define APPLE_VK_ANSI_E			0x0E
#define APPLE_VK_ANSI_R			0x0F
#define APPLE_VK_ANSI_Y			0x10
#define APPLE_VK_ANSI_T			0x11
#define APPLE_VK_ANSI_1			0x12
#define APPLE_VK_ANSI_2			0x13
#define APPLE_VK_ANSI_3			0x14
#define APPLE_VK_ANSI_4			0x15
#define APPLE_VK_ANSI_6			0x16
#define APPLE_VK_ANSI_5			0x17
#define APPLE_VK_ANSI_Equal		0x18
#define APPLE_VK_ANSI_9			0x19
#define APPLE_VK_ANSI_7			0x1A
#define APPLE_VK_ANSI_Minus		0x1B
#define APPLE_VK_ANSI_8			0x1C
#define APPLE_VK_ANSI_0			0x1D
#define APPLE_VK_ANSI_RightBracket	0x1E
#define APPLE_VK_ANSI_O			0x1F
#define APPLE_VK_ANSI_U			0x20
#define APPLE_VK_ANSI_LeftBracket	0x21
#define APPLE_VK_ANSI_I			0x22
#define APPLE_VK_ANSI_P			0x23
#define APPLE_VK_Return			0x24
#define APPLE_VK_ANSI_L			0x25
#define APPLE_VK_ANSI_J			0x26
#define APPLE_VK_ANSI_Quote		0x27
#define APPLE_VK_ANSI_K			0x28
#define APPLE_VK_ANSI_Semicolon		0x29
#define APPLE_VK_ANSI_Backslash		0x2A
#define APPLE_VK_ANSI_Comma		0x2B
#define APPLE_VK_ANSI_Slash		0x2C
#define APPLE_VK_ANSI_N			0x2D
#define APPLE_VK_ANSI_M			0x2E
#define APPLE_VK_ANSI_Period		0x2F
#define APPLE_VK_Tab			0x30
#define APPLE_VK_Space			0x31
#define APPLE_VK_ANSI_Grave		0x32
#define APPLE_VK_Delete			0x33
#define APPLE_VK_0x34			0x34
#define APPLE_VK_Escape			0x35
#define APPLE_VK_0x36			0x36
#define APPLE_VK_Command		0x37
#define APPLE_VK_Shift			0x38
#define APPLE_VK_CapsLock		0x39
#define APPLE_VK_Option			0x3A
#define APPLE_VK_Control		0x3B
#define APPLE_VK_RightShift		0x3C
#define APPLE_VK_RightOption		0x3D
#define APPLE_VK_RightControl		0x3E
#define APPLE_VK_Function		0x3F
#define APPLE_VK_F17			0x40
#define APPLE_VK_ANSI_KeypadDecimal	0x41
#define APPLE_VK_0x42			0x42
#define APPLE_VK_ANSI_KeypadMultiply	0x43
#define APPLE_VK_0x44			0x44
#define APPLE_VK_ANSI_KeypadPlus	0x45
#define APPLE_VK_0x46			0x46
#define APPLE_VK_ANSI_KeypadClear	0x47
#define APPLE_VK_VolumeUp		0x48
#define APPLE_VK_VolumeDown		0x49
#define APPLE_VK_Mute			0x4A
#define APPLE_VK_ANSI_KeypadDivide	0x4B
#define APPLE_VK_ANSI_KeypadEnter	0x4C
#define APPLE_VK_0x4D			0x4D
#define APPLE_VK_ANSI_KeypadMinus	0x4E
#define APPLE_VK_F18			0x4F
#define APPLE_VK_F19			0x50
#define APPLE_VK_ANSI_KeypadEquals	0x51
#define APPLE_VK_ANSI_Keypad0		0x52
#define APPLE_VK_ANSI_Keypad1		0x53
#define APPLE_VK_ANSI_Keypad2		0x54
#define APPLE_VK_ANSI_Keypad3		0x55
#define APPLE_VK_ANSI_Keypad4		0x56
#define APPLE_VK_ANSI_Keypad5		0x57
#define APPLE_VK_ANSI_Keypad6		0x58
#define APPLE_VK_ANSI_Keypad7		0x59
#define APPLE_VK_F20			0x5A
#define APPLE_VK_ANSI_Keypad8		0x5B
#define APPLE_VK_ANSI_Keypad9		0x5C
#define APPLE_VK_JIS_Yen		0x5D
#define APPLE_VK_JIS_Underscore		0x5E
#define APPLE_VK_JIS_KeypadComma	0x5F
#define APPLE_VK_F5			0x60
#define APPLE_VK_F6			0x61
#define APPLE_VK_F7			0x62
#define APPLE_VK_F3			0x63
#define APPLE_VK_F8			0x64
#define APPLE_VK_F9			0x65
#define APPLE_VK_JIS_Eisu		0x66
#define APPLE_VK_F11			0x67
#define APPLE_VK_JIS_Kana		0x68
#define APPLE_VK_F13			0x69
#define APPLE_VK_F16			0x6A
#define APPLE_VK_F14			0x6B
#define APPLE_VK_F10			0x6D
#define APPLE_VK_0x6C			0x6C
#define APPLE_VK_0x6E			0x6E
#define APPLE_VK_F12			0x6F
#define APPLE_VK_0x70			0x70
#define APPLE_VK_F15			0x71
#define APPLE_VK_Help			0x72
#define APPLE_VK_Home			0x73
#define APPLE_VK_PageUp			0x74
#define APPLE_VK_ForwardDelete		0x75
#define APPLE_VK_F4			0x76
#define APPLE_VK_End			0x77
#define APPLE_VK_F2			0x78
#define APPLE_VK_PageDown		0x79
#define APPLE_VK_F1			0x7A
#define APPLE_VK_LeftArrow		0x7B
#define APPLE_VK_RightArrow		0x7C
#define APPLE_VK_DownArrow		0x7D
#define APPLE_VK_UpArrow		0x7E

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Functions
 */

WINPR_API char* GetVirtualKeyName(DWORD vkcode);
WINPR_API DWORD GetVirtualKeyCodeFromName(const char* vkname);
WINPR_API DWORD GetVirtualKeyCodeFromXkbKeyName(const char* xkbname);

WINPR_API DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType);
WINPR_API DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType);

#define KEYCODE_TYPE_APPLE		0x00000001
#define KEYCODE_TYPE_EVDEV		0x00000002

WINPR_API DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags);
WINPR_API DWORD GetKeycodeFromVirtualKeyCode(DWORD keycode, DWORD dwFlags);

#ifdef __cplusplus
}
#endif

#endif /* WINPR_INPUT_H */