source: trunk/src/user32/winkeyboard.cpp@ 6157

Last change on this file since 6157 was 6157, checked in by sandervl, 24 years ago

More ToAscii fixes

File size: 34.5 KB
Line 
1/* $Id: winkeyboard.cpp,v 1.11 2001-07-03 20:36:54 sandervl Exp $ */
2/*
3 * Win32 <-> PM key translation
4 *
5 *
6 * Project Odin Software License can be found in LICENSE.TXT
7 *
8 */
9#include <os2win.h>
10#include <odin.h>
11#include <string.h>
12#include <stdio.h>
13#include <winkeyboard.h>
14#include "oslibwin.h"
15#include <heapstring.h>
16#include <pmscan.h>
17
18#define DBG_LOCALLOG DBG_winkeyboard
19#include "dbglocal.h"
20
21BOOL OPEN32API _O32_GetKeyboardState( PBYTE lpKeyState );
22
23inline BOOL O32_GetKeyboardState(PBYTE lpKeyState)
24{
25 BOOL yyrc;
26 USHORT sel = RestoreOS2FS();
27
28 yyrc = _O32_GetKeyboardState(lpKeyState);
29 SetFS(sel);
30
31 return yyrc;
32}
33
34
35BYTE abPMScanToWinVKey[256] =
36/****************************************************************************/
37/* PM Scancode * Win32 vkey */
38/****************************************************************************/
39/* 0x00 */ { 0x00
40/* 0x01 PMSCAN_ESC */ , VK_ESCAPE
41/* 0x02 PMSCAN_ONE */ , VK_1
42/* 0x03 PMSCAN_TWO */ , VK_2
43/* 0x04 PMSCAN_THREE */ , VK_3
44/* 0x05 PMSCAN_FOUR */ , VK_4
45/* 0x06 PMSCAN_FIVE */ , VK_5
46/* 0x07 PMSCAN_SIX */ , VK_6
47/* 0x08 PMSCAN_SEVEN */ , VK_7
48/* 0x09 PMSCAN_EIGHT */ , VK_8
49/* 0x0A PMSCAN_NINE */ , VK_9
50/* 0x0B PMSCAN_ZERO */ , VK_0
51/* 0x0C PMSCAN_HYPHEN */ , VK_HYPHEN
52/* 0x0D PMSCAN_EQUAL */ , VK_EQUAL
53/* 0x0E PMSCAN_BACKSPACE */ , VK_BACK
54/* 0x0F PMSCAN_TAB */ , VK_TAB
55/* 0x10 PMSCAN_Q */ , VK_Q
56/* 0x11 PMSCAN_W */ , VK_W
57/* 0x12 PMSCAN_E */ , VK_E
58/* 0x13 PMSCAN_R */ , VK_R
59/* 0x14 PMSCAN_T */ , VK_T
60/* 0x15 PMSCAN_Y */ , VK_Y
61/* 0x16 PMSCAN_U */ , VK_U
62/* 0x17 PMSCAN_I */ , VK_I
63/* 0x18 PMSCAN_O */ , VK_O
64/* 0x19 PMSCAN_P */ , VK_P
65/* 0x1A PMSCAN_BRACKETLEFT */ , VK_BRACKETLEFT
66/* 0x1B PMSCAN_BRACKETRIGHT */ , VK_BRACKETRIGHT
67/* 0x1C PMSCAN_ENTER */ , VK_RETURN
68/* 0x1D PMSCAN_CTRLLEFT */ , VK_LCONTROL
69/* 0x1E PMSCAN_A */ , VK_A
70/* 0x1F PMSCAN_S */ , VK_S
71/* 0x20 PMSCAN_D */ , VK_D
72/* 0x21 PMSCAN_F */ , VK_F
73/* 0x22 PMSCAN_G */ , VK_G
74/* 0x23 PMSCAN_H */ , VK_H
75/* 0x24 PMSCAN_J */ , VK_J
76/* 0x25 PMSCAN_K */ , VK_K
77/* 0x26 PMSCAN_L */ , VK_L
78/* 0x27 PMSCAN_SEMICOLON */ , VK_SEMICOLON
79/* 0x28 PMSCAN_QUOTESINGLE */ , VK_QUOTESINGLE
80/* 0x29 PMSCAN_GRAVE */ , VK_GRAVE
81/* 0x2A PMSCAN_SHIFTLEFT */ , VK_LSHIFT
82/* 0x2B PMSCAN_BACKSLASH */ , VK_BACKSLASH
83/* 0x2C PMSCAN_Z */ , VK_Z
84/* 0x2D PMSCAN_X */ , VK_X
85/* 0x2E PMSCAN_C */ , VK_C
86/* 0x2F PMSCAN_V */ , VK_V
87/* 0x30 PMSCAN_B */ , VK_B
88/* 0x31 PMSCAN_N */ , VK_N
89/* 0x32 PMSCAN_M */ , VK_M
90/* 0x33 PMSCAN_COMMA */ , VK_COMMA
91/* 0x34 PMSCAN_PERIOD */ , VK_PERIOD
92/* 0x35 PMSCAN_SLASH */ , VK_SLASH
93/* 0x36 PMSCAN_SHIFTRIGHT */ , VK_RSHIFT
94/* 0x37 PMSCAN_PADASTERISK */ , VK_MULTIPLY
95/* 0x38 PMSCAN_ALTLEFT */ , VK_LMENU
96/* 0x39 PMSCAN_SPACE */ , VK_SPACE
97/* 0x3A PMSCAN_CAPSLOCK */ , VK_CAPITAL
98/* 0x3B PMSCAN_F1 */ , VK_F1
99/* 0x3C PMSCAN_F2 */ , VK_F2
100/* 0x3D PMSCAN_F3 */ , VK_F3
101/* 0x3E PMSCAN_F4 */ , VK_F4
102/* 0x3F PMSCAN_F5 */ , VK_F5
103/* 0x40 PMSCAN_F6 */ , VK_F6
104/* 0x41 PMSCAN_F7 */ , VK_F7
105/* 0x42 PMSCAN_F8 */ , VK_F8
106/* 0x43 PMSCAN_F9 */ , VK_F9
107/* 0x44 PMSCAN_F10 */ , VK_F10
108/* 0x45 PMSCAN_NUMLOCK */ , VK_NUMLOCK
109/* 0x46 PMSCAN_SCROLLLOCK */ , VK_SCROLL
110/* 0x47 PMSCAN_PAD7 */ , VK_NUMPAD7
111/* 0x48 PMSCAN_PAD8 */ , VK_NUMPAD8
112/* 0x49 PMSCAN_PAD9 */ , VK_NUMPAD9
113/* 0x4A PMSCAN_PADMINUS */ , VK_SUBTRACT
114/* 0x4B PMSCAN_PAD4 */ , VK_NUMPAD4
115/* 0x4C PMSCAN_PAD5 */ , VK_NUMPAD5
116/* 0x4D PMSCAN_PAD6 */ , VK_NUMPAD6
117/* 0x4E PMSCAN_PADPLUS */ , VK_ADD
118/* 0x4F PMSCAN_PAD1 */ , VK_NUMPAD1
119/* 0x50 PMSCAN_PAD2 */ , VK_NUMPAD2
120/* 0x51 PMSCAN_PAD3 */ , VK_NUMPAD3
121/* 0x52 PMSCAN_PAD0 */ , VK_NUMPAD0
122/* 0x53 PMSCAN_PADPERIOD */ , VK_DECIMAL
123/* 0x54 PMSCAN_SYSREQ */ , 0x00
124/* 0x55 PMSCAN_RESET */ , 0x00
125/* 0x56 PMSCAN_EXTRA */ , VK_EXTRA
126/* 0x57 PMSCAN_F11 */ , VK_F11
127/* 0x58 PMSCAN_F12 */ , VK_F12
128/* 0x59 PMSCAN_BACKTAB */ , 0x00
129/* 0x5A PMSCAN_PADENTER */ , VK_RETURN
130/* 0x5B PMSCAN_CTRLRIGHT */ , VK_CONTROL
131/* 0x5C PMSCAN_PADSLASH */ , VK_DIVIDE
132/* 0x5D PMSCAN_PRINT */ , VK_PRINT
133/* 0x5E PMSCAN_ALTRIGHT */ , VK_RMENU
134/* 0x5F PMSCAN_PAUSE */ , VK_PAUSE
135/* 0x60 PMSCAN_HOME */ , VK_HOME
136/* 0x61 PMSCAN_UP */ , VK_UP
137/* 0x62 PMSCAN_PAGEUP */ , VK_PRIOR
138/* 0x63 PMSCAN_LEFT */ , VK_LEFT
139/* 0x64 PMSCAN_RIGHT */ , VK_RIGHT
140/* 0x65 PMSCAN_END */ , VK_END
141/* 0x66 PMSCAN_DOWN */ , VK_DOWN
142/* 0x67 PMSCAN_PAGEDOWN */ , VK_NEXT
143/* 0x68 PMSCAN_INSERT */ , VK_INSERT
144/* 0x69 PMSCAN_DELETE */ , VK_DELETE
145/* 0x6A PMSCAN_F23 */ , VK_F23
146/* 0x6B PMSCAN_F24 */ , VK_F24
147/* 0x6C PMSCAN_SYSMEM */ , 0x00
148/* 0x6D PMSCAN_ERASEEOF */ , VK_EREOF
149/* 0x6E PMSCAN_BREAK */ , VK_CANCEL
150/* 0x6F PMSCAN_MOVEWIN */ , 0x00
151/* 0x70 PMSCAN_NLS3 */ , 0x00
152/* 0x71 PMSCAN_HELP */ , VK_HELP
153/* 0x72 PMSCAN_TASKMAN */ , 0x00
154/* 0x73 PMSCAN_B11 */ , 0x00
155/* 0x74 PMSCAN_JUMP */ , 0x00
156/* 0x75 PMSCAN_MINWIN */ , 0x00
157/* 0x76 PMSCAN_CLEAR */ , 0x00
158/* 0x77 PMSCAN_77 */ , 0x00
159/* 0x78 PMSCAN_78 */ , 0x00
160/* 0x79 PMSCAN_NLS2 */ , 0x00
161/* 0x7a PMSCAN_SIZE */ , 0x00
162/* 0x7b PMSCAN_NLS1 */ , 0x00
163/* 0x7c PMSCAN_APPLICATION */ , VK_APPS
164/* 0x7d PMSCAN_E13 */ , 0x00
165/* 0x7e PMSCAN */ , 0x00
166/* 0x7f PMSCAN */ , 0x00
167/* 0x80 PMSCAN_PA1 */ , VK_PA1
168/* 0x81 PMSCAN_F13 */ , VK_F13
169/* 0x82 PMSCAN_F14 */ , VK_F14
170/* 0x83 PMSCAN_F15 */ , VK_F15
171/* 0x84 PMSCAN_PA2 */ , 0x00
172/* 0x85 PMSCAN_PA3 */ , 0x00
173/* 0x86 PMSCAN_SPACEBREAK */ , 0x00
174/* 0x87 PMSCAN_TABRIGHT */ , 0x00
175/* 0x88 PMSCAN_NOOP */ , 0x00
176/* 0x89 PMSCAN_F16 */ , VK_F16
177/* 0x8a PMSCAN_F17 */ , VK_F17
178/* 0x8b PMSCAN_F18 */ , VK_F18
179/* 0x8c PMSCAN_F19 */ , VK_F19
180/* 0x8d PMSCAN_F20 */ , VK_F20
181/* 0x8e PMSCAN_F21 */ , VK_F21
182/* 0x8f PMSCAN_F22 */ , VK_F22
183/* 0x90 */ , 0x00
184/* 0x91 */ , 0x00
185/* 0x92 */ , 0x00
186/* 0x93 */ , 0x00
187/* 0x94 */ , 0x00
188/* 0x95 */ , 0x00
189/* 0x96 */ , 0x00
190/* 0x97 */ , 0x00
191/* 0x98 */ , 0x00
192/* 0x99 */ , 0x00
193/* 0x9A */ , 0x00
194/* 0x9B */ , 0x00
195/* 0x9C */ , 0x00
196/* 0x9D */ , 0x00
197/* 0x9E */ , 0x00
198/* 0x9F */ , 0x00
199/* 0xA0 */ , 0x00
200/* 0xA1 */ , 0x00
201/* 0xA2 */ , 0x00
202/* 0xA3 */ , 0x00
203/* 0xA4 */ , 0x00
204/* 0xA5 */ , 0x00
205/* 0xA6 */ , 0x00
206/* 0xA7 */ , 0x00
207/* 0xA8 */ , 0x00
208/* 0xA9 */ , 0x00
209/* 0xAA */ , 0x00
210/* 0xAB */ , 0x00
211/* 0xAC */ , 0x00
212/* 0xAD */ , 0x00
213/* 0xAE */ , 0x00
214/* 0xAF */ , 0x00
215/* 0xB0 */ , 0x00
216/* 0xB1 */ , 0x00
217/* 0xB2 */ , 0x00
218/* 0xB3 */ , 0x00
219/* 0xB4 */ , 0x00
220/* 0xB5 */ , 0x00
221/* 0xB6 */ , 0x00
222/* 0xB7 */ , 0x00
223/* 0xB8 */ , 0x00
224/* 0xB9 */ , 0x00
225/* 0xBA */ , 0x00
226/* 0xBB */ , 0x00
227/* 0xBC */ , 0x00
228/* 0xBD */ , 0x00
229/* 0xBE */ , 0x00
230/* 0xBF */ , 0x00
231/* 0xC0 */ , 0x00
232/* 0xC1 */ , 0x00
233/* 0xC2 */ , 0x00
234/* 0xC3 */ , 0x00
235/* 0xC4 */ , 0x00
236/* 0xC5 */ , 0x00
237/* 0xC6 */ , 0x00
238/* 0xC7 */ , 0x00
239/* 0xC8 */ , 0x00
240/* 0xC9 */ , 0x00
241/* 0xCA */ , 0x00
242/* 0xCB */ , 0x00
243/* 0xCC */ , 0x00
244/* 0xCD */ , 0x00
245/* 0xCE */ , 0x00
246/* 0xCF */ , 0x00
247/* 0xD0 */ , 0x00
248/* 0xD1 */ , 0x00
249/* 0xD2 */ , 0x00
250/* 0xD3 */ , 0x00
251/* 0xD4 */ , 0x00
252/* 0xD5 */ , 0x00
253/* 0xD6 */ , 0x00
254/* 0xD7 */ , 0x00
255/* 0xD8 */ , 0x00
256/* 0xD9 */ , 0x00
257/* 0xDA */ , 0x00
258/* 0xDB */ , 0x00
259/* 0xDC */ , 0x00
260/* 0xDD */ , 0x00
261/* 0xDE */ , 0x00
262/* 0xDF */ , 0x00
263/* 0xE0 */ , 0x00
264/* 0xE1 */ , 0x00
265/* 0xE2 */ , 0x00
266/* 0xE3 */ , 0x00
267/* 0xE4 */ , 0x00
268/* 0xE5 */ , 0x00
269/* 0xE6 */ , 0x00
270/* 0xE7 */ , 0x00
271/* 0xE8 */ , 0x00
272/* 0xE9 */ , 0x00
273/* 0xEA */ , 0x00
274/* 0xEB */ , 0x00
275/* 0xEC */ , 0x00
276/* 0xED */ , 0x00
277/* 0xEE */ , 0x00
278/* 0xEF */ , 0x00
279/* 0xF0 */ , 0x00
280/* 0xF1 */ , 0x00
281/* 0xF2 */ , 0x00
282/* 0xF3 */ , 0x00
283/* 0xF4 */ , 0x00
284/* 0xF5 */ , 0x00
285/* 0xF6 */ , 0x00
286/* 0xF7 */ , 0x00
287/* 0xF8 */ , 0x00
288/* 0xF9 */ , 0x00
289/* 0xFA */ , 0x00
290/* 0xFB */ , 0x00
291/* 0xFC */ , 0x00
292/* 0xFD */ , 0x00
293/* 0xFE */ , 0x00
294/* 0xFF */ , 0x00
295 };
296
297BYTE abWinVKeyToPMScan[256] =
298/****************************************/
299/* Vkey * Scancode */
300/****************************************/
301/* 0x00 */ { 0x00
302/* 0x01 VK_LBUTTON */ , 0x00
303/* 0x02 VK_RBUTTON */ , 0x00
304/* 0x03 VK_CANCEL */ , PMSCAN_BREAK
305/* 0x04 VK_MBUTTON */ , 0x00
306/* 0x05 */ , 0x00
307/* 0x06 */ , 0x00
308/* 0x07 */ , 0x00
309/* 0x08 VK_BACK */ , PMSCAN_BACKSPACE
310/* 0x09 VK_TAB */ , PMSCAN_TAB
311/* 0x0A */ , 0x00
312/* 0x0B */ , 0x00
313/* 0x0C VK_CLEAR */ , PMSCAN_PAD5
314/* 0x0D VK_RETURN */ , PMSCAN_ENTER
315/* 0x0E */ , 0x00
316/* 0x0F */ , 0x00
317/* 0x10 VK_SHIFT */ , PMSCAN_SHIFTLEFT
318/* 0x11 VK_CONTROL */ , PMSCAN_CTRLLEFT
319/* 0x12 VK_MENU */ , PMSCAN_ALTLEFT
320/* 0x13 VK_PAUSE */ , PMSCAN_PAUSE
321/* 0x14 VK_CAPITAL */ , PMSCAN_CAPSLOCK
322/* 0x15 */ , 0x00
323/* 0x16 */ , 0x00
324/* 0x17 */ , 0x00
325/* 0x18 */ , 0x00
326/* 0x19 */ , 0x00
327/* 0x1A */ , 0x00
328/* 0x1B VK_ESCAPE */ , PMSCAN_ESC
329/* 0x1C */ , 0x00
330/* 0x1D */ , 0x00
331/* 0x1E */ , 0x00
332/* 0x1F */ , 0x00
333/* 0x20 VK_SPACE */ , PMSCAN_SPACE
334/* 0x21 VK_PRIOR */ , PMSCAN_PAGEUP
335/* 0x22 VK_NEXT */ , PMSCAN_PAGEDOWN
336/* 0x23 VK_END */ , PMSCAN_END
337/* 0x24 VK_HOME */ , PMSCAN_HOME
338/* 0x25 VK_LEFT */ , PMSCAN_LEFT
339/* 0x26 VK_UP */ , PMSCAN_UP
340/* 0x27 VK_RIGHT */ , PMSCAN_RIGHT
341/* 0x28 VK_DOWN */ , PMSCAN_DOWN
342/* 0x29 VK_SELECT */ , 0x00
343/* 0x2A VK_PRINT */ , PMSCAN_PRINT
344/* 0x2B VK_EXECUTE */ , 0x00
345/* 0x2C VK_SNAPSHOT */ , 0x00
346/* 0x2D VK_INSERT */ , PMSCAN_INSERT
347/* 0x2E VK_DELETE */ , PMSCAN_DELETE
348/* 0x2F VK_HELP */ , PMSCAN_HELP
349/* 0x30 VK_0 */ , PMSCAN_ZERO
350/* 0x31 VK_1 */ , PMSCAN_ONE
351/* 0x32 VK_2 */ , PMSCAN_TWO
352/* 0x33 VK_3 */ , PMSCAN_THREE
353/* 0x34 VK_4 */ , PMSCAN_FOUR
354/* 0x35 VK_5 */ , PMSCAN_FIVE
355/* 0x36 VK_6 */ , PMSCAN_SIX
356/* 0x37 VK_7 */ , PMSCAN_SEVEN
357/* 0x38 VK_8 */ , PMSCAN_EIGHT
358/* 0x39 VK_9 */ , PMSCAN_NINE
359/* 0x3A */ , 0x00
360/* 0x3B */ , 0x00
361/* 0x3C */ , 0x00
362/* 0x3D */ , 0x00
363/* 0x3E */ , 0x00
364/* 0x3F */ , 0x00
365/* 0x40 */ , 0x00
366/* 0x41 VK_A */ , PMSCAN_A
367/* 0x42 VK_B */ , PMSCAN_B
368/* 0x43 VK_C */ , PMSCAN_C
369/* 0x44 VK_D */ , PMSCAN_D
370/* 0x45 VK_E */ , PMSCAN_E
371/* 0x46 VK_F */ , PMSCAN_F
372/* 0x47 VK_G */ , PMSCAN_G
373/* 0x48 VK_H */ , PMSCAN_H
374/* 0x49 VK_I */ , PMSCAN_I
375/* 0x4A VK_J */ , PMSCAN_J
376/* 0x4B VK_K */ , PMSCAN_K
377/* 0x4C VK_L */ , PMSCAN_L
378/* 0x4D VK_M */ , PMSCAN_M
379/* 0x4E VK_N */ , PMSCAN_N
380/* 0x4F VK_O */ , PMSCAN_O
381/* 0x50 VK_P */ , PMSCAN_P
382/* 0x51 VK_Q */ , PMSCAN_Q
383/* 0x52 VK_R */ , PMSCAN_R
384/* 0x53 VK_S */ , PMSCAN_S
385/* 0x54 VK_T */ , PMSCAN_T
386/* 0x55 VK_U */ , PMSCAN_U
387/* 0x56 VK_V */ , PMSCAN_V
388/* 0x57 VK */ , PMSCAN_W
389/* 0x58 VK_X */ , PMSCAN_X
390/* 0x59 VK_Y */ , PMSCAN_Y
391/* 0x5A VK_Z */ , PMSCAN_Z
392/* 0x5B VK_LWIN */ , PMSCAN_WINLEFT
393/* 0x5C VK_RWIN */ , PMSCAN_WINRIGHT
394/* 0x5D VK_APPS */ , PMSCAN_APPLICATION
395/* 0x5E */ , 0x00
396/* 0x5F */ , 0x00
397/* 0x60 VK_NUMPAD0 */ , PMSCAN_PAD0
398/* 0x61 VK_NUMPAD1 */ , PMSCAN_PAD1
399/* 0x62 VK_NUMPAD2 */ , PMSCAN_PAD2
400/* 0x63 VK_NUMPAD3 */ , PMSCAN_PAD3
401/* 0x64 VK_NUMPAD4 */ , PMSCAN_PAD4
402/* 0x65 VK_NUMPAD5 */ , PMSCAN_PAD5
403/* 0x66 VK_NUMPAD6 */ , PMSCAN_PAD6
404/* 0x67 VK_NUMPAD7 */ , PMSCAN_PAD7
405/* 0x68 VK_NUMPAD8 */ , PMSCAN_PAD8
406/* 0x69 VK_NUMPAD9 */ , PMSCAN_PAD9
407/* 0x6A VK_MULTIPLY */ , PMSCAN_PADASTERISK
408/* 0x6B VK_ADD */ , PMSCAN_PADPLUS
409/* 0x6C VK_SEPARATOR */ , 0x00
410/* 0x6D VK_SUBTRACT */ , PMSCAN_PADMINUS
411/* 0x6E VK_DECIMAL */ , PMSCAN_PADPERIOD
412/* 0x6F VK_DIVIDE */ , PMSCAN_PADSLASH
413/* 0x70 VK_F1 */ , PMSCAN_F1
414/* 0x71 VK_F2 */ , PMSCAN_F2
415/* 0x72 VK_F3 */ , PMSCAN_F3
416/* 0x73 VK_F4 */ , PMSCAN_F4
417/* 0x74 VK_F5 */ , PMSCAN_F5
418/* 0x75 VK_F6 */ , PMSCAN_F6
419/* 0x76 VK_F7 */ , PMSCAN_F7
420/* 0x77 VK_F8 */ , PMSCAN_F8
421/* 0x78 VK_F9 */ , PMSCAN_F9
422/* 0x79 VK_F10 */ , PMSCAN_F10
423/* 0x7A VK_F11 */ , PMSCAN_F11
424/* 0x7B VK_F12 */ , PMSCAN_F12
425/* 0x7C VK_F13 */ , PMSCAN_F13
426/* 0x7D VK_F14 */ , PMSCAN_F14
427/* 0x7E VK_F15 */ , PMSCAN_F15
428/* 0x7F VK_F16 */ , PMSCAN_F16
429/* 0x80 VK_F17 */ , PMSCAN_F17
430/* 0x81 VK_F18 */ , PMSCAN_F18
431/* 0x82 VK_F19 */ , PMSCAN_F19
432/* 0x83 VK_F20 */ , PMSCAN_F20
433/* 0x84 VK_F21 */ , PMSCAN_F21
434/* 0x85 VK_F22 */ , PMSCAN_F22
435/* 0x86 VK_F23 */ , PMSCAN_F23
436/* 0x87 VK_F24 */ , PMSCAN_F24
437/* 0x88 */ , 0x00
438/* 0x89 */ , 0x00
439/* 0x8A */ , 0x00
440/* 0x8B */ , 0x00
441/* 0x8C */ , 0x00
442/* 0x8D */ , 0x00
443/* 0x8E */ , 0x00
444/* 0x8F */ , 0x00
445/* 0x90 VK_NUMLOCK */ , PMSCAN_NUMLOCK
446/* 0x91 VK_SCROLL */ , PMSCAN_SCROLLLOCK
447/* 0x92 */ , 0x00
448/* 0x93 */ , 0x00
449/* 0x94 */ , 0x00
450/* 0x95 */ , 0x00
451/* 0x96 */ , 0x00
452/* 0x97 */ , 0x00
453/* 0x98 */ , 0x00
454/* 0x99 */ , 0x00
455/* 0x9A */ , 0x00
456/* 0x9B */ , 0x00
457/* 0x9C */ , 0x00
458/* 0x9D */ , 0x00
459/* 0x9E */ , 0x00
460/* 0x9F */ , 0x00
461/* 0xA0 VK_LSHIFT */ , PMSCAN_SHIFTLEFT
462/* 0xA1 VK_RSHIFT */ , PMSCAN_SHIFTRIGHT
463/* 0xA2 VK_LCONTROL */ , PMSCAN_CTRLLEFT
464/* 0xA3 VK_RCONTROL */ , PMSCAN_CTRLRIGHT
465/* 0xA4 VK_LMENU */ , PMSCAN_ALTLEFT
466/* 0xA5 VK_RMENU */ , PMSCAN_ALTRIGHT
467/* 0xA6 */ , 0x00
468/* 0xA7 */ , 0x00
469/* 0xA8 */ , 0x00
470/* 0xA9 */ , 0x00
471/* 0xAA */ , 0x00
472/* 0xAB */ , 0x00
473/* 0xAC */ , 0x00
474/* 0xAD */ , 0x00
475/* 0xAE */ , 0x00
476/* 0xAF */ , 0x00
477/* 0xB0 */ , 0x00
478/* 0xB1 */ , 0x00
479/* 0xB2 */ , 0x00
480/* 0xB3 */ , 0x00
481/* 0xB4 */ , 0x00
482/* 0xB5 */ , 0x00
483/* 0xB6 */ , 0x00
484/* 0xB7 */ , 0x00
485/* 0xB8 */ , 0x00
486/* 0xB9 */ , 0x00
487/* 0xBA VK_SEMICOLON */ , PMSCAN_SEMICOLON
488/* 0xBB VK_EQUAL */ , PMSCAN_EQUAL
489/* 0xBC VK_COMMA */ , PMSCAN_COMMA
490/* 0xBD VK_HYPHEN */ , PMSCAN_HYPHEN
491/* 0xBE VK_PERIOD */ , PMSCAN_PERIOD
492/* 0xBF VK_SLASH */ , PMSCAN_SLASH
493/* 0xC0 VK_GRAVE */ , PMSCAN_GRAVE
494/* 0xC1 VK_FFC1 */ , PMSCAN_JEXTRA
495/* 0xC2 VK_YEN */ , PMSCAN_YEN
496/* 0xC3 */ , 0x00
497/* 0xC4 */ , 0x00
498/* 0xC5 */ , 0x00
499/* 0xC6 */ , 0x00
500/* 0xC7 */ , 0x00
501/* 0xC8 */ , 0x00
502/* 0xC9 */ , 0x00
503/* 0xCA */ , 0x00
504/* 0xCB */ , 0x00
505/* 0xCC */ , 0x00
506/* 0xCD */ , 0x00
507/* 0xCE */ , 0x00
508/* 0xCF */ , 0x00
509/* 0xD0 */ , 0x00
510/* 0xD1 */ , 0x00
511/* 0xD2 */ , 0x00
512/* 0xD3 */ , 0x00
513/* 0xD4 */ , 0x00
514/* 0xD5 */ , 0x00
515/* 0xD6 */ , 0x00
516/* 0xD7 */ , 0x00
517/* 0xD8 */ , 0x00
518/* 0xD9 */ , 0x00
519/* 0xDA */ , 0x00
520/* 0xDB VK_BRACKETLEFT */ , PMSCAN_BRACKETLEFT
521/* 0xDC VK_BACKSLASH */ , PMSCAN_BACKSLASH
522/* 0xDD VK_BRACKETRIGHT */ , PMSCAN_BRACKETRIGHT
523/* 0xDE VK_QUOTESINGLE */ , PMSCAN_QUOTESINGLE
524/* 0xDF */ , 0x00
525/* 0xE0 */ , 0x00
526/* 0xE1 */ , 0x00
527/* 0xE2 VK_EXTRA */ , PMSCAN_EXTRA
528/* 0xE3 */ , 0x00
529/* 0xE4 */ , 0x00
530/* 0xE5 */ , 0x00
531/* 0xE6 */ , 0x00
532/* 0xE7 */ , 0x00
533/* 0xE8 */ , 0x00
534/* 0xE9 */ , 0x00
535/* 0xEA */ , 0x00
536/* 0xEB */ , 0x00
537/* 0xEC */ , 0x00
538/* 0xED */ , 0x00
539/* 0xEE */ , 0x00
540/* 0xEF */ , 0x00
541/* 0xF0 */ , 0x00
542/* 0xF1 */ , 0x00
543/* 0xF2 */ , 0x00
544/* 0xF3 */ , 0x00
545/* 0xF4 */ , 0x00
546/* 0xF5 */ , 0x00
547/* 0xF6 VK_ATTN */ , 0x00
548/* 0xF7 VK_CRSEL */ , 0x00
549/* 0xF8 VK_EXSEL */ , 0x00
550/* 0xF9 VK_EREOF */ , PMSCAN_ERASEEOF
551/* 0xFA VK_PLAY */ , 0x00
552/* 0xFB VK_ZOOM */ , 0x00
553/* 0xFC VK_NONAME */ , 0x00
554/* 0xFD VK_PA1 */ , PMSCAN_PA1
555/* 0xFE VK_OEM_CLEAR */ , 0x00
556/* 0xFF */ , 0x00
557 };
558
559//******************************************************************************
560//******************************************************************************
561void WIN32API KeyTranslatePMToWinBuf(BYTE *pmkey, BYTE *winkey, int nrkeys)
562{
563 for(int i=1;i<nrkeys;i++) {
564 if(abWinVKeyToPMScan[i]) {
565 winkey[i] = pmkey[OSLibWinTranslateChar(abWinVKeyToPMScan[i], TC_SCANCODETOVIRTUALKEY, 0)];
566 }
567 }
568 winkey[VK_SHIFT] = winkey[VK_LSHIFT] | winkey[VK_RSHIFT];
569 winkey[VK_CONTROL] = winkey[VK_LCONTROL] | winkey[VK_RCONTROL];
570 winkey[VK_MENU] = winkey[VK_LMENU] | winkey[VK_RMENU];
571}
572//******************************************************************************
573//******************************************************************************
574int WIN32API GetKeyboardType( int nTypeFlag)
575{
576 dprintf(("USER32: GetKeyboardType %x", nTypeFlag));
577 return O32_GetKeyboardType(nTypeFlag);
578}
579//******************************************************************************
580//******************************************************************************
581BOOL WIN32API GetKeyboardState(PBYTE lpKeyState)
582{
583 BYTE PMKeyState[256];
584 BOOL rc;
585
586 dprintf(("USER32: GetKeyboardState %x", lpKeyState));
587 memset(PMKeyState, 0, sizeof(PMKeyState));
588 memset(lpKeyState, 0, 256);
589 rc = OSLibWinGetKeyboardStateTable((PBYTE)&PMKeyState[0] );
590//// rc = O32_GetKeyboardState(lpKeyState);
591 if(rc == TRUE)
592 {
593 KeyTranslatePMToWinBuf((BYTE *)&PMKeyState[0], lpKeyState, 256);
594#ifdef DEBUG
595 for(int i=0;i<256;i++) {
596 if(PMKeyState[i] & 0x80) {
597 dprintf2(("PM key 0x%0x = %x", i, PMKeyState[i]));
598 }
599 }
600 for(i=0;i<256;i++) {
601 if(lpKeyState[i]) {
602 dprintf2(("Win key 0x%0x = %x", i, lpKeyState[i]));
603 }
604 }
605#endif
606 return TRUE;
607 }
608 return FALSE;
609}
610//******************************************************************************
611//******************************************************************************
612BOOL WIN32API SetKeyboardState(PBYTE lpKeyState)
613{
614 dprintf(("USER32: SetKeyboardState %x not implemented", lpKeyState));
615 return(TRUE);
616}
617/***********************************************************************
618 * GetKeyboardLayout (USER32.250)
619 *
620 * FIXME: - device handle for keyboard layout defaulted to
621 * the language id. This is the way Windows default works.
622 * - the thread identifier (dwLayout) is also ignored.
623 */
624// * Remark : Based on Wine version (991031)
625HKL WIN32API GetKeyboardLayout(DWORD dwLayout)
626{
627 HKL layout;
628 layout = GetSystemDefaultLCID(); /* FIXME */
629 layout |= (layout<<16); /* FIXME */
630 dprintf(("GetKeyboardLayout returning %08x\n",layout));
631 return layout;
632}
633/*****************************************************************************
634 * Name : BOOL WIN32API GetKeyboardLayoutNameA
635 * Purpose : The GetKeyboardLayoutName function retrieves the name of the
636 * active keyboard layout.
637 * Parameters: LPTSTR pwszKLID address of buffer for layout name
638 * Variables :
639 * Result : If the function succeeds, the return value is TRUE.
640 * If the function fails, the return value is FALSE. To get extended
641 * error information, call GetLastError.
642 * Remark : Based on Wine version (991031)
643 * Status : UNTESTED STUB
644 *
645 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
646 *****************************************************************************/
647INT WIN32API GetKeyboardLayoutNameA(LPTSTR pwszKLID)
648{
649 dprintf(("USER32:GetKeyboardLayoutNameA"));
650
651 sprintf(pwszKLID, "%08x",GetKeyboardLayout(0));
652 return 1;
653}
654/*****************************************************************************
655 * Name : BOOL WIN32API GetKeyboardLayoutNameW
656 * Purpose : The GetKeyboardLayoutName function retrieves the name of the
657 * active keyboard layout.
658 * Parameters: LPTSTR pwszKLID address of buffer for layout name
659 * Variables :
660 * Result : If the function succeeds, the return value is TRUE.
661 * If the function fails, the return value is FALSE. To get extended
662 * error information, call GetLastError.
663 * Remark : Based on Wine version (991031)
664 * Status : UNTESTED STUB
665 *
666 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
667 *****************************************************************************/
668INT WIN32API GetKeyboardLayoutNameW(LPWSTR pwszKLID)
669{
670 LPSTR buf = (LPSTR)HEAP_xalloc( GetProcessHeap(), 0, strlen("00000409")+1);
671
672 dprintf(("USER32:GetKeyboardLayoutNameA"));
673 int res = GetKeyboardLayoutNameA(buf);
674 lstrcpyAtoW(pwszKLID,buf);
675 HeapFree( GetProcessHeap(), 0, buf );
676 return res;
677}
678/***********************************************************************
679 * GetKeyboardLayoutList (USER32.251)
680 *
681 * FIXME: Supports only the system default language and layout and
682 * returns only 1 value.
683 *
684 * Return number of values available if either input parm is
685 * 0, per MS documentation.
686 *
687 * Remark : Based on Wine version (991031)
688 */
689INT WINAPI GetKeyboardLayoutList(INT nBuff,HKL *layouts)
690{
691 dprintf(("GetKeyboardLayoutList(%d,%p)\n",nBuff,layouts));
692 if (!nBuff || !layouts)
693 return 1;
694 if (layouts)
695 layouts[0] = GetKeyboardLayout(0);
696 return 1;
697}
698/*****************************************************************************
699 * Name : int WIN32API ToAscii
700 * Purpose : The ToAscii function translates the specified virtual-key code
701 * and keyboard state to the corresponding Windows character or characters.
702 * Parameters: UINT uVirtKey virtual-key code
703 * UINT uScanCode scan code
704 * PBYTE lpbKeyState address of key-state array
705 * LPWORD lpwTransKey buffer for translated key
706 * UINT fuState active-menu flag
707 * Variables :
708 * Result : 0 The specified virtual key has no translation for the current
709 * state of the keyboard.
710 * 1 One Windows character was copied to the buffer.
711 * 2 Two characters were copied to the buffer. This usually happens
712 * when a dead-key character (accent or diacritic) stored in the
713 * keyboard layout cannot be composed with the specified virtual
714 * key to form a single character.
715 * Remark :
716 * Status : UNTESTED STUB
717 *
718 * Author : SvL
719 *****************************************************************************/
720int WIN32API ToAscii(UINT uVirtKey,
721 UINT uScanCode,
722 PBYTE lpbKeyState,
723 LPWORD lpwTransKey,
724 UINT fuState)
725{
726 dprintf(("USER32:ToAscii (%x,%x,%08xh,%08xh,%x) partially implemented",
727 uVirtKey, uScanCode, lpbKeyState, lpwTransKey, fuState));
728
729 INT ret;
730
731 if (uScanCode == 0) {
732 /* This happens when doing Alt+letter : a fake 'down arrow' key press
733 event is generated by windows. Just ignore it. */
734 dprintf2(("scanCode=0, doing nothing"));
735 return 0;
736 }
737 if (uScanCode & 0x8000)
738 {
739 dprintf2(("Key UP, doing nothing"));
740 return 0;
741 }
742
743 /* We have another special case for delete key (XK_Delete) on an
744 extended keyboard. X returns a char for it, but Windows doesn't */
745 if (uVirtKey == VK_DELETE)
746 {
747 *(char*)lpwTransKey = 0;
748 ret = 0;
749 }
750 else
751 if (uVirtKey == VK_ESCAPE) {
752 //NT returns VK_ESCAPE here
753 *(char*)lpwTransKey = VK_ESCAPE;
754 ret = 1;
755 }
756 else {
757 ULONG shiftstate = 0;
758
759 //TODO: multiple characters returned (DBCS??)
760
761 if(lpbKeyState[VK_LSHIFT] & 0x80) shiftstate |= TCF_LSHIFT;
762 if(lpbKeyState[VK_RSHIFT] & 0x80) shiftstate |= TCF_RSHIFT;
763 if(lpbKeyState[VK_SHIFT] & 0x80) shiftstate |= TCF_SHIFT;
764 if(lpbKeyState[VK_LCONTROL] & 0x80) shiftstate |= TCF_LCONTROL;
765 if(lpbKeyState[VK_RCONTROL] & 0x80) shiftstate |= TCF_RCONTROL;
766 if(lpbKeyState[VK_CONTROL] & 0x80) shiftstate |= TCF_CONTROL;
767 if(lpbKeyState[VK_LMENU] & 0x80) shiftstate |= TCF_ALT;
768 if(lpbKeyState[VK_RMENU] & 0x80) shiftstate |= TCF_ALTGR;
769 if(lpbKeyState[VK_MENU] & 0x80) shiftstate |= TCF_ALT;
770 if(lpbKeyState[VK_CAPITAL] & 1) shiftstate |= TCF_CAPSLOCK;
771 if(lpbKeyState[VK_NUMLOCK] & 1) shiftstate |= TCF_NUMLOCK;
772
773 //NT only modifies the bytes it returns
774 *(char *)lpwTransKey = OSLibWinTranslateChar(uScanCode, TC_SCANCODETOCHAR, shiftstate);
775
776 if(shiftstate & TCF_CONTROL) {
777 if(uVirtKey >= VK_A && uVirtKey <= VK_Z) {
778 //NT returns key-0x60 (or so it seems) for ctrl-(shift-)-a..z
779 if(shiftstate & TCF_SHIFT) {
780 *(char *)lpwTransKey -= 0x40;
781 }
782 else *(char *)lpwTransKey -= 0x60;
783 }
784 else
785 if(uVirtKey == VK_SPACE) {
786 if(shiftstate & TCF_SHIFT) {
787 //NT returns 0 for ctrl-shift-space
788 *lpwTransKey = 0;
789 }
790 }
791 else {
792 //NT returns 0 for ctrl-0, ctrl-.
793 *lpwTransKey = 0;
794 }
795 }
796
797 if(*(char *)lpwTransKey == 0) {
798 ret = 0;
799 }
800 else ret = 1;
801 }
802 dprintf2(("USER32:ToAscii returned %x, len %d", *lpwTransKey, ret));
803 return ret;
804}
805/*****************************************************************************
806 * Name : int WIN32API ToAsciiEx
807 * Purpose : The ToAscii function translates the specified virtual-key code
808 * and keyboard state to the corresponding Windows character or characters.
809 * Parameters: UINT uVirtKey virtual-key code
810 * UINT uScanCode scan code
811 * PBYTE lpbKeyState address of key-state array
812 * LPWORD lpwTransKey buffer for translated key
813 * UINT fuState active-menu flag
814 * HLK hlk keyboard layout handle
815 * Variables :
816 * Result : 0 The specified virtual key has no translation for the current
817 * state of the keyboard.
818 * 1 One Windows character was copied to the buffer.
819 * 2 Two characters were copied to the buffer. This usually happens
820 * when a dead-key character (accent or diacritic) stored in the
821 * keyboard layout cannot be composed with the specified virtual
822 * key to form a single character.
823 * Remark :
824 * Status : UNTESTED STUB
825 *
826 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
827 *****************************************************************************/
828int WIN32API ToAsciiEx(UINT uVirtKey,
829 UINT uScanCode,
830 PBYTE lpbKeyState,
831 LPWORD lpwTransKey,
832 UINT fuState,
833 HKL hkl)
834{
835 dprintf(("USER32:ToAsciiEx (%u,%u,%08xh,%08xh,%u,%08x) not implemented.\n",
836 uVirtKey,
837 uScanCode,
838 lpbKeyState,
839 lpwTransKey,
840 fuState,
841 hkl));
842
843 return (0);
844}
845/*****************************************************************************
846 * Name : int WIN32API ToUnicode
847 * Purpose : The ToUnicode function translates the specified virtual-key code
848 * and keyboard state to the corresponding Unicode character or characters.
849 * Parameters: UINT wVirtKey virtual-key code
850 * UINT wScanCode scan code
851 * PBYTE lpKeyState address of key-state array
852 * LPWSTR pwszBuff buffer for translated key
853 * int cchBuff size of translated key buffer
854 * UINT wFlags set of function-conditioning flags
855 * Variables :
856 * Result : - 1 The specified virtual key is a dead-key character (accent or
857 * diacritic). This value is returned regardless of the keyboard
858 * layout, even if several characters have been typed and are
859 * stored in the keyboard state. If possible, even with Unicode
860 * keyboard layouts, the function has written a spacing version of
861 * the dead-key character to the buffer specified by pwszBuffer.
862 * For example, the function writes the character SPACING ACUTE
863 * (0x00B4), rather than the character NON_SPACING ACUTE (0x0301).
864 * 0 The specified virtual key has no translation for the current
865 * state of the keyboard. Nothing was written to the buffer
866 * specified by pwszBuffer.
867 * 1 One character was written to the buffer specified by pwszBuffer.
868 * 2 or more Two or more characters were written to the buffer specified by
869 * pwszBuff. The most common cause for this is that a dead-key
870 * character (accent or diacritic) stored in the keyboard layout
871 * could not be combined with the specified virtual key to form a
872 * single character.
873 * Remark :
874 * Status : UNTESTED STUB
875 *
876 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
877 *****************************************************************************/
878int WIN32API ToUnicode(UINT uVirtKey,
879 UINT uScanCode,
880 PBYTE lpKeyState,
881 LPWSTR pwszBuff,
882 int cchBuff,
883 UINT wFlags)
884{
885 dprintf(("USER32:ToUnicode (%u,%u,%08xh,%08xh,%u,%08x) not implemented.\n",
886 uVirtKey,
887 uScanCode,
888 lpKeyState,
889 pwszBuff,
890 cchBuff,
891 wFlags));
892
893 return (0);
894}
895//******************************************************************************
896//******************************************************************************
Note: See TracBrowser for help on using the repository browser.