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";
12 /* #define DEBUG_KEYBOARD */
16 struct KeyTableEntry
{
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
)
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
);
151 *(BYTE
*)lpChar
= tolower( *(BYTE
*)lpChar
);
161 DWORD
OemKeyScan(WORD wOemChar
)
163 dprintf_keyboard(stddeb
,"*OemKeyScan (%d)\n",wOemChar
);
168 /* VkKeyScan translates an ANSI character to a virtual-key and shift code
169 * for the current keyboard. */
171 WORD
VkKeyScan(WORD cChar
)
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
;
184 int GetKeyboardType(int nTypeFlag
)
186 dprintf_keyboard(stddeb
,"GetKeyboardType(%d)\n",nTypeFlag
);
189 case 0: /* Keyboard type */
190 return 4; /* AT-101 */
192 case 1: /* Keyboard Subtype */
193 return 0; /* There are no defined subtypes */
195 case 2: /* Number of F-keys */
196 return 12; /* We're doing an 101 for now, so return 12 F-keys */
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
)
212 for (i
= 0 ; i
!= KeyTableSize
; i
++)
213 if (KeyTable
[i
].virtualkey
== wCode
)
214 return KeyTable
[i
].scancode
;
218 for (i
= 0 ; i
!= KeyTableSize
; i
++)
219 if (KeyTable
[i
].scancode
== wCode
)
220 return KeyTable
[i
].virtualkey
;
224 for (i
= 0 ; i
!= KeyTableSize
; i
++)
225 if (KeyTable
[i
].virtualkey
== wCode
)
226 return KeyTable
[i
].ASCII
;
230 fprintf(stderr
, "MapVirtualKey: unknown wMapType!\n");
236 int GetKbCodePage(void)
238 dprintf_keyboard(stddeb
,"GetKbCodePage()\n");
242 int GetKeyNameText(LONG lParam
, LPSTR lpBuffer
, int nSize
)
246 dprintf_keyboard(stddeb
,"GetKeyNameText(%ld,<ptr>,%d)\n",lParam
,nSize
);
251 for (i
= 0 ; i
!= KeyTableSize
; i
++)
252 if (KeyTable
[i
].scancode
== lParam
) {
253 lstrcpyn32A( lpBuffer
, KeyTable
[i
].name
, nSize
);
254 return strlen(lpBuffer
);