Release 960712
[wine/multimedia.git] / misc / keyboard.c
blob750a645bf01060bf65511532942c00d55a58fd69
1 /*
2 static char RCSId[] = "$Id: keyboard.c,v 1.2 1993/09/13 18:52:02 scott Exp $";
3 static char Copyright[] = "Copyright Scott A. Laird, Erik Bos 1993, 1994";
4 */
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <ctype.h>
10 #include "windows.h"
11 #include "stddebug.h"
12 /* #define DEBUG_KEYBOARD */
13 #include "debug.h"
16 struct KeyTableEntry {
17 int virtualkey;
18 int ASCII;
19 int scancode;
20 const char *name;
23 static const struct KeyTableEntry KeyTable[] =
25 { 0x3, 0x3, 0x0, "" },
26 { 0x8, 0x8, 0xe, "Backspace" },
27 { 0x9, 0x9, 0xf, "Tab" },
28 { 0xc, 0x0, 0x4c, "Num 5" },
29 { 0xd, 0xd, 0x1c, "Enter" },
30 { 0x10, 0x0, 0x2a, "Shift" },
31 { 0x11, 0x0, 0x1d, "Ctrl" },
32 { 0x12, 0x0, 0x38, "Alt" },
33 { 0x14, 0x0, 0x3a, "Caps Lock" },
34 { 0x1b, 0x1b, 0x1, "Esc" },
35 { 0x20, 0x20, 0x39, "Space" },
36 { 0x21, 0x0, 0x49, "Num 9" },
37 { 0x22, 0x0, 0x51, "Num 3" },
38 { 0x23, 0x0, 0x4f, "Num 1" },
39 { 0x24, 0x0, 0x47, "Num 7" },
40 { 0x25, 0x0, 0x4b, "Num 4" },
41 { 0x26, 0x0, 0x48, "Num 8" },
42 { 0x27, 0x0, 0x4d, "Num 6" },
43 { 0x28, 0x0, 0x50, "Num 2" },
44 { 0x2d, 0x0, 0x52, "Num 0" },
45 { 0x2e, 0x0, 0x53, "Num Del" },
46 { 0x30, 0x30, 0xb, "0" },
47 { 0x31, 0x31, 0x2, "1" },
48 { 0x32, 0x32, 0x3, "2" },
49 { 0x33, 0x33, 0x4, "3" },
50 { 0x34, 0x34, 0x5, "4" },
51 { 0x35, 0x35, 0x6, "5" },
52 { 0x36, 0x36, 0x7, "6" },
53 { 0x37, 0x37, 0x8, "7" },
54 { 0x38, 0x38, 0x9, "8" },
55 { 0x39, 0x39, 0xa, "9" },
56 { 0x41, 0x41, 0x1e, "A" },
57 { 0x42, 0x42, 0x30, "B" },
58 { 0x43, 0x43, 0x2e, "C" },
59 { 0x44, 0x44, 0x20, "D" },
60 { 0x45, 0x45, 0x12, "E" },
61 { 0x46, 0x46, 0x21, "F" },
62 { 0x47, 0x47, 0x22, "G" },
63 { 0x48, 0x48, 0x23, "H" },
64 { 0x49, 0x49, 0x17, "I" },
65 { 0x4a, 0x4a, 0x24, "J" },
66 { 0x4b, 0x4b, 0x25, "K" },
67 { 0x4c, 0x4c, 0x26, "L" },
68 { 0x4d, 0x4d, 0x32, "M" },
69 { 0x4e, 0x4e, 0x31, "N" },
70 { 0x4f, 0x4f, 0x18, "O" },
71 { 0x50, 0x50, 0x19, "P" },
72 { 0x51, 0x51, 0x10, "Q" },
73 { 0x52, 0x52, 0x13, "R" },
74 { 0x53, 0x53, 0x1f, "S" },
75 { 0x54, 0x54, 0x14, "T" },
76 { 0x55, 0x55, 0x16, "U" },
77 { 0x56, 0x56, 0x2f, "V" },
78 { 0x57, 0x57, 0x11, "W" },
79 { 0x58, 0x58, 0x2d, "X" },
80 { 0x59, 0x59, 0x15, "Y" },
81 { 0x5a, 0x5a, 0x2c, "Z" },
82 { 0x60, 0x0, 0x52, "Num 0" },
83 { 0x61, 0x0, 0x4f, "Num 1" },
84 { 0x62, 0x0, 0x50, "Num 2" },
85 { 0x63, 0x0, 0x51, "Num 3" },
86 { 0x64, 0x0, 0x4b, "Num 4" },
87 { 0x65, 0x0, 0x4c, "Num 5" },
88 { 0x66, 0x0, 0x4d, "Num 6" },
89 { 0x67, 0x0, 0x47, "Num 7" },
90 { 0x68, 0x0, 0x48, "Num 8" },
91 { 0x69, 0x0, 0x49, "Num 9" },
92 { 0x6a, 0x2a, 0x37, "Num *" },
93 { 0x6b, 0x2b, 0x4e, "Num +" },
94 { 0x6c, 0x0, 0x0, "" },
95 { 0x6d, 0x2d, 0x4a, "Num -" },
96 { 0x6e, 0x2e, 0x53, "Num Del" },
97 { 0x6f, 0x2f, 0x0, "" },
98 { 0x70, 0x0, 0x3b, "F1" },
99 { 0x71, 0x0, 0x3c, "F2" },
100 { 0x72, 0x0, 0x3d, "F3" },
101 { 0x73, 0x0, 0x3e, "F4" },
102 { 0x74, 0x0, 0x3f, "F5" },
103 { 0x75, 0x0, 0x40, "F6" },
104 { 0x76, 0x0, 0x41, "F7" },
105 { 0x77, 0x0, 0x42, "F8" },
106 { 0x78, 0x0, 0x43, "F9" },
107 { 0x79, 0x0, 0x44, "F10" },
108 { 0x7a, 0x0, 0x57, "F11" },
109 { 0x7b, 0x0, 0x58, "F12" },
110 { 0x90, 0x0, 0x45, "Pause" },
111 { 0x91, 0x0, 0x46, "Scroll Lock" },
112 { 0xba, 0x3b, 0x27, ";" },
113 { 0xbb, 0x3d, 0xd, "=" },
114 { 0xbc, 0x2c, 0x33, "," },
115 { 0xbd, 0x2d, 0xc, "-" },
116 { 0xbe, 0x2e, 0x34, "." },
117 { 0xbf, 0x2f, 0x35, "/" },
118 { 0xc0, 0x60, 0x29, "`" },
119 { 0xdb, 0x5b, 0x1a, "[" },
120 { 0xdc, 0x5c, 0x2b, "\\" },
121 { 0xdd, 0x5d, 0x1b, "]" },
122 { 0xde, 0x27, 0x28, "\'" },
123 { 0xe2, 0x5c, 0x56, "\\" },
126 #define KeyTableSize sizeof(KeyTable) / sizeof(struct KeyTableEntry)
128 int ToAscii(WORD wVirtKey, WORD wScanCode, LPSTR lpKeyState,
129 LPVOID lpChar, WORD wFlags)
131 int i;
133 dprintf_keyboard(stddeb,"ToAscii (%d,%d)\n",wVirtKey, wScanCode);
135 /* FIXME: codepage is broken */
137 for (i = 0 ; i != KeyTableSize ; i++)
138 if (KeyTable[i].virtualkey == wVirtKey)
140 dprintf_keyboard(stddeb,"\t\tchar = %s\n", KeyTable[i].name);
141 if( isprint(KeyTable[i].ASCII) || isspace(KeyTable[i].ASCII) )
143 *(BYTE*)lpChar = KeyTable[i].ASCII;
144 *(((BYTE*)lpChar) + 1) = 0;
146 if( isalpha( *(BYTE*)lpChar ) )
147 if( (lpKeyState[VK_CAPITAL]<0 && !lpKeyState[VK_SHIFT]) ||
148 (!lpKeyState[VK_CAPITAL] && lpKeyState[VK_SHIFT]<0) )
149 *(BYTE*)lpChar = toupper( *(BYTE*)lpChar );
150 else
151 *(BYTE*)lpChar = tolower( *(BYTE*)lpChar );
153 return 1;
157 *(BYTE*)lpChar = 0;
158 return 0;
161 DWORD OemKeyScan(WORD wOemChar)
163 dprintf_keyboard(stddeb,"*OemKeyScan (%d)\n",wOemChar);
165 return wOemChar;
168 /* VkKeyScan translates an ANSI character to a virtual-key and shift code
169 * for the current keyboard. */
171 WORD VkKeyScan(WORD cChar)
173 int i;
175 dprintf_keyboard(stddeb,"VkKeyScan (%d)\n",cChar);
177 for (i = 0 ; i != KeyTableSize ; i++)
178 if (KeyTable[i].ASCII == cChar)
179 return KeyTable[i].virtualkey;
181 return -1;
184 int GetKeyboardType(int nTypeFlag)
186 dprintf_keyboard(stddeb,"GetKeyboardType(%d)\n",nTypeFlag);
187 switch(nTypeFlag)
189 case 0: /* Keyboard type */
190 return 4; /* AT-101 */
191 break;
192 case 1: /* Keyboard Subtype */
193 return 0; /* There are no defined subtypes */
194 break;
195 case 2: /* Number of F-keys */
196 return 12; /* We're doing an 101 for now, so return 12 F-keys */
197 break;
198 default:
199 fprintf(stderr, "Unknown type on GetKeyboardType\n");
200 return 0; /* The book says 0 here, so 0 */
204 /* MapVirtualKey translates keycodes from one format to another. */
206 WORD MapVirtualKey(WORD wCode, WORD wMapType)
208 int i;
210 switch(wMapType) {
211 case 0:
212 for (i = 0 ; i != KeyTableSize ; i++)
213 if (KeyTable[i].virtualkey == wCode)
214 return KeyTable[i].scancode;
215 return 0;
217 case 1:
218 for (i = 0 ; i != KeyTableSize ; i++)
219 if (KeyTable[i].scancode == wCode)
220 return KeyTable[i].virtualkey;
221 return 0;
223 case 2:
224 for (i = 0 ; i != KeyTableSize ; i++)
225 if (KeyTable[i].virtualkey == wCode)
226 return KeyTable[i].ASCII;
227 return 0;
229 default:
230 fprintf(stderr, "MapVirtualKey: unknown wMapType!\n");
231 return 0;
233 return 0;
236 int GetKbCodePage(void)
238 dprintf_keyboard(stddeb,"GetKbCodePage()\n");
239 return 850;
242 int GetKeyNameText(LONG lParam, LPSTR lpBuffer, int nSize)
244 int i;
246 dprintf_keyboard(stddeb,"GetKeyNameText(%ld,<ptr>,%d)\n",lParam,nSize);
248 lParam >>= 16;
249 lParam &= 0xff;
251 for (i = 0 ; i != KeyTableSize ; i++)
252 if (KeyTable[i].scancode == lParam) {
253 lstrcpyn32A( lpBuffer, KeyTable[i].name, nSize );
254 return strlen(lpBuffer);
257 *lpBuffer = 0;
258 return 0;