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

Last change on this file since 2469 was 2469, checked in by sandervl, 26 years ago

* empty log message *

File size: 15.0 KB
Line 
1/* $Id: winkeyboard.cpp,v 1.4 2000-01-18 20:11:16 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
17BYTE abPMScanToWinVKey[256] =
18/****************************************************************************/
19/* PM Scancode * Win32 vkey */
20/****************************************************************************/
21/* 0x00 */ { 0x00
22/* 0x01 PMSCAN_ESC */ , VK_ESCAPE
23/* 0x02 PMSCAN_ONE */ , VK_1
24/* 0x03 PMSCAN_TWO */ , VK_2
25/* 0x04 PMSCAN_THREE */ , VK_3
26/* 0x05 PMSCAN_FOUR */ , VK_4
27/* 0x06 PMSCAN_FIVE */ , VK_5
28/* 0x07 PMSCAN_SIX */ , VK_6
29/* 0x08 PMSCAN_SEVEN */ , VK_7
30/* 0x09 PMSCAN_EIGHT */ , VK_8
31/* 0x0A PMSCAN_NINE */ , VK_9
32/* 0x0B PMSCAN_ZERO */ , VK_0
33/* 0x0C PMSCAN_HYPHEN */ , VK_HYPHEN
34/* 0x0D PMSCAN_EQUAL */ , VK_EQUAL
35/* 0x0E PMSCAN_BACKSPACE */ , VK_BACK
36/* 0x0F PMSCAN_TAB */ , VK_TAB
37/* 0x10 PMSCAN_Q */ , VK_Q
38/* 0x11 PMSCAN_W */ , VK_W
39/* 0x12 PMSCAN_E */ , VK_E
40/* 0x13 PMSCAN_R */ , VK_R
41/* 0x14 PMSCAN_T */ , VK_T
42/* 0x15 PMSCAN_Y */ , VK_Y
43/* 0x16 PMSCAN_U */ , VK_U
44/* 0x17 PMSCAN_I */ , VK_I
45/* 0x18 PMSCAN_O */ , VK_O
46/* 0x19 PMSCAN_P */ , VK_P
47/* 0x1A PMSCAN_BRACKETLEFT */ , VK_BRACKETLEFT
48/* 0x1B PMSCAN_BRACKETRIGHT */ , VK_BRACKETRIGHT
49/* 0x1C PMSCAN_ENTER */ , VK_RETURN
50/* 0x1D PMSCAN_CTRLLEFT */ , VK_CONTROL
51/* 0x1E PMSCAN_A */ , VK_A
52/* 0x1F PMSCAN_S */ , VK_S
53/* 0x20 PMSCAN_D */ , VK_D
54/* 0x21 PMSCAN_F */ , VK_F
55/* 0x22 PMSCAN_G */ , VK_G
56/* 0x23 PMSCAN_H */ , VK_H
57/* 0x24 PMSCAN_J */ , VK_J
58/* 0x25 PMSCAN_K */ , VK_K
59/* 0x26 PMSCAN_L */ , VK_L
60/* 0x27 PMSCAN_SEMICOLON */ , VK_SEMICOLON
61/* 0x28 PMSCAN_QUOTESINGLE */ , VK_QUOTESINGLE
62/* 0x29 PMSCAN_GRAVE */ , VK_GRAVE
63/* 0x2A PMSCAN_SHIFTLEFT */ , VK_SHIFT
64/* 0x2B PMSCAN_BACKSLASH */ , VK_BACKSLASH
65/* 0x2C PMSCAN_Z */ , VK_Z
66/* 0x2D PMSCAN_X */ , VK_X
67/* 0x2E PMSCAN_C */ , VK_C
68/* 0x2F PMSCAN_V */ , VK_V
69/* 0x30 PMSCAN_B */ , VK_B
70/* 0x31 PMSCAN_N */ , VK_N
71/* 0x32 PMSCAN_M */ , VK_M
72/* 0x33 PMSCAN_COMMA */ , VK_COMMA
73/* 0x34 PMSCAN_PERIOD */ , VK_PERIOD
74/* 0x35 PMSCAN_SLASH */ , VK_SLASH
75/* 0x36 PMSCAN_SHIFTRIGHT */ , VK_SHIFT
76/* 0x37 PMSCAN_PADASTERISK */ , VK_MULTIPLY
77/* 0x38 PMSCAN_ALTLEFT */ , VK_MENU
78/* 0x39 PMSCAN_SPACE */ , VK_SPACE
79/* 0x3A PMSCAN_CAPSLOCK */ , VK_CAPITAL
80/* 0x3B PMSCAN_F1 */ , VK_F1
81/* 0x3C PMSCAN_F2 */ , VK_F2
82/* 0x3D PMSCAN_F3 */ , VK_F3
83/* 0x3E PMSCAN_F4 */ , VK_F4
84/* 0x3F PMSCAN_F5 */ , VK_F5
85/* 0x40 PMSCAN_F6 */ , VK_F6
86/* 0x41 PMSCAN_F7 */ , VK_F7
87/* 0x42 PMSCAN_F8 */ , VK_F8
88/* 0x43 PMSCAN_F9 */ , VK_F9
89/* 0x44 PMSCAN_F10 */ , VK_F10
90/* 0x45 PMSCAN_NUMLOCK */ , VK_NUMLOCK
91/* 0x46 PMSCAN_SCROLLLOCK */ , VK_SCROLL
92/* 0x47 PMSCAN_PAD7 */ , VK_NUMPAD7
93/* 0x48 PMSCAN_PAD8 */ , VK_NUMPAD8
94/* 0x49 PMSCAN_PAD9 */ , VK_NUMPAD9
95/* 0x4A PMSCAN_PADMINUS */ , VK_SUBTRACT
96/* 0x4B PMSCAN_PAD4 */ , VK_NUMPAD4
97/* 0x4C PMSCAN_PAD5 */ , VK_NUMPAD5
98/* 0x4D PMSCAN_PAD6 */ , VK_NUMPAD6
99/* 0x4E PMSCAN_PADPLUS */ , VK_ADD
100/* 0x4F PMSCAN_PAD1 */ , VK_NUMPAD1
101/* 0x50 PMSCAN_PAD2 */ , VK_NUMPAD2
102/* 0x51 PMSCAN_PAD3 */ , VK_NUMPAD3
103/* 0x52 PMSCAN_PAD0 */ , VK_NUMPAD0
104/* 0x53 PMSCAN_PADPERIOD */ , VK_DECIMAL
105/* 0x54 PMSCAN_SYSREQ */ , 0x00
106/* 0x55 PMSCAN_RESET */ , 0x00
107/* 0x56 PMSCAN_EXTRA */ , VK_EXTRA
108/* 0x57 PMSCAN_F11 */ , VK_F11
109/* 0x58 PMSCAN_F12 */ , VK_F12
110/* 0x59 PMSCAN_BACKTAB */ , 0x00
111/* 0x5A PMSCAN_PADENTER */ , VK_RETURN
112/* 0x5B PMSCAN_CTRLRIGHT */ , VK_CONTROL
113/* 0x5C PMSCAN_PADSLASH */ , VK_DIVIDE
114/* 0x5D PMSCAN_PRINT */ , VK_PRINT
115/* 0x5E PMSCAN_ALTRIGHT */ , VK_MENU
116/* 0x5F PMSCAN_PAUSE */ , VK_PAUSE
117/* 0x60 PMSCAN_HOME */ , VK_HOME
118/* 0x61 PMSCAN_UP */ , VK_UP
119/* 0x62 PMSCAN_PAGEUP */ , VK_PRIOR
120/* 0x63 PMSCAN_LEFT */ , VK_LEFT
121/* 0x64 PMSCAN_RIGHT */ , VK_RIGHT
122/* 0x65 PMSCAN_END */ , VK_END
123/* 0x66 PMSCAN_DOWN */ , VK_DOWN
124/* 0x67 PMSCAN_PAGEDOWN */ , VK_NEXT
125/* 0x68 PMSCAN_INSERT */ , VK_INSERT
126/* 0x69 PMSCAN_DELETE */ , VK_DELETE
127/* 0x6A PMSCAN_F23 */ , VK_F23
128/* 0x6B PMSCAN_F24 */ , VK_F24
129/* 0x6C PMSCAN_SYSMEM */ , 0x00
130/* 0x6D PMSCAN_ERASEEOF */ , VK_EREOF
131/* 0x6E PMSCAN_BREAK */ , VK_CANCEL
132/* 0x6F PMSCAN_MOVEWIN */ , 0x00
133/* 0x70 PMSCAN_NLS3 */ , 0x00
134/* 0x71 PMSCAN_HELP */ , VK_HELP
135/* 0x72 PMSCAN_TASKMAN */ , 0x00
136/* 0x73 PMSCAN_B11 */ , 0x00
137/* 0x74 PMSCAN_JUMP */ , 0x00
138/* 0x75 PMSCAN_MINWIN */ , 0x00
139/* 0x76 PMSCAN_CLEAR */ , 0x00
140/* 0x77 PMSCAN_77 */ , 0x00
141/* 0x78 PMSCAN_78 */ , 0x00
142/* 0x79 PMSCAN_NLS2 */ , 0x00
143/* 0x7a PMSCAN_SIZE */ , 0x00
144/* 0x7b PMSCAN_NLS1 */ , 0x00
145/* 0x7c PMSCAN_APPLICATION */ , VK_APPS
146/* 0x7d PMSCAN_E13 */ , 0x00
147/* 0x7e PMSCAN */ , 0x00
148/* 0x7f PMSCAN */ , 0x00
149/* 0x80 PMSCAN_PA1 */ , VK_PA1
150/* 0x81 PMSCAN_F13 */ , VK_F13
151/* 0x82 PMSCAN_F14 */ , VK_F14
152/* 0x83 PMSCAN_F15 */ , VK_F15
153/* 0x84 PMSCAN_PA2 */ , 0x00
154/* 0x85 PMSCAN_PA3 */ , 0x00
155/* 0x86 PMSCAN_SPACEBREAK */ , 0x00
156/* 0x87 PMSCAN_TABRIGHT */ , 0x00
157/* 0x88 PMSCAN_NOOP */ , 0x00
158/* 0x89 PMSCAN_F16 */ , VK_F16
159/* 0x8a PMSCAN_F17 */ , VK_F17
160/* 0x8b PMSCAN_F18 */ , VK_F18
161/* 0x8c PMSCAN_F19 */ , VK_F19
162/* 0x8d PMSCAN_F20 */ , VK_F20
163/* 0x8e PMSCAN_F21 */ , VK_F21
164/* 0x8f PMSCAN_F22 */ , VK_F22
165/* 0x90 */ , 0x00
166/* 0x91 */ , 0x00
167/* 0x92 */ , 0x00
168/* 0x93 */ , 0x00
169/* 0x94 */ , 0x00
170/* 0x95 */ , 0x00
171/* 0x96 */ , 0x00
172/* 0x97 */ , 0x00
173/* 0x98 */ , 0x00
174/* 0x99 */ , 0x00
175/* 0x9A */ , 0x00
176/* 0x9B */ , 0x00
177/* 0x9C */ , 0x00
178/* 0x9D */ , 0x00
179/* 0x9E */ , 0x00
180/* 0x9F */ , 0x00
181/* 0xA0 */ , 0x00
182/* 0xA1 */ , 0x00
183/* 0xA2 */ , 0x00
184/* 0xA3 */ , 0x00
185/* 0xA4 */ , 0x00
186/* 0xA5 */ , 0x00
187/* 0xA6 */ , 0x00
188/* 0xA7 */ , 0x00
189/* 0xA8 */ , 0x00
190/* 0xA9 */ , 0x00
191/* 0xAA */ , 0x00
192/* 0xAB */ , 0x00
193/* 0xAC */ , 0x00
194/* 0xAD */ , 0x00
195/* 0xAE */ , 0x00
196/* 0xAF */ , 0x00
197/* 0xB0 */ , 0x00
198/* 0xB1 */ , 0x00
199/* 0xB2 */ , 0x00
200/* 0xB3 */ , 0x00
201/* 0xB4 */ , 0x00
202/* 0xB5 */ , 0x00
203/* 0xB6 */ , 0x00
204/* 0xB7 */ , 0x00
205/* 0xB8 */ , 0x00
206/* 0xB9 */ , 0x00
207/* 0xBA */ , 0x00
208/* 0xBB */ , 0x00
209/* 0xBC */ , 0x00
210/* 0xBD */ , 0x00
211/* 0xBE */ , 0x00
212/* 0xBF */ , 0x00
213/* 0xC0 */ , 0x00
214/* 0xC1 */ , 0x00
215/* 0xC2 */ , 0x00
216/* 0xC3 */ , 0x00
217/* 0xC4 */ , 0x00
218/* 0xC5 */ , 0x00
219/* 0xC6 */ , 0x00
220/* 0xC7 */ , 0x00
221/* 0xC8 */ , 0x00
222/* 0xC9 */ , 0x00
223/* 0xCA */ , 0x00
224/* 0xCB */ , 0x00
225/* 0xCC */ , 0x00
226/* 0xCD */ , 0x00
227/* 0xCE */ , 0x00
228/* 0xCF */ , 0x00
229/* 0xD0 */ , 0x00
230/* 0xD1 */ , 0x00
231/* 0xD2 */ , 0x00
232/* 0xD3 */ , 0x00
233/* 0xD4 */ , 0x00
234/* 0xD5 */ , 0x00
235/* 0xD6 */ , 0x00
236/* 0xD7 */ , 0x00
237/* 0xD8 */ , 0x00
238/* 0xD9 */ , 0x00
239/* 0xDA */ , 0x00
240/* 0xDB */ , 0x00
241/* 0xDC */ , 0x00
242/* 0xDD */ , 0x00
243/* 0xDE */ , 0x00
244/* 0xDF */ , 0x00
245/* 0xE0 */ , 0x00
246/* 0xE1 */ , 0x00
247/* 0xE2 */ , 0x00
248/* 0xE3 */ , 0x00
249/* 0xE4 */ , 0x00
250/* 0xE5 */ , 0x00
251/* 0xE6 */ , 0x00
252/* 0xE7 */ , 0x00
253/* 0xE8 */ , 0x00
254/* 0xE9 */ , 0x00
255/* 0xEA */ , 0x00
256/* 0xEB */ , 0x00
257/* 0xEC */ , 0x00
258/* 0xED */ , 0x00
259/* 0xEE */ , 0x00
260/* 0xEF */ , 0x00
261/* 0xF0 */ , 0x00
262/* 0xF1 */ , 0x00
263/* 0xF2 */ , 0x00
264/* 0xF3 */ , 0x00
265/* 0xF4 */ , 0x00
266/* 0xF5 */ , 0x00
267/* 0xF6 */ , 0x00
268/* 0xF7 */ , 0x00
269/* 0xF8 */ , 0x00
270/* 0xF9 */ , 0x00
271/* 0xFA */ , 0x00
272/* 0xFB */ , 0x00
273/* 0xFC */ , 0x00
274/* 0xFD */ , 0x00
275/* 0xFE */ , 0x00
276/* 0xFF */ , 0x00
277 };
278
279//******************************************************************************
280//******************************************************************************
281BYTE WIN32API KeyTranslatePMToWin(BYTE key)
282{
283 return abPMScanToWinVKey[key];
284}
285//******************************************************************************
286//******************************************************************************
287void WIN32API KeyTranslatePMToWinBuf(BYTE *pmkey, BYTE *winkey, int nrkeys)
288{
289 for(int i=0;i<nrkeys;i++) {
290 winkey[i] = abPMScanToWinVKey[pmkey[i]];
291 }
292}
293//******************************************************************************
294//******************************************************************************
295BOOL WIN32API GetKeyboardState(PBYTE lpKeyState)
296{
297 BYTE PMKeyState[256];
298 BOOL rc;
299
300 dprintf(("USER32: GetKeyboardState"));
301 rc = OSLibWinGetKeyboardStateTable((PBYTE)&PMKeyState );
302
303 if(rc == TRUE)
304 {
305 KeyTranslatePMToWinBuf((BYTE *)&PMKeyState, lpKeyState, 256);
306 return TRUE;
307 }
308 return FALSE;
309}
310//******************************************************************************
311//******************************************************************************
312BOOL WIN32API SetKeyboardState(PBYTE lpKeyState)
313{
314 dprintf(("USER32: SetKeyboardState, not implemented"));
315 return(TRUE);
316}
317/***********************************************************************
318 * GetKeyboardLayout (USER32.250)
319 *
320 * FIXME: - device handle for keyboard layout defaulted to
321 * the language id. This is the way Windows default works.
322 * - the thread identifier (dwLayout) is also ignored.
323 */
324// * Remark : Based on Wine version (991031)
325HKL WIN32API GetKeyboardLayout(DWORD dwLayout)
326{
327 HKL layout;
328 layout = GetSystemDefaultLCID(); /* FIXME */
329 layout |= (layout<<16); /* FIXME */
330 dprintf(("GetKeyboardLayout returning %08x\n",layout));
331 return layout;
332}
333/*****************************************************************************
334 * Name : BOOL WIN32API GetKeyboardLayoutNameA
335 * Purpose : The GetKeyboardLayoutName function retrieves the name of the
336 * active keyboard layout.
337 * Parameters: LPTSTR pwszKLID address of buffer for layout name
338 * Variables :
339 * Result : If the function succeeds, the return value is TRUE.
340 * If the function fails, the return value is FALSE. To get extended
341 * error information, call GetLastError.
342 * Remark : Based on Wine version (991031)
343 * Status : UNTESTED STUB
344 *
345 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
346 *****************************************************************************/
347INT WIN32API GetKeyboardLayoutNameA(LPTSTR pwszKLID)
348{
349 dprintf(("USER32:GetKeyboardLayoutNameA"));
350
351 sprintf(pwszKLID, "%08x",GetKeyboardLayout(0));
352 return 1;
353}
354/*****************************************************************************
355 * Name : BOOL WIN32API GetKeyboardLayoutNameW
356 * Purpose : The GetKeyboardLayoutName function retrieves the name of the
357 * active keyboard layout.
358 * Parameters: LPTSTR pwszKLID address of buffer for layout name
359 * Variables :
360 * Result : If the function succeeds, the return value is TRUE.
361 * If the function fails, the return value is FALSE. To get extended
362 * error information, call GetLastError.
363 * Remark : Based on Wine version (991031)
364 * Status : UNTESTED STUB
365 *
366 * Author : Patrick Haller [Thu, 1998/02/26 11:55]
367 *****************************************************************************/
368INT WIN32API GetKeyboardLayoutNameW(LPWSTR pwszKLID)
369{
370 LPSTR buf = (LPSTR)HEAP_xalloc( GetProcessHeap(), 0, strlen("00000409")+1);
371
372 dprintf(("USER32:GetKeyboardLayoutNameA"));
373 int res = GetKeyboardLayoutNameA(buf);
374 lstrcpyAtoW(pwszKLID,buf);
375 HeapFree( GetProcessHeap(), 0, buf );
376 return res;
377}
378/***********************************************************************
379 * GetKeyboardLayoutList (USER32.251)
380 *
381 * FIXME: Supports only the system default language and layout and
382 * returns only 1 value.
383 *
384 * Return number of values available if either input parm is
385 * 0, per MS documentation.
386 *
387 * Remark : Based on Wine version (991031)
388 */
389INT WINAPI GetKeyboardLayoutList(INT nBuff,HKL *layouts)
390{
391 dprintf(("GetKeyboardLayoutList(%d,%p)\n",nBuff,layouts));
392 if (!nBuff || !layouts)
393 return 1;
394 if (layouts)
395 layouts[0] = GetKeyboardLayout(0);
396 return 1;
397}
398
399//******************************************************************************
400//******************************************************************************
Note: See TracBrowser for help on using the repository browser.