SHOW:
|
|
- or go back to the newest paste.
1 | /***************************************************************************\ | |
2 | * Module Name: kbduk.C | |
3 | * | |
4 | * keyboard layout | |
5 | * | |
6 | * Copyright (c) 1985-2001, Microsoft Corporation | |
7 | * | |
8 | \***************************************************************************/ | |
9 | ||
10 | #include <windows.h> | |
11 | #include "kbd.h" | |
12 | - | #include "kbd109.h" |
12 | + | #include "kbduk.h" |
13 | ||
14 | #if defined(_M_IA64) | |
15 | #pragma section(".data") | |
16 | #define ALLOC_SECTION_LDATA __declspec(allocate(".data")) | |
17 | #else | |
18 | #pragma data_seg(".data") | |
19 | #define ALLOC_SECTION_LDATA | |
20 | #endif | |
21 | ||
22 | /***************************************************************************\ | |
23 | * ausVK[] - Virtual Scan Code to Virtual Key conversion table | |
24 | \***************************************************************************/ | |
25 | ||
26 | static ALLOC_SECTION_LDATA USHORT ausVK[] = { | |
27 | T00, T01, T02, T03, T04, T05, T06, T07, | |
28 | T08, T09, T0A, T0B, T0C, T0D, T0E, T0F, | |
29 | T10, T11, T12, T13, T14, T15, T16, T17, | |
30 | T18, T19, T1A, T1B, T1C, T1D, T1E, T1F, | |
31 | T20, T21, T22, T23, T24, T25, T26, T27, | |
32 | T28, T29, T2A, T2B, T2C, T2D, T2E, T2F, | |
33 | T30, T31, T32, T33, T34, T35, | |
34 | ||
35 | /* | |
36 | * Right-hand Shift key must have KBDEXT bit set. | |
37 | */ | |
38 | T36 | KBDEXT, | |
39 | ||
40 | T37 | KBDMULTIVK, // numpad_* + Shift/Alt -> SnapShot | |
41 | ||
42 | T38, T39, T3A, T3B, T3C, T3D, T3E, | |
43 | T3F, T40, T41, T42, T43, T44, | |
44 | ||
45 | /* | |
46 | * NumLock Key: | |
47 | * KBDEXT - VK_NUMLOCK is an Extended key | |
48 | * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL) | |
49 | */ | |
50 | T45 | KBDEXT | KBDMULTIVK, | |
51 | ||
52 | T46 | KBDMULTIVK, | |
53 | ||
54 | /* | |
55 | * Number Pad keys: | |
56 | * KBDNUMPAD - digits 0-9 and decimal point. | |
57 | * KBDSPECIAL - require special processing by Windows | |
58 | */ | |
59 | T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home) | |
60 | T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up), | |
61 | T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp), | |
62 | T4A, | |
63 | T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left), | |
64 | T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear), | |
65 | T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right), | |
66 | T4E, | |
67 | T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End), | |
68 | T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down), | |
69 | T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn), | |
70 | T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins), | |
71 | T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del), | |
72 | ||
73 | T54, T55, T56, T57, T58, T59, T5A, T5B, | |
74 | T5C, T5D, T5E, T5F, T60, T61, T62, T63, | |
75 | T64, T65, T66, T67, T68, T69, T6A, T6B, | |
76 | T6C, T6D, T6E, T6F, T70, T71, T72, T73, | |
77 | T74, T75, T76, T77, T78, T79, T7A, T7B, | |
78 | T7C, T7D, T7E | |
79 | ||
80 | }; | |
81 | ||
82 | static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = { | |
83 | { 0x10, X10 | KBDEXT }, // Speedracer: Previous Track | |
84 | { 0x19, X19 | KBDEXT }, // Speedracer: Next Track | |
85 | { 0x1D, X1D | KBDEXT }, // RControl | |
86 | { 0x20, X20 | KBDEXT }, // Speedracer: Volume Mute | |
87 | { 0x21, X21 | KBDEXT }, // Speedracer: Launch App 2 | |
88 | { 0x22, X22 | KBDEXT }, // Speedracer: Media Play/Pause | |
89 | { 0x24, X24 | KBDEXT }, // Speedracer: Media Stop | |
90 | { 0x2E, X2E | KBDEXT }, // Speedracer: Volume Down | |
91 | { 0x30, X30 | KBDEXT }, // Speedracer: Volume Up | |
92 | { 0x32, X32 | KBDEXT }, // Speedracer: Browser Home | |
93 | { 0x35, X35 | KBDEXT }, // Numpad Divide | |
94 | { 0x37, X37 | KBDEXT }, // Snapshot | |
95 | { 0x38, X38 | KBDEXT }, // RMenu | |
96 | { 0x47, X47 | KBDEXT }, // Home | |
97 | { 0x48, X48 | KBDEXT }, // Up | |
98 | { 0x49, X49 | KBDEXT }, // Prior | |
99 | { 0x4B, X4B | KBDEXT }, // Left | |
100 | { 0x4D, X4D | KBDEXT }, // Right | |
101 | { 0x4F, X4F | KBDEXT }, // End | |
102 | { 0x50, X50 | KBDEXT }, // Down | |
103 | { 0x51, X51 | KBDEXT }, // Next | |
104 | { 0x52, X52 | KBDEXT }, // Insert | |
105 | { 0x53, X53 | KBDEXT }, // Delete | |
106 | { 0x5B, X5B | KBDEXT }, // Left Win | |
107 | { 0x5C, X5C | KBDEXT }, // Right Win | |
108 | { 0x5D, X5D | KBDEXT }, // Application | |
109 | { 0x5F, X5F | KBDEXT }, // Speedracer: Sleep | |
110 | { 0x65, X65 | KBDEXT }, // Speedracer: Browser Search | |
111 | { 0x66, X66 | KBDEXT }, // Speedracer: Browser Favorites | |
112 | { 0x67, X67 | KBDEXT }, // Speedracer: Browser Refresh | |
113 | { 0x68, X68 | KBDEXT }, // Speedracer: Browser Stop | |
114 | { 0x69, X69 | KBDEXT }, // Speedracer: Browser Forward | |
115 | { 0x6A, X6A | KBDEXT }, // Speedracer: Browser Back | |
116 | { 0x6B, X6B | KBDEXT }, // Speedracer: Launch App 1 | |
117 | { 0x6C, X6C | KBDEXT }, // Speedracer: Launch Mail | |
118 | { 0x6D, X6D | KBDEXT }, // Speedracer: Launch Media Selector | |
119 | { 0x1C, X1C | KBDEXT }, // Numpad Enter | |
120 | { 0x46, X46 | KBDEXT }, // Break (Ctrl + Pause) | |
121 | { 0, 0 } | |
122 | }; | |
123 | ||
124 | static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = { | |
125 | { 0x1D, Y1D }, // Pause | |
126 | { 0 , 0 } | |
127 | }; | |
128 | ||
129 | /***************************************************************************\ | |
130 | * aVkToBits[] - map Virtual Keys to Modifier Bits | |
131 | * | |
132 | * See kbd.h for a full description. | |
133 | * | |
134 | * The keyboard has only three shifter keys: | |
135 | * SHIFT (L & R) affects alphabnumeric keys, | |
136 | * CTRL (L & R) is used to generate control characters | |
137 | * ALT (L & R) used for generating characters by number with numpad | |
138 | \***************************************************************************/ | |
139 | static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = { | |
140 | { VK_SHIFT , KBDSHIFT }, | |
141 | { VK_CONTROL , KBDCTRL }, | |
142 | { VK_MENU , KBDALT }, | |
143 | { 0 , 0 } | |
144 | }; | |
145 | ||
146 | /***************************************************************************\ | |
147 | * aModification[] - map character modifier bits to modification number | |
148 | * | |
149 | * See kbd.h for a full description. | |
150 | * | |
151 | \***************************************************************************/ | |
152 | ||
153 | static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = { | |
154 | &aVkToBits[0], | |
155 | 7, | |
156 | { | |
157 | // Modification# // Keys Pressed | |
158 | // ============= // ============= | |
159 | 0, // | |
160 | 1, // Shift | |
161 | 2, // Control | |
162 | SHFT_INVALID, // Shift + Control | |
163 | SHFT_INVALID, // Menu | |
164 | SHFT_INVALID, // Shift + Menu | |
165 | 3, // Control + Menu | |
166 | 4 // Shift + Control + Menu | |
167 | } | |
168 | }; | |
169 | ||
170 | /***************************************************************************\ | |
171 | * | |
172 | * aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states | |
173 | * aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states | |
174 | * aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states | |
175 | * aVkToWch5[] - Virtual Key to WCHAR translation for 5 shift states | |
176 | * aVkToWch6[] - Virtual Key to WCHAR translation for 6 shift states | |
177 | * | |
178 | * Table attributes: Unordered Scan, null-terminated | |
179 | * | |
180 | * Search this table for an entry with a matching Virtual Key to find the | |
181 | * corresponding unshifted and shifted WCHAR characters. | |
182 | * | |
183 | * Special values for VirtualKey (column 1) | |
184 | * 0xff - dead chars for the previous entry | |
185 | * 0 - terminate the list | |
186 | * | |
187 | * Special values for Attributes (column 2) | |
188 | * CAPLOK bit - CAPS-LOCK affect this key like SHIFT | |
189 | * | |
190 | * Special values for wch[*] (column 3 & 4) | |
191 | * WCH_NONE - No character | |
192 | * WCH_DEAD - Dead Key (diaresis) or invalid (US keyboard has none) | |
193 | * WCH_LGTR - Ligature (generates multiple characters) | |
194 | * | |
195 | \***************************************************************************/ | |
196 | ||
197 | static ALLOC_SECTION_LDATA VK_TO_WCHARS2 aVkToWch2[] = { | |
198 | // | | Shift | | |
199 | // |=========|=========| | |
200 | {VK_TAB ,0 ,'\t' ,'\t' }, | |
201 | {VK_ADD ,0 ,'+' ,'+' }, | |
202 | {VK_DIVIDE ,0 ,'/' ,'/' }, | |
203 | {VK_MULTIPLY ,0 ,'*' ,'*' }, | |
204 | {VK_SUBTRACT ,0 ,'-' ,'-' }, | |
205 | {0 ,0 ,0 ,0 } | |
206 | }; | |
207 | ||
208 | static ALLOC_SECTION_LDATA VK_TO_WCHARS3 aVkToWch3[] = { | |
209 | // | | Shift | Ctrl | | |
210 | // |=========|=========|=========| | |
211 | {VK_BACK ,0 ,'\b' ,'\b' ,0x007f }, | |
212 | {VK_ESCAPE ,0 ,0x001b ,0x001b ,0x001b }, | |
213 | {VK_RETURN ,0 ,'\r' ,'\r' ,'\n' }, | |
214 | {VK_CANCEL ,0 ,0x0003 ,0x0003 ,0x0003 }, | |
215 | {0 ,0 ,0 ,0 ,0 } | |
216 | }; | |
217 | ||
218 | static ALLOC_SECTION_LDATA VK_TO_WCHARS5 aVkToWch5[] = { | |
219 | // | | Shift | Ctrl | Ctl+Alt|S+Ctl+Alt| | |
220 | // |=========|=========|=========|=========|=========| | |
221 | {'1' ,0 ,'1' ,'!' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
222 | {'2' ,0 ,'2' ,'\"' ,WCH_NONE ,WCH_DEAD ,WCH_NONE }, | |
223 | {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,0x00a8 ,WCH_NONE }, | |
224 | {'3' ,0 ,'3' ,0x00a3 ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
225 | {'4' ,0 ,'4' ,'$' ,WCH_NONE ,0x20ac ,WCH_NONE }, | |
226 | {'5' ,0 ,'5' ,'%' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
227 | {'6' ,0 ,'6' ,'^' ,WCH_NONE ,WCH_DEAD ,WCH_NONE }, | |
228 | {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'^' ,WCH_NONE }, | |
229 | {'7' ,0 ,'7' ,'&' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
230 | {'8' ,0 ,'8' ,'*' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
231 | {'9' ,0 ,'9' ,'(' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
232 | {'0' ,0 ,'0' ,')' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
233 | {VK_OEM_MINUS ,0 ,'-' ,'_' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
234 | {VK_OEM_PLUS ,0 ,'=' ,'+' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
235 | {'Q' ,CAPLOK ,'q' ,'Q' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
236 | {'W' ,CAPLOK | CAPLOKALTGR,'w' ,'W' ,WCH_NONE ,0x1e83 ,0x1e82 }, | |
237 | {'E' ,CAPLOK | CAPLOKALTGR,'e' ,'E' ,WCH_NONE ,0x00e9 ,0x00c9 }, | |
238 | {'R' ,CAPLOK ,'r' ,'R' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
239 | {'T' ,CAPLOK ,'t' ,'T' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
240 | {'Y' ,CAPLOK | CAPLOKALTGR,'y' ,'Y' ,WCH_NONE ,0x00fd ,0x00dd }, | |
241 | {'U' ,CAPLOK | CAPLOKALTGR,'u' ,'U' ,WCH_NONE ,0x00fa ,0x00da }, | |
242 | {'I' ,CAPLOK | CAPLOKALTGR,'i' ,'I' ,WCH_NONE ,0x00ed ,0x00cd }, | |
243 | {'O' ,CAPLOK | CAPLOKALTGR,'o' ,'O' ,WCH_NONE ,0x00f3 ,0x00d3 }, | |
244 | {'P' ,CAPLOK ,'p' ,'P' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
245 | {VK_OEM_4 ,0 ,'[' ,'{' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
246 | {VK_OEM_6 ,0 ,']' ,'}' ,WCH_NONE ,WCH_NONE ,'|' }, | |
247 | {'A' ,CAPLOK | CAPLOKALTGR,'a' ,'A' ,WCH_NONE ,0x00e1 ,0x00c1 }, | |
248 | {'S' ,CAPLOK ,'s' ,'S' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
249 | {'D' ,CAPLOK ,'d' ,'D' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
250 | {'F' ,CAPLOK ,'f' ,'F' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
251 | {'G' ,CAPLOK ,'g' ,'G' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
252 | {'H' ,CAPLOK ,'h' ,'H' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
253 | {'J' ,CAPLOK ,'j' ,'J' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
254 | {'K' ,CAPLOK ,'k' ,'K' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
255 | {'L' ,CAPLOK ,'l' ,'L' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
256 | {VK_OEM_1 ,0 ,';' ,':' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
257 | {VK_OEM_3 ,0 ,'\'' ,'@' ,WCH_NONE ,WCH_DEAD ,'`' }, | |
258 | {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,0x00b4 ,WCH_NONE }, | |
259 | {VK_OEM_8 ,0 ,WCH_DEAD ,0x00ac ,WCH_NONE ,0x00a6 ,WCH_NONE }, | |
260 | {0xff ,0 ,'`' ,WCH_NONE ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
261 | {VK_OEM_7 ,0 ,'#' ,'~' ,WCH_NONE ,WCH_DEAD ,'\\' }, | |
262 | {0xff ,0 ,WCH_NONE ,WCH_NONE ,WCH_NONE ,'~' ,WCH_NONE }, | |
263 | {'Z' ,CAPLOK ,'z' ,'Z' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
264 | {'X' ,CAPLOK ,'x' ,'X' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
265 | {'C' ,CAPLOK | CAPLOKALTGR,'c' ,'C' ,WCH_NONE ,0x00e7 ,0x00c7 }, | |
266 | {'V' ,CAPLOK ,'v' ,'V' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
267 | {'B' ,CAPLOK ,'b' ,'B' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
268 | {'N' ,CAPLOK ,'n' ,'N' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
269 | {'M' ,CAPLOK ,'m' ,'M' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
270 | {VK_OEM_COMMA ,0 ,',' ,'<' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
271 | {VK_OEM_PERIOD,0 ,'.' ,'>' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
272 | {VK_OEM_2 ,0 ,'/' ,'?' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
273 | {VK_SPACE ,0 ,' ' ,' ' ,' ' ,WCH_NONE ,WCH_NONE }, | |
274 | {VK_OEM_5 ,0 ,'\\' ,'|' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
275 | {VK_DECIMAL ,0 ,'.' ,'.' ,WCH_NONE ,WCH_NONE ,WCH_NONE }, | |
276 | {0 ,0 ,0 ,0 ,0 ,0 ,0 } | |
277 | }; | |
278 | ||
279 | // Put this last so that VkKeyScan interprets number characters | |
280 | // as coming from the main section of the kbd (aVkToWch2 and | |
281 | // aVkToWch5) before considering the numpad (aVkToWch1). | |
282 | ||
283 | static ALLOC_SECTION_LDATA VK_TO_WCHARS1 aVkToWch1[] = { | |
284 | { VK_NUMPAD0 , 0 , '0' }, | |
285 | { VK_NUMPAD1 , 0 , '1' }, | |
286 | { VK_NUMPAD2 , 0 , '2' }, | |
287 | { VK_NUMPAD3 , 0 , '3' }, | |
288 | { VK_NUMPAD4 , 0 , '4' }, | |
289 | { VK_NUMPAD5 , 0 , '5' }, | |
290 | { VK_NUMPAD6 , 0 , '6' }, | |
291 | { VK_NUMPAD7 , 0 , '7' }, | |
292 | { VK_NUMPAD8 , 0 , '8' }, | |
293 | { VK_NUMPAD9 , 0 , '9' }, | |
294 | { 0 , 0 , '\0' } | |
295 | }; | |
296 | ||
297 | static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = { | |
298 | { (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) }, | |
299 | { (PVK_TO_WCHARS1)aVkToWch5, 5, sizeof(aVkToWch5[0]) }, | |
300 | { (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) }, | |
301 | { (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) }, | |
302 | { NULL, 0, 0 }, | |
303 | }; | |
304 | ||
305 | /***************************************************************************\ | |
306 | * aKeyNames[], aKeyNamesExt[] - Virtual Scancode to Key Name tables | |
307 | * | |
308 | * Table attributes: Ordered Scan (by scancode), null-terminated | |
309 | * | |
310 | * Only the names of Extended, NumPad, Dead and Non-Printable keys are here. | |
311 | * (Keys producing printable characters are named by that character) | |
312 | \***************************************************************************/ | |
313 | ||
314 | static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = { | |
315 | 0x01, L"Esc", | |
316 | 0x0e, L"Backspace", | |
317 | 0x0f, L"Tab", | |
318 | 0x1c, L"Enter", | |
319 | 0x1d, L"Ctrl", | |
320 | 0x2a, L"Shift", | |
321 | 0x36, L"Right Shift", | |
322 | 0x37, L"Num *", | |
323 | 0x38, L"Alt", | |
324 | 0x39, L"Space", | |
325 | 0x3a, L"Caps Lock", | |
326 | 0x3b, L"F1", | |
327 | 0x3c, L"F2", | |
328 | 0x3d, L"F3", | |
329 | 0x3e, L"F4", | |
330 | 0x3f, L"F5", | |
331 | 0x40, L"F6", | |
332 | 0x41, L"F7", | |
333 | 0x42, L"F8", | |
334 | 0x43, L"F9", | |
335 | 0x44, L"F10", | |
336 | 0x45, L"Pause", | |
337 | 0x46, L"Scroll Lock", | |
338 | 0x47, L"Num 7", | |
339 | 0x48, L"Num 8", | |
340 | 0x49, L"Num 9", | |
341 | 0x4a, L"Num -", | |
342 | 0x4b, L"Num 4", | |
343 | 0x4c, L"Num 5", | |
344 | 0x4d, L"Num 6", | |
345 | 0x4e, L"Num +", | |
346 | 0x4f, L"Num 1", | |
347 | 0x50, L"Num 2", | |
348 | 0x51, L"Num 3", | |
349 | 0x52, L"Num 0", | |
350 | 0x53, L"Num Del", | |
351 | 0x54, L"Sys Req", | |
352 | 0x57, L"F11", | |
353 | 0x58, L"F12", | |
354 | 0x7c, L"F13", | |
355 | 0x7d, L"F14", | |
356 | 0x7e, L"F15", | |
357 | 0x7f, L"F16", | |
358 | 0x80, L"F17", | |
359 | 0x81, L"F18", | |
360 | 0x82, L"F19", | |
361 | 0x83, L"F20", | |
362 | 0x84, L"F21", | |
363 | 0x85, L"F22", | |
364 | 0x86, L"F23", | |
365 | 0x87, L"F24", | |
366 | 0 , NULL | |
367 | }; | |
368 | ||
369 | static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = { | |
370 | 0x1c, L"Num Enter", | |
371 | 0x1d, L"Right Ctrl", | |
372 | 0x35, L"Num /", | |
373 | 0x37, L"Prnt Scrn", | |
374 | 0x38, L"Right Alt", | |
375 | 0x45, L"Num Lock", | |
376 | 0x46, L"Break", | |
377 | 0x47, L"Home", | |
378 | 0x48, L"Up", | |
379 | 0x49, L"Page Up", | |
380 | 0x4b, L"Left", | |
381 | 0x4d, L"Right", | |
382 | 0x4f, L"End", | |
383 | 0x50, L"Down", | |
384 | 0x51, L"Page Down", | |
385 | 0x52, L"Insert", | |
386 | 0x53, L"Delete", | |
387 | 0x54, L"<00>", | |
388 | 0x56, L"Help", | |
389 | 0x5b, L"Left Windows", | |
390 | 0x5c, L"Right Windows", | |
391 | 0x5d, L"Application", | |
392 | 0 , NULL | |
393 | }; | |
394 | ||
395 | static ALLOC_SECTION_LDATA DEADKEY_LPWSTR aKeyNamesDead[] = { | |
396 | L"\x00a8" L"DIAERESIS", | |
397 | L"^" L"CIRCUMFLEX ACCENT", | |
398 | L"\x00b4" L"ACUTE ACCENT", | |
399 | L"`" L"GRAVE ACCENT", | |
400 | L"~" L"TILDE", | |
401 | NULL | |
402 | }; | |
403 | ||
404 | static ALLOC_SECTION_LDATA DEADKEY aDeadKey[] = { | |
405 | DEADTRANS( L'a' , 0x00a8 , 0x00e4 , 0x0000), | |
406 | DEADTRANS( L'w' , 0x00a8 , 0x1e85 , 0x0000), | |
407 | DEADTRANS( L'e' , 0x00a8 , 0x00eb , 0x0000), | |
408 | DEADTRANS( L'u' , 0x00a8 , 0x00fc , 0x0000), | |
409 | DEADTRANS( L'i' , 0x00a8 , 0x00ef , 0x0000), | |
410 | DEADTRANS( L'y' , 0x00a8 , 0x00ff , 0x0000), | |
411 | DEADTRANS( L'o' , 0x00a8 , 0x00f6 , 0x0000), | |
412 | DEADTRANS( L'A' , 0x00a8 , 0x00c4 , 0x0000), | |
413 | DEADTRANS( L'W' , 0x00a8 , 0x1e84 , 0x0000), | |
414 | DEADTRANS( L'E' , 0x00a8 , 0x00cb , 0x0000), | |
415 | DEADTRANS( L'U' , 0x00a8 , 0x00dc , 0x0000), | |
416 | DEADTRANS( L'I' , 0x00a8 , 0x00cf , 0x0000), | |
417 | DEADTRANS( L'Y' , 0x00a8 , 0x0178 , 0x0000), | |
418 | DEADTRANS( L'O' , 0x00a8 , 0x00d6 , 0x0000), | |
419 | DEADTRANS( L' ' , 0x00a8 , 0x00a8 , 0x0000), | |
420 | ||
421 | DEADTRANS( L'a' , L'^' , 0x00e2 , 0x0000), | |
422 | DEADTRANS( L'w' , L'^' , 0x0175 , 0x0000), | |
423 | DEADTRANS( L'e' , L'^' , 0x00ea , 0x0000), | |
424 | DEADTRANS( L'u' , L'^' , 0x00fb , 0x0000), | |
425 | DEADTRANS( L'i' , L'^' , 0x00ee , 0x0000), | |
426 | DEADTRANS( L'y' , L'^' , 0x0177 , 0x0000), | |
427 | DEADTRANS( L'o' , L'^' , 0x00f4 , 0x0000), | |
428 | DEADTRANS( L'A' , L'^' , 0x00c2 , 0x0000), | |
429 | DEADTRANS( L'W' , L'^' , 0x0174 , 0x0000), | |
430 | DEADTRANS( L'E' , L'^' , 0x00ca , 0x0000), | |
431 | DEADTRANS( L'U' , L'^' , 0x00db , 0x0000), | |
432 | DEADTRANS( L'I' , L'^' , 0x00ce , 0x0000), | |
433 | DEADTRANS( L'Y' , L'^' , 0x0176 , 0x0000), | |
434 | DEADTRANS( L'O' , L'^' , 0x00d4 , 0x0000), | |
435 | DEADTRANS( L' ' , L'^' , L'^' , 0x0000), | |
436 | ||
437 | DEADTRANS( L'a' , 0x00b4 , 0x00e1 , 0x0000), | |
438 | DEADTRANS( L'w' , 0x00b4 , 0x1e83 , 0x0000), | |
439 | DEADTRANS( L'e' , 0x00b4 , 0x00e9 , 0x0000), | |
440 | DEADTRANS( L'u' , 0x00b4 , 0x00fa , 0x0000), | |
441 | DEADTRANS( L'i' , 0x00b4 , 0x00ed , 0x0000), | |
442 | DEADTRANS( L'y' , 0x00b4 , 0x00fd , 0x0000), | |
443 | DEADTRANS( L'o' , 0x00b4 , 0x00f3 , 0x0000), | |
444 | DEADTRANS( L'A' , 0x00b4 , 0x00c1 , 0x0000), | |
445 | DEADTRANS( L'W' , 0x00b4 , 0x1e82 , 0x0000), | |
446 | DEADTRANS( L'E' , 0x00b4 , 0x00c9 , 0x0000), | |
447 | DEADTRANS( L'U' , 0x00b4 , 0x00da , 0x0000), | |
448 | DEADTRANS( L'I' , 0x00b4 , 0x00cd , 0x0000), | |
449 | DEADTRANS( L'Y' , 0x00b4 , 0x00dd , 0x0000), | |
450 | DEADTRANS( L'O' , 0x00b4 , 0x00d3 , 0x0000), | |
451 | DEADTRANS( L' ' , 0x00b4 , 0x00b4 , 0x0000), | |
452 | ||
453 | DEADTRANS( L'a' , L'`' , 0x00e0 , 0x0000), | |
454 | DEADTRANS( L'w' , L'`' , 0x1e81 , 0x0000), | |
455 | DEADTRANS( L'e' , L'`' , 0x00e8 , 0x0000), | |
456 | DEADTRANS( L'u' , L'`' , 0x00f9 , 0x0000), | |
457 | DEADTRANS( L'i' , L'`' , 0x00ec , 0x0000), | |
458 | DEADTRANS( L'y' , L'`' , 0x1ef3 , 0x0000), | |
459 | DEADTRANS( L'o' , L'`' , 0x00f2 , 0x0000), | |
460 | DEADTRANS( L'A' , L'`' , 0x00c0 , 0x0000), | |
461 | DEADTRANS( L'W' , L'`' , 0x1e80 , 0x0000), | |
462 | DEADTRANS( L'E' , L'`' , 0x00c8 , 0x0000), | |
463 | DEADTRANS( L'U' , L'`' , 0x00d9 , 0x0000), | |
464 | DEADTRANS( L'I' , L'`' , 0x00cc , 0x0000), | |
465 | DEADTRANS( L'Y' , L'`' , 0x1ef2 , 0x0000), | |
466 | DEADTRANS( L'O' , L'`' , 0x00d2 , 0x0000), | |
467 | DEADTRANS( L' ' , L'`' , L'`' , 0x0000), | |
468 | ||
469 | DEADTRANS( L'n' , L'~' , 0x00f1 , 0x0000), | |
470 | DEADTRANS( L'a' , L'~' , 0x00e3 , 0x0000), | |
471 | DEADTRANS( L'o' , L'~' , 0x00f5 , 0x0000), | |
472 | DEADTRANS( L'N' , L'~' , 0x00d1 , 0x0000), | |
473 | DEADTRANS( L'A' , L'~' , 0x00c3 , 0x0000), | |
474 | DEADTRANS( L'O' , L'~' , 0x00d5 , 0x0000), | |
475 | DEADTRANS( L' ' , L'~' , L'~' , 0x0000), | |
476 | ||
477 | 0, 0 | |
478 | }; | |
479 | ||
480 | static ALLOC_SECTION_LDATA KBDTABLES KbdTables = { | |
481 | /* | |
482 | * Modifier keys | |
483 | */ | |
484 | &CharModifiers, | |
485 | ||
486 | /* | |
487 | * Characters tables | |
488 | */ | |
489 | aVkToWcharTable, | |
490 | ||
491 | /* | |
492 | * Diacritics | |
493 | */ | |
494 | aDeadKey, | |
495 | ||
496 | /* | |
497 | * Names of Keys | |
498 | */ | |
499 | aKeyNames, | |
500 | aKeyNamesExt, | |
501 | aKeyNamesDead, | |
502 | ||
503 | /* | |
504 | * Scan codes to Virtual Keys | |
505 | */ | |
506 | ausVK, | |
507 | sizeof(ausVK) / sizeof(ausVK[0]), | |
508 | aE0VscToVk, | |
509 | aE1VscToVk, | |
510 | ||
511 | /* | |
512 | * Locale-specific special processing | |
513 | */ | |
514 | MAKELONG(KLLF_ALTGR, KBD_VERSION), | |
515 | ||
516 | /* | |
517 | * Ligatures | |
518 | */ | |
519 | 0, | |
520 | 0, | |
521 | NULL | |
522 | }; | |
523 | ||
524 | PKBDTABLES KbdLayerDescriptor(VOID) | |
525 | { | |
526 | return &KbdTables; | |
527 | } | |
528 | ||
529 | ||
530 | ||
531 | ||
532 | ||
533 | ||
534 | ||
535 | ||
536 | ||
537 | ||
538 | ||
539 | ||
540 | /****************************** Module Header ******************************\ | |
541 | * Module Name: kbduk.H | |
542 | * | |
543 | * keyboard layout header | |
544 | * | |
545 | * Copyright (c) 1985-2001, Microsoft Corporation | |
546 | * | |
547 | * Various defines for use by keyboard input code. | |
548 | * | |
549 | \***************************************************************************/ | |
550 | ||
551 | /* | |
552 | * kbd type should be controlled by cl command-line argument | |
553 | */ | |
554 | #define KBD_TYPE 4 | |
555 | ||
556 | /* | |
557 | * Include the basis of all keyboard table values | |
558 | */ | |
559 | #include "kbd.h" | |
560 | /***************************************************************************\ | |
561 | * The table below defines the virtual keys for various keyboard types where | |
562 | * the keyboard differ from the US keyboard. | |
563 | * | |
564 | * _EQ() : all keyboard types have the same virtual key for this scancode | |
565 | * _NE() : different virtual keys for this scancode, depending on kbd type | |
566 | * | |
567 | * +------+ +----------+----------+----------+----------+----------+----------+ | |
568 | * | Scan | | kbd | kbd | kbd | kbd | kbd | kbd | | |
569 | * | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 | | |
570 | \****+-------+_+----------+----------+----------+----------+----------+----------+*/ | |
571 | ||
572 | #undef T28 | |
573 | #define T28 _EQ( OEM_3 ) | |
574 | #undef T29 | |
575 | #define T29 _EQ( OEM_8 ) | |
576 | #undef T2B | |
577 | #define T2B _EQ( OEM_7 ) | |
578 | #undef T56 | |
579 | #define T56 _EQ( OEM_5 ) | |
580 | ||
581 | ||
582 | ||
583 | ||
584 | ||
585 | ||
586 | ||
587 | ||
588 | ||
589 | LIBRARY kbduk | |
590 | ||
591 | EXPORTS | |
592 | KbdLayerDescriptor @1 | |
593 | ||
594 | ||
595 | ||
596 | ||
597 | ||
598 | ||
599 | ||
600 | ||
601 | ||
602 | ||
603 | ||
604 | ||
605 | #include "winver.h" | |
606 | 1 VERSIONINFO | |
607 | FILEVERSION 1,0,3,40 | |
608 | PRODUCTVERSION 1,0,3,40 | |
609 | FILEFLAGSMASK 0x3fL | |
610 | FILEFLAGS 0x0L | |
611 | FILEOS 0x40004L | |
612 | FILETYPE VFT_DLL | |
613 | FILESUBTYPE VFT2_DRV_KEYBOARD | |
614 | BEGIN | |
615 | BLOCK "StringFileInfo" | |
616 | BEGIN | |
617 | BLOCK "000004B0" | |
618 | BEGIN | |
619 | VALUE "CompanyName", "Microsoft Corporation\0" | |
620 | VALUE "FileDescription", "United Kingdom Keyboard Layout Keyboard Layout\0" | |
621 | VALUE "FileVersion", "1, 0, 3, 40\0" | |
622 | VALUE "InternalName", "kbduk (3.13)\0" | |
623 | VALUE "ProductName","Microsoft® Windows® Operating System\0" | |
624 | VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved.\0" | |
625 | VALUE "OriginalFilename","kbduk\0" | |
626 | VALUE "ProductVersion", "1, 0, 3, 40\0" | |
627 | END | |
628 | END | |
629 | BLOCK "VarFileInfo" | |
630 | BEGIN | |
631 | VALUE "Translation", 0x0000, 0x04B0 | |
632 | END | |
633 | END | |
634 | ||
635 | STRINGTABLE DISCARDABLE | |
636 | LANGUAGE 9, 1 | |
637 | BEGIN | |
638 | 1200 "en-GB" | |
639 | END | |
640 | ||
641 | ||
642 | STRINGTABLE DISCARDABLE | |
643 | LANGUAGE 9, 1 | |
644 | BEGIN | |
645 | 1000 "United Kingdom Keyboard Layout" | |
646 | END | |
647 | ||
648 | ||
649 | STRINGTABLE DISCARDABLE | |
650 | LANGUAGE 9, 1 | |
651 | BEGIN | |
652 | 1100 "English (United Kingdom)" | |
653 | END |