|
|
1.1 root 1: /***************************************************************************\
2: * Module Name: kbdus.c
3: *
4: * Copyright (c) 1985-93, Microsoft Corporation
5: *
6: * History:
7: \***************************************************************************/
8:
9: #include <windows.h>
10: #include "vkoem.h"
11: #include "kbd.h"
12: #include "kbdus.h"
13:
14: /***************************************************************************\
15: * asuVK[] - Virtual Scan Code to Virtual Key conversion table for US
16: \***************************************************************************/
17:
18: static USHORT ausVK[] = {
19: T00, T01, T02, T03, T04, T05, T06, T07,
20: T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
21: T10, T11, T12, T13, T14, T15, T16, T17,
22: T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
23: T20, T21, T22, T23, T24, T25, T26, T27,
24: T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,
25: T30, T31, T32, T33, T34, T35,
26:
27: /*
28: * Right-hand Shift key must have KBDEXT bit set.
29: */
30: T36 | KBDEXT,
31:
32: T37 | KBDMULTIVK, // numpad_* + Shift/Alt -> SnapShot
33:
34: T38, T39, T3A, T3B, T3C, T3D, T3E,
35: T3F, T40, T41, T42, T43, T44,
36:
37: /*
38: * NumLock Key:
39: * KBDEXT - VK_NUMLOCK is an Extended key
40: * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
41: */
42: T45 | KBDEXT | KBDMULTIVK,
43:
44: T46 | KBDMULTIVK,
45:
46: /*
47: * Number Pad keys:
48: * KBDNUMPAD - digits 0-9 and decimal point.
49: * KBDSPECIAL - require special processing by Windows
50: */
51: T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home)
52: T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up),
53: T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp),
54: T4A,
55: T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left),
56: T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear),
57: T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right),
58: T4E,
59: T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End),
60: T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down),
61: T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn),
62: T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins),
63: T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del),
64:
65: T54, T55, T56, T57, T58, T59, T5A, T5B,
66: T5C, T5D, T5E, T5F, T60, T61, T62, T63,
67: T64, T65, T66, T67, T68, T69, T6A, T6B,
68: T6C, T6D, T6E, T6F, T70, T71, T72, T73,
69: T74, T75, T76, T77, T78, T79, T7A, T7B,
70: T7C
71:
72: };
73:
74: static VSC_VK aE0VscToVk[] = {
75: { 0x1C, X1C | KBDEXT }, // Numpad Enter
76: { 0x1D, X1D | KBDEXT }, // RControl
77: { 0x35, X35 | KBDEXT }, // Numpad Divide
78: { 0x37, X37 | KBDEXT }, // Snapshot
79: { 0x38, X38 | KBDEXT }, // RMenu
80: { 0x46, X46 | KBDEXT }, // Break (Ctrl + Pause)
81: { 0x47, X47 | KBDEXT }, // Home
82: { 0x48, X48 | KBDEXT }, // Up
83: { 0x49, X49 | KBDEXT }, // Prior
84: { 0x4B, X4B | KBDEXT }, // Left
85: { 0x4D, X4D | KBDEXT }, // Right
86: { 0x4F, X4F | KBDEXT }, // End
87: { 0x50, X50 | KBDEXT }, // Down
88: { 0x51, X51 | KBDEXT }, // Next
89: { 0x52, X52 | KBDEXT }, // Insert
90: { 0x53, X53 | KBDEXT }, // Delete
91: { 0, 0 }
92: };
93:
94: static VSC_VK aE1VscToVk[] = {
95: { 0x1D, Y1D }, // Pause
96: { 0 , 0 }
97: };
98:
99: /***************************************************************************\
100: * aVkToBits[] - map Virtual Keys to Modifier Bits
101: *
102: * See kbd.h for a full description.
103: *
104: * US Keyboard has only three shifter keys:
105: * SHIFT (L & R) affects alphabnumeric keys,
106: * CTRL (L & R) is used to generate control characters
107: * ALT (L & R) used for generating characters by number with numpad
108: \***************************************************************************/
109:
110: static VK_TO_BIT aVkToBits[] = {
111: { VK_SHIFT, KBDSHIFT },
112: { VK_CONTROL, KBDCTRL },
113: { VK_MENU, KBDALT },
114: { 0, 0 }
115: };
116:
117: /***************************************************************************\
118: * aModification[] - map character modifier bits to modification number
119: *
120: * See kbd.h for a full description.
121: *
122: \***************************************************************************/
123:
124: static MODIFIERS CharModifiers = {
125: &aVkToBits[0],
126: 3,
127: {
128: // Modification# // Keys Pressed : Explanation
129: // ============= // ============== : =============================
130: 0, // : unshifted characters
131: 1, // SHIFT : capitals, ~!@#$%^&*()_+{}:"<>? etc.
132: 2, // CTRL : control characters
133: 3 // CTRL SHIFT :
134: // ALT : invalid
135: // ALT SHIFT : invalid
136: // ALT CTRL : invalid
137: // ALT CTRL SHIFT : invalid
138: }
139: };
140:
141: /***************************************************************************\
142: *
143: * aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states
144: * aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states
145: * aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states
146: *
147: * Table attributes: Unordered Scan, null-terminated
148: *
149: * Search this table for an entry with a matching Virtual Key to find the
150: * corresponding unshifted and shifted WCHAR characters.
151: *
152: * Reserved VirtualKey values (first column)
153: * -1 - this line contains dead characters (diacritic)
154: * 0 - terminator
155: *
156: * Reserved Attribute values (second column)
157: * CAPLOK - CapsLock affects this key like Shift
158: *
159: * Reserved character values (third through last column)
160: * WCH_NONE - No character
161: * WCH_DEAD - Dead character (diacritic) value is in next line
162: *
163: \***************************************************************************/
164:
165: static VK_TO_WCHARS2 aVkToWch2[] = {
166: {'0' , 0 ,'0' ,')' },
167: {'1' , 0 ,'1' ,'!' },
168: {'3' , 0 ,'3' ,'#' },
169: {'4' , 0 ,'4' ,'$' },
170: {'5' , 0 ,'5' ,'%' },
171: {'7' , 0 ,'7' ,'&' },
172: {'8' , 0 ,'8' ,'*' },
173: {'9' , 0 ,'9' ,'(' },
174: {'A' , CAPLOK ,'a' ,'A' },
175: {'B' , CAPLOK ,'b' ,'B' },
176: {'C' , CAPLOK ,'c' ,'C' },
177: {'D' , CAPLOK ,'d' ,'D' },
178: {'E' , CAPLOK ,'e' ,'E' },
179: {'F' , CAPLOK ,'f' ,'F' },
180: {'G' , CAPLOK ,'g' ,'G' },
181: {'H' , CAPLOK ,'h' ,'H' },
182: {'I' , CAPLOK ,'i' ,'I' },
183: {'J' , CAPLOK ,'j' ,'J' },
184: {'K' , CAPLOK ,'k' ,'K' },
185: {'L' , CAPLOK ,'l' ,'L' },
186: {'M' , CAPLOK ,'m' ,'M' },
187: {'N' , CAPLOK ,'n' ,'N' },
188: {'O' , CAPLOK ,'o' ,'O' },
189: {'P' , CAPLOK ,'p' ,'P' },
190: {'Q' , CAPLOK ,'q' ,'Q' },
191: {'R' , CAPLOK ,'r' ,'R' },
192: {'S' , CAPLOK ,'s' ,'S' },
193: {'T' , CAPLOK ,'t' ,'T' },
194: {'U' , CAPLOK ,'u' ,'U' },
195: {'V' , CAPLOK ,'v' ,'V' },
196: {'W' , CAPLOK ,'w' ,'W' },
197: {'X' , CAPLOK ,'x' ,'X' },
198: {'Y' , CAPLOK ,'y' ,'Y' },
199: {'Z' , CAPLOK ,'z' ,'Z' },
200: {VK_OEM_1 , 0 ,';' ,':' },
201: {VK_OEM_2 , 0 ,'/' ,'?' },
202: {VK_OEM_3 , 0 ,'`' ,'~' },
203: {VK_OEM_7 , 0 ,0x27 ,'"' },
204: {VK_OEM_8 , 0 ,WCH_NONE ,WCH_NONE },
205: {VK_OEM_COMMA , 0 ,',' ,'<' },
206: {VK_OEM_PERIOD, 0 ,'.' ,'>' },
207: {VK_OEM_PLUS , 0 ,'=' ,'+' },
208: {VK_TAB , 0 ,'\t' ,'\t' },
209: {VK_ADD , 0 ,'+' ,'+' },
210: {VK_DECIMAL , 0 ,'.' ,'.' },
211: {VK_DIVIDE , 0 ,'/' ,'/' },
212: {VK_MULTIPLY , 0 ,'*' ,'*' },
213: {VK_SUBTRACT , 0 ,'-' ,'-' },
214: {0 , 0 ,0 ,0 }
215: };
216:
217: static VK_TO_WCHARS3 aVkToWch3[] = {
218: // | | SHIFT | CONTROL |
219: // | |==========|===========|
220: {VK_BACK , 0 ,'\b' ,'\b' , 0x7f },
221: {VK_CANCEL , 0 ,0x03 ,0x03 , 0x03 },
222: {VK_ESCAPE , 0 ,0x1b ,0x1b , 0x1b },
223: {VK_OEM_4 , 0 ,'[' ,'{' , 0x1b },
224: {VK_OEM_5 , 0 ,'\\' ,'|' , 0x1c },
225: {VK_OEM_102 , 0 ,'\\' ,'|' , 0x1c },
226: {VK_OEM_6 , 0 ,']' ,'}' , 0x1d },
227: {VK_RETURN , 0 ,'\r' ,'\r' , '\n' },
228: {VK_SPACE , 0 ,' ' ,' ' , 0x20 },
229: {0 , 0 ,0 ,0 , 0 }
230: };
231:
232: static VK_TO_WCHARS4 aVkToWch4[] = {
233: // | | SHIFT | CONTROL | SHFT+CTRL |
234: // | |==========|===========|===========|
235: {'2' , 0 ,'2' ,'@' , WCH_NONE , 0x00 },
236: {'6' , 0 ,'6' ,'^' , WCH_NONE , 0x1e },
237: {VK_OEM_MINUS , 0 ,'-' ,'_' , WCH_NONE , 0x1f },
238: {0 , 0 ,0 ,0 , 0 , 0 }
239: };
240:
241: // Put this last so that VkKeyScan interprets number characters
242: // as coming from the main section of the kbd (aVkToWch2 and
243: // aVkToWch4) before considering the numpad (aVkToWch1).
244:
245: static VK_TO_WCHARS1 aVkToWch1[] = {
246: { VK_NUMPAD0 , 0 , '0' },
247: { VK_NUMPAD1 , 0 , '1' },
248: { VK_NUMPAD2 , 0 , '2' },
249: { VK_NUMPAD3 , 0 , '3' },
250: { VK_NUMPAD4 , 0 , '4' },
251: { VK_NUMPAD5 , 0 , '5' },
252: { VK_NUMPAD6 , 0 , '6' },
253: { VK_NUMPAD7 , 0 , '7' },
254: { VK_NUMPAD8 , 0 , '8' },
255: { VK_NUMPAD9 , 0 , '9' },
256: { 0 , 0 , '\0' } //null terminator
257: };
258:
259: /***************************************************************************\
260: * aVkToWcharTable: table of pointers to Character Tables
261: *
262: * Describes the character tables and the order they should be searched.
263: *
264: * Note: the order determines the behavior of VkKeyScan() : this function
265: * takes a character and attempts to find a Virtual Key and character-
266: * modifier key combination that produces that character. The table
267: * containing the numeric keypad (aVkToWch1) must appear last so that
268: * VkKeyScan('0') will be interpreted as one of keys from the main
269: * section, not the numpad. etc.
270: \***************************************************************************/
271:
272: static VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
273: { (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) },
274: { (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) },
275: { (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },
276: { (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) }, // must come last
277: { NULL, 0, 0 }
278: };
279:
280: /***************************************************************************\
281: * aKeyNames[], aKeyNamesExt[] - Scan Code -> Key Name tables
282: *
283: * For the GetKeyNameText() API function
284: *
285: * Tables for non-extended and extended (KBDEXT) keys.
286: * (Keys producing printable characters are named by the character itself)
287: \***************************************************************************/
288:
289: static VSC_LPWSTR aKeyNames[] = {
290: 0x01, L"Esc",
291: 0x0e, L"Backspace",
292: 0x0f, L"Tab",
293: 0x1c, L"Enter",
294: 0x1d, L"Ctrl",
295: 0x2a, L"Shift",
296: 0x36, L"Right Shift",
297: 0x37, L"Num *",
298: 0x38, L"Alt",
299: 0x39, L"Space",
300: 0x3a, L"Caps Lock",
301: 0x3b, L"F1",
302: 0x3c, L"F2",
303: 0x3d, L"F3",
304: 0x3e, L"F4",
305: 0x3f, L"F5",
306: 0x40, L"F6",
307: 0x41, L"F7",
308: 0x42, L"F8",
309: 0x43, L"F9",
310: 0x44, L"F10",
311: 0x45, L"Pause",
312: 0x46, L"Scroll Lock",
313: 0x47, L"Num 7",
314: 0x48, L"Num 8",
315: 0x49, L"Num 9",
316: 0x4a, L"Num -",
317: 0x4b, L"Num 4",
318: 0x4c, L"Num 5",
319: 0x4d, L"Num 6",
320: 0x4e, L"Num +",
321: 0x4f, L"Num 1",
322: 0x50, L"Num 2",
323: 0x51, L"Num 3",
324: 0x52, L"Num 0",
325: 0x53, L"Num Del",
326: 0x54, L"Sys Req",
327: 0x57, L"F11",
328: 0x58, L"F12",
329: 0x7C, L"F13",
330: 0x7D, L"F14",
331: 0x7E, L"F15",
332: 0x7F, L"F16",
333: 0x80, L"F17",
334: 0x81, L"F18",
335: 0x82, L"F19",
336: 0x83, L"F20",
337: 0x84, L"F21",
338: 0x85, L"F22",
339: 0x86, L"F23",
340: 0x87, L"F24",
341: 0 , NULL
342: };
343:
344: static VSC_LPWSTR aKeyNamesExt[] = {
345: 0x1c, L"Num Enter",
346: 0x1d, L"Right Control",
347: 0x35, L"Num /",
348: 0x37, L"Prnt Scrn",
349: 0x38, L"Right Alt",
350: 0x45, L"Num Lock",
351: 0x46, L"Break",
352: 0x47, L"Home",
353: 0x48, L"Up",
354: 0x49, L"Page Up",
355: 0x4b, L"Left",
356: 0x4d, L"Right",
357: 0x4f, L"End",
358: 0x50, L"Down",
359: 0x51, L"Page Down",
360: 0x52, L"Insert",
361: 0x53, L"Delete",
362: 0x54, L"<00>",
363: 0x56, L"Help",
364: 0x5C, L"Clear",
365: 0 , NULL
366: };
367:
368: static KBDTABLES KbdTables = {
369: /*
370: * Modifier keys
371: */
372: &CharModifiers,
373:
374: /*
375: * Characters tables
376: */
377: aVkToWcharTable,
378:
379: /*
380: * Diacritics (none for US English)
381: */
382: NULL,
383:
384: /*
385: * Names of Keys (no dead keys)
386: */
387: aKeyNames,
388: aKeyNamesExt,
389: NULL,
390:
391: /*
392: * Scan codes to Virtual Keys
393: */
394: ausVK,
395: sizeof(ausVK) / sizeof(ausVK[0]),
396: aE0VscToVk,
397: aE1VscToVk,
398:
399: /*
400: * No Locale-specific special processing
401: */
402: 0
403: };
404:
405: PKBDTABLES KbdLayerDescriptor(VOID)
406: {
407: return &KbdTables;
408: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.