|
|
1.1 root 1: /****************************** Module Header ******************************\
2: * Module Name: kbd.h
3: *
4: * Copyright (c) 1985-91, Microsoft Corporation
5: *
6: * Keyboard table values that form the basis for languages and keyboard types.
7: * The basis is US, kbd type 4 - all others are a variation on this.
8: * This file is included by all kbd**.h files.
9: *
10: * History:
11: * 10-Jan-1991 GregoryW
12: * 23-Apr-1991 IanJa VSC_TO_VK _* macros from oemtab.c
13: \***************************************************************************/
14:
15: #ifndef _KBD_
16: #define _KBD_
17:
18: /****************************************************************************\
19: *
20: * Keyboard Layers. Used in kdb??.dll and in usersrv.dll
21: *
22: \****************************************************************************/
23:
24: /*
25: * Key Event (KE) structure
26: * Stores a Virtual Key event
27: */
28: typedef struct tagKE {
29: BYTE bScanCode; // Virtual Scan Code (Set 1)
30: USHORT usFlaggedVk; // Vk | Flags
31: } KE, *PKE;
32:
33: typedef BOOL (* KEPROC)(PKE pKe);
34:
35: /*
36: * KE.usFlaggedVk values, also used in the keyboard layer tables.
37: */
38: #define KBDEXT (USHORT)0x0100
39: #define KBDMULTIVK (USHORT)0x0200
40: #define KBDSPECIAL (USHORT)0x0400
41: #define KBDNUMPAD (USHORT)0x0800
42: #define KBDBREAK (USHORT)0x8000
43:
44: /*
45: * Key message lParam bits
46: */
47: #define EXTENDED_BIT 0x01000000
48: #define DONTCARE_BIT 0x02000000
49: #define FAKE_KEYSTROKE 0x02000000
50:
51: /*
52: * Keyboard Shift State defines. These correspond to the bit mask defined
53: * by the VkKeyScan() API.
54: */
55: #define KBDBASE 0
56: #define KBDSHIFT 1
57: #define KBDCTRL 2
58: #define KBDALT 4
59:
60: /*
61: * Handy diacritics
62: */
63: #define GRAVE 0x0300
64: #define ACUTE 0x0301
65: #define CIRCUMFLEX 0x0302
66: #define TILDE 0x0303
67: #define MACRON 0x0304
68: #define OVERSCORE 0x0305
69: #define BREVE 0x0306
70: #define DOT_ABOVE 0x0307
71: #define UMLAUT 0x0308
72: #define DIARESIS UMLAUT
73: #define HOOK_ABOVE 0x0309
74: #define RING 0x030A
75: #define DOUBLE_ACUTE 0x030B
76: #define HACEK 0x030C
77:
78: #define CEDILLA 0x0327
79: #define OGONEK 0x0328
80: #define TONOS 0x0384
81: #define DIARESIS_TONOS 0x0385
82:
83:
84: #define wszGRAVE L"\x0300"
85: #define wszACUTE L"\x0301"
86: #define wszCIRCUMFLEX L"\x0302"
87: #define wszTILDE L"\x0303"
88: #define wszMACRON L"\x0304"
89: #define wszOVERSCORE L"\x0305"
90: #define wszBREVE L"\x0306"
91: #define wszDOT_ABOVE L"\x0307"
92: #define wszUMLAUT L"\x0308"
93: #define wszHOOK_ABOVE L"\x0309"
94: #define wszRING L"\x030A"
95: #define wszDOUBLE_ACUTE L"\x030B"
96: #define wszHACEK L"\x030C"
97:
98: #define wszCEDILLA L"\x0327"
99: #define wszOGONEK L"\x0328"
100: #define wszTONOS L"\x0384"
101: #define wszDIARESIS_TONOS L"\x0385"
102:
103: /*
104: * function prototypes
105: */
106: VOID VSCFromSC(PKE pke);
107: BYTE VKFromVSC(PKE pke, BYTE bPrefix, LPBYTE afKeyState);
108: BOOL KEOEMProcs(PKE pke);
109: BOOL KELocaleProcs(PKE pke);
110: VOID _KeyEvent(USHORT usVk, WORD wScanCode, DWORD ExtraInfo);
111:
112: /***************************************************************************\
113: * MODIFIER KEYS
114: *
115: * All keyboards have "Modifier" keys which are used to alter the behaviour of
116: * some of the other keys. These shifter keys are usually:
117: * Shift (left and/or right Shift key)
118: * Ctrl (left and/or right Ctrl key)
119: * Alt (left and/or right Alt key)
120: * AltGr (right Alt key only)
121: *
122: * NOTE:
123: * All keyboards use the Shift key.
124: * All keyboards use a Ctrl key to generate ASCII control characters.
125: * All keyboards with a number pad use the Alt key and the NumPad to
126: * generate characters by number.
127: * Keyboards using AltGr as a Modifier Key usually translate the Virtual
128: * ScanCode to Virtual Keys VK_CTRL + VK_ALT at input time: the Modifier
129: * tables should be written to treat Ctrl + Alt as a valid shifter
130: * key combination in these cases.
131: *
132: * By holding down 0 or more of these Modifier keys, a "shift state" is
133: * obtained : the shift state may affect the translation of Virtual Scancodes
134: * to Virtual Keys and/or the translation of Virtuals Key to Characters.
135: *
136: * EXAMPLES:
137: *
138: * Each key on a particular keyboard may be marked with up to five different
139: * characters in five different positions:
140: *
141: * .-------.
142: * /| |\
143: * : | 2 4 | :
144: * | | | |
145: * | | | |
146: * | | 1 3 | |
147: * | |_______| |
148: * | / \ |
149: * |/ 5 \|
150: * `-----------'
151: *
152: * A key may also be able to generate a character that is not marked on it:
153: * these are ASCII Control chars, lower-case letters and/or "invisible keys".
154: * .-------.
155: * An example of an "Invisible Key": /| |\
156: * : | > | :
157: * The German M24 keyboard 2 should produce the | | | |
158: * '|' character when ALT SHIFT is is held down | | | |
159: * while the '<' key (shown here) is pressed: | | < \ | |
160: * This keyboard has four other invisible | |_______| |
161: * characters. France, Italy and Spain also | / \ |
162: * support invisible characters on the M24 |/ \|
163: * Keyboard 2 with ALT SHIFT depressed. `-----------'
164: *
165: * The keyboard table must list the keys that contribute to it's shift state,
166: * and indicate which combinations are valid. This is done with
167: * aCharModifiers[] - convert combinations of Modifier Keys to Bitmasks.
168: * and
169: * aModification[]; - convert Modifier Bitmasks to enumerated Modifications
170: *
171: * AN EXAMPLE OF VALID AND INVALID MODIFIER KEY COMBINATIONS
172: *
173: * The US English keyboard has 3 Modifier keys:
174: * Shift (left or right); Ctrl (left or right); and Alt (left or right).
175: *
176: * The only valid combinations of these Modifier Keys are:
177: * none pressed : Character at position (1) on the key.
178: * Shift : Character at position (2) on the key.
179: * Ctrl : Ascii Control characters
180: * Shift + Ctrl : Ascii Control characters
181: * Alt : Character-by-number on the numpad
182: *
183: * The invalid combinations (that do not generate any characters) are:
184: * Shift + Alt
185: * Alt + Ctrl
186: * Shift + Alt + Ctrl
187: *
188: * Something (???) :
189: * -----------------
190: * Modifier keys Character produced
191: * ------------------------- ------------------
192: * 0 No shifter key depressed position 1
193: * 1 Shift key is depressed position 2
194: * 2 AltGr (r.h. Alt) depressed position 4 or 5 (whichever is marked)
195: *
196: * However, note that 3 shifter keys (SHIFT, can be combined in a
197: * characters, depending on the Keyboards
198: * Consider the following keyboards:
199: *
200: * .-------. STRANGE KBD PECULIAR KBD
201: * /| |\ ================== ==================
202: * : | 2 4 | : 1 -
203: * | | | | 2 - SHIFT SHIFT
204: * | | | | 3 - MENU MENU
205: * | | 1 3 | | 4 - SHIFT + MENU SHIFT + MENU
206: * | |_______| | 5 - no such keys CTRL + MENU
207: * | / \ |
208: * |/ 5 \|
209: * `-----------'
210: * Both STRANGE and PECULIAR keyboards could have aVkToBits[] =
211: * { VK_SHIFT , KBDSHIFT }, // 0x01
212: * { VK_CONTROL, KBDCTRL }, // 0x02
213: * { VK_MENU , KBDALT }, // 0x04
214: * { 0, 0 }
215: *
216: * The STRANGE keyboard has 4 distinct shift states, while the PECULIAR kbd
217: * has 5. However, note that 3 shifter bits can be combined in a
218: * total of 2^3 == 8 ways. Each such combination must be related to one (or
219: * none) of the enumerated shift states.
220: * Each shifter key combination can be represented by three binary bits:
221: * Bit 0 is set if VK_SHIFT is down
222: * Bit 1 is set if VK_CONTROL is down
223: * Bit 2 is set if VK_MENU is down
224: *
225: * Example: If the STRANGE keyboard generates no characters in combination
226: * when just the ALT key is held down, nor when the SHIFT, CTRL and ALT keys
227: * are all held down, then the tables might look like this:
228: *
229: * VK_MENU,
230: * VK_CTRL, 0
231: * };
232: * aModification[] = {
233: * 0, // 0 0 0 = 000 <none>
234: * 1, // 0 0 1 = 001 SHIFT
235: * SHFT_INVALID, // 0 1 0 = 010 ALT
236: * 2, // 0 1 1 = 011 SHIFT ALT
237: * 3, // 1 0 0 = 100 CTRL
238: * 4, // 1 0 1 = 101 SHIFT CTRL
239: * 5, // 1 1 0 = 110 CTRL ALT
240: * SHFT_INVALID // 1 1 1 = 111 SHIFT CTRL ALT
241: * };
242: *
243: *
244: \***************************************************************************/
245:
246: /***************************************************************************\
247: * VK_TO_BIT - associate a Virtual Key with a Modifier bitmask.
248: *
249: * Vk - the Virtual key (eg: VK_SHIFT, VK_RMENU, VK_CONTROL etc.)
250: * Special Values:
251: * 0 null terminator
252: * ModBits - a combination of KBDALT, KBDCTRL, KBDSHIFT and kbd-specific bits
253: * Any kbd-specific shift bits must be the lowest-order bits other
254: * than KBDSHIFT, KBDCTRL and KBDALT (0, 1 & 2)
255: *
256: * Those languages that use AltGr (VK_RMENU) to shift keys convert it to
257: * CTRL+ALT with the KBDSPECIAL bit in the ausVK[] entry for VK_RMENU
258: * and by having an entry in aVkToPfnOem[] to simulate the right Vk sequence.
259: *
260: \***************************************************************************/
261: typedef struct {
262: BYTE Vk;
263: BYTE ModBits;
264: } VK_TO_BIT, *PVK_TO_BIT;
265:
266: /***************************************************************************\
267: * pModNumber - a table to map shift bits to enumerated shift states
268: *
269: * Table attributes: Ordered table
270: *
271: * Maps all possible shifter key combinations to an enumerated shift state.
272: * The size of the table depends on the value of the highest order bit used
273: * in aCharModifiers[*].ModBits
274: *
275: * Special values for aModification[*]
276: * SHFT_INVALID - no characters produced with this shift state.
277: LATER: (ianja) no SHFT_CTRL - control characters encoded in tables like others
278: * SHFT_CTRL - standard control character production (all keyboards must
279: * be able to produce CTRL-C == 0x0003 etc.)
280: * Other - enumerated shift state (not less than 0)
281: *
282: * This table is indexed by the Modifier Bits to obtain an Modification Number.
283: *
284: * CONTROL MENU SHIFT
285: *
286: * aModification[] = {
287: * 0, // 0 0 0 = 000 <none>
288: * 1, // 0 0 1 = 001 SHIFT
289: * SHFT_INVALID, // 0 1 0 = 010 ALT
290: * 2, // 0 1 1 = 011 SHIFT ALT
291: * 3, // 1 0 0 = 100 CTRL
292: * 4, // 1 0 1 = 101 SHIFT CTRL
293: * 5, // 1 1 0 = 110 CTRL ALT
294: * SHFT_INVALID // 1 1 1 = 111 SHIFT CTRL ALT
295: * };
296: *
297: \***************************************************************************/
298: typedef struct {
299: PVK_TO_BIT pVkToBit; // Virtual Keys -> Mod bits
300: WORD wMaxModBits; // max Modification bit combination value
301: BYTE ModNumber[]; // Mod bits -> Modification Number
302: } MODIFIERS, *PMODIFIERS;
303:
304: WORD GetModifierBits(PMODIFIERS pModifiers, LPBYTE afKeyState);
305: WORD GetModificationNumber(PMODIFIERS pModifiers, WORD wModBits);
306:
307: #define SHFT_INVALID 0x0F
308:
309: /***************************************************************************\
310: * apulCvt_VK[] - obtain VK translation table from shift state
311: * A VK translation table is used to change the value of the Virtual Key
312: * according to the shift state. OEM only (not locale-specific)
313: \***************************************************************************/
314: extern PULONG *gapulCvt_VK;
315: extern ULONG *gapulCvt_VK_101[];
316: extern ULONG *gapulCvt_VK_84[];
317:
318: /***************************************************************************\
319: * awNumPadCvt[] - Translate cursor movement keys to numpad keys
320: \***************************************************************************/
321: extern MODIFIERS Modifiers_VK;
322: extern BYTE aVkNumpad[];
323:
324: /***************************************************************************\
325: * VSC_VK - Associate a Virtual Scancode with a Virtual Key
326: * Vsc - Virtual Scancode
327: * Vk - Virtual Key | flags
328: * Used by VKFromVSC() for scancodes prefixed 0xE0 or 0xE1
329: \***************************************************************************/
330: typedef struct VSC_VK {
331: BYTE Vsc;
332: USHORT Vk;
333: } VSC_VK, *PVSC_VK;
334:
335: /***************************************************************************\
336: * VK_VSC - Associate a Virtual Key with a Virtual Scancode
337: * Vk - Virtual Key
338: * Vsc - Virtual Scancode
339: * Used by MapVirtualKey for Virtual Keys not appearing in ausVK[]
340: \***************************************************************************/
341: typedef struct VK_VSC {
342: BYTE Vk;
343: BYTE Vsc;
344: } VK_VSC, *PVK_VSC;
345:
346: /***************************************************************************\
347: *
348: * VK_TO_WCHARS<n> - Associate a Virtual Key with <n> UNICODE characters
349: *
350: * VirtualKey - The Virtual Key.
351: * wch[] - An array of characters, one for each shift state that
352: * applies to the specified Virtual Key.
353: *
354: * Special values for VirtualKey:
355: * -1 - This entry contains dead chars for the previous entry
356: * 0 - Terminates a VK_TO_WCHARS[] table
357: *
358: * Special values for Attributes:
359: * CAPLOK - The CAPS-LOCK/SHIFT-LOCK key affects this key like SHIFT
360: *
361: * Special values for wch[*]:
362: * WCH_NONE - No character is generated by pressing this key with the
363: * current shift state.
364: * WCH_DEAD - The character is a dead-key: the next VK_TO_WCHARS[] entry
365: * will contain the values of the dead characters (diaresis)
366: * that can be produced by the Virtual Key.
367: *
368: \***************************************************************************/
369: #define WCH_NONE 0xF000
370: #define WCH_DEAD 0xF001
371:
372: #define CAPLOK 0x01
373:
374: /*
375: * Macro for VK to WCHAR with "n" shift states
376: */
377: #define TYPEDEF_VK_TO_WCHARS(n) typedef struct _VK_TO_WCHARS##n { \
378: BYTE VirtualKey; \
379: BYTE Attributes; \
380: WCHAR wch[n]; \
381: } VK_TO_WCHARS##n, *PVK_TO_WCHARS##n;
382:
383: /*
384: * To facilitate coding the table scanning routine.
385: */
386:
387: /*
388: * Table element types (for various numbers of shift states), used
389: * to facilitate static initializations of tables.
390: * VK_TO_WCHARS1 and PVK_TO_WCHARS1 may be used as the generic type
391: */
392: TYPEDEF_VK_TO_WCHARS(1) // VK_TO_WCHARS1, *PVK_TO_WCHARS1;
393: TYPEDEF_VK_TO_WCHARS(2) // VK_TO_WCHARS2, *PVK_TO_WCHARS2;
394: TYPEDEF_VK_TO_WCHARS(3) // VK_TO_WCHARS3, *PVK_TO_WCHARS3;
395: TYPEDEF_VK_TO_WCHARS(4) // VK_TO_WCHARS4, *PVK_TO_WCHARS4;
396: TYPEDEF_VK_TO_WCHARS(5) // VK_TO_WCHARS5, *PVK_TO_WCHARS5;
397: TYPEDEF_VK_TO_WCHARS(6) // VK_TO_WCHARS6, *PVK_TO_WCHARS5;
398:
399: /***************************************************************************\
400: *
401: * VK_TO_WCHAR_TABLE - Describe a table of VK_TO_WCHARS1
402: *
403: * pVkToWchars - points to the table.
404: * nModifications - the number of shift-states supported by this table.
405: * (this is the number of elements in pVkToWchars[*].wch[])
406: *
407: * A keyboard may have several such tables: all keys with the same number of
408: * shift-states are grouped together in one table.
409: *
410: * Special values for pVktoWchars:
411: * NULL - Terminates a VK_TO_WCHAR_TABLE[] list.
412: *
413: \***************************************************************************/
414:
415: typedef struct _VK_TO_WCHAR_TABLE {
416: PVK_TO_WCHARS1 pVkToWchars;
417: BYTE nModifications;
418: BYTE cbSize;
419: } VK_TO_WCHAR_TABLE, *PVK_TO_WCHAR_TABLE;
420:
421: /***************************************************************************\
422: *
423: * Dead Key (diaresis) tables
424: *
425: * LATER IanJa: supplant by an NLS API that composes Diacritic+Base -> WCHAR
426: *
427: \***************************************************************************/
428: typedef struct {
429: DWORD dwBoth; // diacritic & char
430: WCHAR wchComposed;
431: } DEADKEY, *PDEADKEY;
432:
433: #define DEADTRANS(ch, accent, comp) { MAKELONG(ch, accent), comp}
434:
435: /***************************************************************************\
436: * VSC_LPWSTR - associate a Virtual Scancode with a Text string
437: *
438: * Uses:
439: * GetKeyNameText(), aKeyNames[] Map virtual scancode to name of key
440: *
441: \***************************************************************************/
442: typedef struct {
443: BYTE vsc;
444: LPWSTR pwsz;
445: } VSC_LPWSTR, *PVSC_LPWSTR;
446:
447: /***************************************************************************\
448: *
449: * VK_F - associate a Virtual Key with a bitmask
450: *
451: * Uses:
452: * Special handle of Virtual Keys - fake different VK sequences
453: *
454: * Vk - A virtual key that is to produce key event simulation.
455: * fKEProc - A bitmask identifying the Key Event simulator procedure(s) to use.
456: * The postion of each set bit is an index into a table of procedure
457: * addresses. Using a bitmask here allows one key to have more than
458: * one Key Event simulator procedure.
459: *
460: \***************************************************************************/
461: typedef struct {
462: BYTE Vk;
463: BYTE fKEProc;
464: } VK_F, *PVK_F;
465:
466: #define KLLF_ALTGR 0x00000001
467:
468: /***************************************************************************\
469: * KBDTABLES
470: *
471: * This structure describes all the tables that implement the keyboard layer.
472: *
473: * When switching to a new layer, we get a new KBDTABLES structure: all key
474: * processing tables are accessed indirectly through this structure.
475: *
476: \***************************************************************************/
477:
478: typedef struct tagKbdLayer {
479: /*
480: * Modifier keys
481: */
482: PMODIFIERS pCharModifiers;
483:
484: /*
485: * Characters
486: */
487: VK_TO_WCHAR_TABLE *pVkToWcharTable; // ptr to tbl of ptrs to tbl
488:
489: /*
490: * Diacritics
491: */
492: PDEADKEY pDeadKey;
493:
494: /*
495: * Names of Keys
496: */
497: VSC_LPWSTR *pKeyNames;
498: VSC_LPWSTR *pKeyNamesExt;
499: LPWSTR *pKeyNamesDead;
500:
501: /*
502: * Scan codes to Virtual Keys
503: */
504: USHORT *pusVSCtoVK;
505: BYTE bMaxVSCtoVK;
506: PVSC_VK pVSCtoVK_E0; // Scancode has E0 prefix
507: PVSC_VK pVSCtoVK_E1; // Scancode has E1 prefix
508:
509: /*
510: * Locale-specific special processing
511: */
512: DWORD fLocaleFlags;
513: } KBDTABLES, *PKBDTABLES;
514:
515: /*
516: * OEM-specific special processing (keystroke simulators and filters)
517: */
518: extern VK_F aVkToFOEM[];
519: extern KEPROC aKEProcOEM[];
520:
521: /***************************************************************************\
522: * Macros for ausVK[] values (used below)
523: *
524: * These macros prefix each argument with VK_ to produce the name of a Virtual
525: * Key defined in "winuser.h" (eg: ESCAPE becomes VK_ESCAPE).
526: \***************************************************************************/
527: #ifndef KBD_TYPE
528: #define KBD_TYPE 4
529: #endif
530:
531: /*
532: * _NE() selects the Virtual Key according to keyboard type
533: */
534: #if (KBD_TYPE == 1)
535: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v1)
536: #elif (KBD_TYPE == 2)
537: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v2)
538: #elif (KBD_TYPE == 3)
539: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v3)
540: #elif (KBD_TYPE == 4)
541: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v4)
542: #elif (KBD_TYPE == 5)
543: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v5)
544: #elif (KBD_TYPE == 6)
545: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v6)
546: #endif
547:
548: /*
549: * _EQ() selects the same Virtual Key for all keyboard types
550: */
551: #define _EQ( v4 ) (VK_##v4)
552:
553: /*
554: * A bit of trickery for virtual key names 'A' to 'Z' and '0' to '9' so
555: * that they are not converted to a VK_* name.
556: * With this macro, VK_'A' equates to 'A' etc.
557: */
558: #define VK_
559: #define VK__none_ 0xFF
560:
561: /***************************************************************************\
562: * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion)
563: *
564: * These values are for Scancode Set 3 and the USA.
565: * Other languages substitute their own values where required (files kbd**.h)
566: *
567: * Six sets of keyboards are supported, according to KBD_TYPE:
568: *
569: * KBD_TYPE Keyboard (examples)
570: * ======== =======================================================
571: * 1 AT&T '301' & '302'; Olivetti 83-key; PC-XT 84-key; etc.
572: * 2 Olivetti M24 102-key
573: * 3 HP Vectra (DIN); Olivetti 86-key; etc.
574: * 4 * Enhanced 101/102-key; Olivetti A; etc.
575: * 5 Nokia (Ericsson) type 5 (1050, etc.)
576: * 6 Nokia (Ericsson) type 6 (9140)
577: *
578: * * If KBD_TYPE is not defined, the default is type 4.
579: *
580: * _EQ() : all keyboard types have the same virtual key for this scancode
581: * _NE() : different virtual keys for this scancode, depending on kbd type
582: *
583: * +------+ +--------+--------+--------+--------+--------+--------+
584: * | Scan | | kbd | kbd | kbd | kbd | kbd | kbd |
585: * | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 |
586: \****+-------+-+--------+--------+--------+--------+--------+--------+******/
587:
588: #define T00 _EQ( _none_ )
589: #define T01 _EQ( ESCAPE )
590: #define T02 _EQ( '1' )
591: #define T03 _EQ( '2' )
592: #define T04 _EQ( '3' )
593: #define T05 _EQ( '4' )
594: #define T06 _EQ( '5' )
595: #define T07 _EQ( '6' )
596: #define T08 _EQ( '7' )
597: #define T09 _EQ( '8' )
598: #define T0A _EQ( '9' )
599: #define T0B _EQ( '0' )
600: #define T0C _EQ( OEM_MINUS )
601: #define T0D _NE(OEM_PLUS,OEM_4, OEM_PLUS,OEM_PLUS,OEM_PLUS,OEM_PLUS)
602: #define T0E _EQ( BACK )
603: #define T0F _EQ( TAB )
604: #define T10 _EQ( 'Q' )
605: #define T11 _EQ( 'W' )
606: #define T12 _EQ( 'E' )
607: #define T13 _EQ( 'R' )
608: #define T14 _EQ( 'T' )
609: #define T15 _EQ( 'Y' )
610: #define T16 _EQ( 'U' )
611: #define T17 _EQ( 'I' )
612: #define T18 _EQ( 'O' )
613: #define T19 _EQ( 'P' )
614: #define T1A _NE(OEM_4, OEM_6, OEM_4, OEM_4, OEM_4, OEM_4 )
615: #define T1B _NE(OEM_6, OEM_1, OEM_6, OEM_6, OEM_6, OEM_6 )
616: #define T1C _EQ( RETURN )
617: #define T1D _EQ( LCONTROL )
618: #define T1E _EQ( 'A' )
619: #define T1F _EQ( 'S' )
620: #define T20 _EQ( 'D' )
621: #define T21 _EQ( 'F' )
622: #define T22 _EQ( 'G' )
623: #define T23 _EQ( 'H' )
624: #define T24 _EQ( 'J' )
625: #define T25 _EQ( 'K' )
626: #define T26 _EQ( 'L' )
627: #define T27 _NE(OEM_1, OEM_PLUS,OEM_1, OEM_1, OEM_1, OEM_1 )
628: #define T28 _NE(OEM_7, OEM_3, OEM_7, OEM_7, OEM_3, OEM_3 )
629: #define T29 _NE(OEM_3, OEM_7, OEM_3, OEM_3, OEM_7, OEM_7 )
630: #define T2A _EQ( LSHIFT )
631: #define T2B _EQ( OEM_5 )
632: #define T2C _EQ( 'Z' )
633: #define T2D _EQ( 'X' )
634: #define T2E _EQ( 'C' )
635: #define T2F _EQ( 'V' )
636: #define T30 _EQ( 'B' )
637: #define T31 _EQ( 'N' )
638: #define T32 _EQ( 'M' )
639: #define T33 _EQ( OEM_COMMA )
640: #define T34 _EQ( OEM_PERIOD )
641: #define T35 _EQ( OEM_2 )
642: #define T36 _EQ( RSHIFT )
643: #define T37 _EQ( MULTIPLY )
644: #define T38 _EQ( LMENU )
645: #define T39 _EQ( ' ' )
646: #define T3A _EQ( CAPITAL )
647: #define T3B _EQ( F1 )
648: #define T3C _EQ( F2 )
649: #define T3D _EQ( F3 )
650: #define T3E _EQ( F4 )
651: #define T3F _EQ( F5 )
652: #define T40 _EQ( F6 )
653: #define T41 _EQ( F7 )
654: #define T42 _EQ( F8 )
655: #define T43 _EQ( F9 )
656: #define T44 _EQ( F10 )
657: #define T45 _EQ( NUMLOCK )
658: #define T46 _EQ( OEM_SCROLL )
659: #define T47 _EQ( HOME )
660: #define T48 _EQ( UP )
661: #define T49 _EQ( PRIOR )
662: #define T4A _EQ( SUBTRACT )
663: #define T4B _EQ( LEFT )
664: #define T4C _EQ( CLEAR )
665: #define T4D _EQ( RIGHT )
666: #define T4E _EQ( ADD )
667: #define T4F _EQ( END )
668: #define T50 _EQ( DOWN )
669: #define T51 _EQ( NEXT )
670: #define T52 _EQ( INSERT )
671: #define T53 _EQ( DELETE )
672: #define T54 _EQ( SNAPSHOT )
673: #define T55 _EQ( _none_ )
674: #define T56 _NE(OEM_102, HELP, OEM_102, OEM_102, _none_, OEM_PA2 )
675: #define T57 _NE(F11, RETURN, F11, F11, _none_, HELP )
676: #define T58 _NE(F12, LEFT, F12, F12, _none_, OEM_102 )
677: #define T59 _EQ( CLEAR )
678: #define T5A _EQ( NONAME )// WSCtrl
679: #define T5B _EQ( NONAME )// Finish
680: #define T5C _EQ( NONAME )// Jump
681: #define T5D _EQ( EREOF )
682: #define T5E _EQ( _none_ )
683: #define T5F _EQ( NONAME )
684: #define T60 _EQ( _none_ )
685: #define T61 _EQ( _none_ )
686: #define T62 _EQ( _none_ )
687: #define T63 _EQ( _none_ )
688: #define T64 _EQ( F13 )
689: #define T65 _EQ( F14 )
690: #define T66 _EQ( F15 )
691: #define T67 _EQ( F16 )
692: #define T68 _EQ( F17 )
693: #define T69 _EQ( F18 )
694: #define T6A _EQ( F19 )
695: #define T6B _EQ( F20 )
696: #define T6C _EQ( F21 )
697: #define T6D _EQ( F22 )
698: #define T6E _EQ( F23 )
699: #define T6F _EQ( _none_ )
700: #define T70 _EQ( _none_ )
701: #define T71 _EQ( _none_ )
702: #define T72 _EQ( _none_ )
703: #define T73 _EQ( _none_ )
704: #define T74 _EQ( _none_ )
705: #define T75 _EQ( _none_ )
706: #define T76 _EQ( F24 )
707: #define T77 _EQ( _none_ )
708: #define T78 _EQ( _none_ )
709: #define T79 _EQ( _none_ )
710: #define T7A _EQ( _none_ )
711: #define T7B _EQ( _none_ )
712: #define T7C _EQ( TAB )
713:
714: #define X1C _EQ( RETURN )
715: #define X1D _EQ( RCONTROL )
716: #define X35 _EQ( DIVIDE )
717: #define X37 _EQ( SNAPSHOT )
718: #define X38 _EQ( RMENU )
719: #define X46 _EQ( CANCEL )
720: #define X47 _EQ( HOME )
721: #define X48 _EQ( UP )
722: #define X49 _EQ( PRIOR )
723: #define X4B _EQ( LEFT )
724: #define X4D _EQ( RIGHT )
725: #define X4F _EQ( END )
726: #define X50 _EQ( DOWN )
727: #define X51 _NE(NEXT, F1, NEXT, NEXT, _none_, OEM_PA2 )
728: #define X52 _EQ( INSERT )
729: #define X53 _EQ( DELETE )
730:
731: /*
732: * The break key is sent to us as E1,LCtrl,NumLock
733: * We must conevrt the E1+LCtrl to BREAK, then ignore the Numlock
734: * which must be ignored. Alternatively, translate Ctrl-Numlock
735: * to break, but don't let the CTRL through as a WM_KEYUP/DOWN) ?
736: */
737: #define Y1D _EQ( PAUSE )
738:
739: #define SCANCODE_LSHIFT 0x2A
740: #define SCANCODE_RSHIFT 0x36
741: #define SCANCODE_SIMULATED (FAKE_KEYSTROKE >> 16)
742:
743: #define SCANCODE_NUMPAD_FIRST 0x47
744: #define SCANCODE_NUMPAD_LAST 0x52
745:
746: #endif // _KBD_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.