1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * Support for platform-independent key-mapping
5 *
6 * Copyright 2004 Richard Drummond
7 * 2010-2011 Mustafa Tufan
8 */
9
10 #include "sysconfig.h"
11 #include "sysdeps.h"
12
13 #include "options.h"
14 #include "inputdevice.h"
15 #include "keymap.h"
16 #include "keyboard.h"
17
18 /* internal prototypes */
19 int getcapslock (void);
20 void clearallkeys (void);
21 void my_kbd_handler (int keyboard, int scancode, int newstate);
22
23 /* internal members */
24 static struct uae_input_device_kbr_default keytrans_amiga[] = {
25
26 { DIK_ESCAPE, {{INPUTEVENT_KEY_ESC, 0}} },
27
28 { DIK_F1, {{INPUTEVENT_KEY_F1, 0}, {INPUTEVENT_SPC_FLOPPY0, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_EFLOPPY0, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
29 { DIK_F2, {{INPUTEVENT_KEY_F2, 0}, {INPUTEVENT_SPC_FLOPPY1, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_EFLOPPY1, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
30 { DIK_F3, {{INPUTEVENT_KEY_F3, 0}, {INPUTEVENT_SPC_FLOPPY2, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_EFLOPPY2, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
31 { DIK_F4, {{INPUTEVENT_KEY_F4, 0}, {INPUTEVENT_SPC_FLOPPY3, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_EFLOPPY3, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
32 { DIK_F5, {{INPUTEVENT_KEY_F5, 0}, {INPUTEVENT_SPC_STATERESTOREDIALOG, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_STATESAVEDIALOG, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
33 { DIK_F6, {{INPUTEVENT_KEY_F6, 0}} },
34 { DIK_F7, {{INPUTEVENT_KEY_F7, 0}} },
35 { DIK_F8, {{INPUTEVENT_KEY_F8, 0}} },
36 { DIK_F9, {{INPUTEVENT_KEY_F9, 0}} },
37 { DIK_F10, {{INPUTEVENT_KEY_F10, 0}} },
38
39 { DIK_1, {{INPUTEVENT_KEY_1, 0}} },
40 { DIK_2, {{INPUTEVENT_KEY_2, 0}} },
41 { DIK_3, {{INPUTEVENT_KEY_3, 0}} },
42 { DIK_4, {{INPUTEVENT_KEY_4, 0}} },
43 { DIK_5, {{INPUTEVENT_KEY_5, 0}} },
44 { DIK_6, {{INPUTEVENT_KEY_6, 0}} },
45 { DIK_7, {{INPUTEVENT_KEY_7, 0}} },
46 { DIK_8, {{INPUTEVENT_KEY_8, 0}} },
47 { DIK_9, {{INPUTEVENT_KEY_9, 0}} },
48 { DIK_0, {{INPUTEVENT_KEY_0, 0}} },
49
50 { DIK_TAB, {{INPUTEVENT_KEY_TAB, 0}} },
51
52 { DIK_A, {{INPUTEVENT_KEY_A, 0}} },
53 { DIK_B, {{INPUTEVENT_KEY_B, 0}} },
54 { DIK_C, {{INPUTEVENT_KEY_C, 0}} },
55 { DIK_D, {{INPUTEVENT_KEY_D, 0}} },
56 { DIK_E, {{INPUTEVENT_KEY_E, 0}} },
57 { DIK_F, {{INPUTEVENT_KEY_F, 0}} },
58 { DIK_G, {{INPUTEVENT_KEY_G, 0}} },
59 { DIK_H, {{INPUTEVENT_KEY_H, 0}} },
60 { DIK_I, {{INPUTEVENT_KEY_I, 0}} },
61 { DIK_J, {{INPUTEVENT_KEY_J, 0}} },
62 { DIK_K, {{INPUTEVENT_KEY_K, 0}} },
63 { DIK_L, {{INPUTEVENT_KEY_L, 0}} },
64 { DIK_M, {{INPUTEVENT_KEY_M, 0}} },
65 { DIK_N, {{INPUTEVENT_KEY_N, 0}} },
66 { DIK_O, {{INPUTEVENT_KEY_O, 0}} },
67 { DIK_P, {{INPUTEVENT_KEY_P, 0}} },
68 { DIK_Q, {{INPUTEVENT_KEY_Q, 0}} },
69 { DIK_R, {{INPUTEVENT_KEY_R, 0}} },
70 { DIK_S, {{INPUTEVENT_KEY_S, 0}} },
71 { DIK_T, {{INPUTEVENT_KEY_T, 0}} },
72 { DIK_U, {{INPUTEVENT_KEY_U, 0}} },
73 { DIK_W, {{INPUTEVENT_KEY_W, 0}} },
74 { DIK_V, {{INPUTEVENT_KEY_V, 0}} },
75 { DIK_X, {{INPUTEVENT_KEY_X, 0}} },
76 { DIK_Y, {{INPUTEVENT_KEY_Y, 0}} },
77 { DIK_Z, {{INPUTEVENT_KEY_Z, 0}} },
78
79 { DIK_CAPITAL, {{INPUTEVENT_KEY_CAPS_LOCK, 0}} },
80
81 { DIK_NUMPAD1, {{INPUTEVENT_KEY_NP_1, 0}} },
82 { DIK_NUMPAD2, {{INPUTEVENT_KEY_NP_2, 0}} },
83 { DIK_NUMPAD3, {{INPUTEVENT_KEY_NP_3, 0}} },
84 { DIK_NUMPAD4, {{INPUTEVENT_KEY_NP_4, 0}} },
85 { DIK_NUMPAD5, {{INPUTEVENT_KEY_NP_5, 0}} },
86 { DIK_NUMPAD6, {{INPUTEVENT_KEY_NP_6, 0}} },
87 { DIK_NUMPAD7, {{INPUTEVENT_KEY_NP_7, 0}} },
88 { DIK_NUMPAD8, {{INPUTEVENT_KEY_NP_8, 0}} },
89 { DIK_NUMPAD9, {{INPUTEVENT_KEY_NP_9, 0}} },
90 { DIK_NUMPAD0, {{INPUTEVENT_KEY_NP_0, 0}} },
91 { DIK_DECIMAL, {{INPUTEVENT_KEY_NP_PERIOD, 0}} },
92 { DIK_ADD, {{INPUTEVENT_KEY_NP_ADD, 0}, {INPUTEVENT_SPC_VOLUME_UP, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_MASTER_VOLUME_UP, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_CONTROL}, {INPUTEVENT_SPC_INCREASE_REFRESHRATE, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
93 { DIK_SUBTRACT, {{INPUTEVENT_KEY_NP_SUB, 0}, {INPUTEVENT_SPC_VOLUME_DOWN, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_MASTER_VOLUME_DOWN, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_CONTROL}, {INPUTEVENT_SPC_DECREASE_REFRESHRATE, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
94 { DIK_MULTIPLY, {{INPUTEVENT_KEY_NP_MUL, 0}, {INPUTEVENT_SPC_VOLUME_MUTE, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_MASTER_VOLUME_MUTE, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_CONTROL}} },
95 { DIK_DIVIDE, {{INPUTEVENT_KEY_NP_DIV, 0}, {INPUTEVENT_SPC_STATEREWIND, ID_FLAG_QUALIFIER_SPECIAL}} },
96 { DIK_NUMPADENTER, {{INPUTEVENT_KEY_ENTER, 0}} },
97
98 { DIK_MINUS, {{INPUTEVENT_KEY_SUB, 0}} },
99 { DIK_EQUALS, {{INPUTEVENT_KEY_EQUALS, 0}} },
100 { DIK_BACK, {{INPUTEVENT_KEY_BACKSPACE, 0}} },
101 { DIK_RETURN, {{INPUTEVENT_KEY_RETURN, 0}} },
102 { DIK_SPACE, {{INPUTEVENT_KEY_SPACE, 0}} },
103
104 { DIK_LSHIFT, {{INPUTEVENT_KEY_SHIFT_LEFT, 0}, {INPUTEVENT_SPC_QUALIFIER_SHIFT, 0}} },
105 { DIK_LCONTROL, {{INPUTEVENT_KEY_CTRL, 0}, {INPUTEVENT_SPC_QUALIFIER_CONTROL, 0}} },
106 { DIK_LWIN, {{INPUTEVENT_KEY_AMIGA_LEFT, 0}} },
107 { DIK_LMENU, {{INPUTEVENT_KEY_ALT_LEFT, 0}, {INPUTEVENT_SPC_QUALIFIER_ALT, 0}} },
108 { DIK_RMENU, {{INPUTEVENT_KEY_ALT_RIGHT, 0}, {INPUTEVENT_SPC_QUALIFIER_ALT, 0}} },
109 { DIK_RWIN, {{INPUTEVENT_KEY_AMIGA_RIGHT, 0}} },
110 { DIK_APPS, {{INPUTEVENT_KEY_AMIGA_RIGHT, 0}} },
111 { DIK_RCONTROL, {{INPUTEVENT_KEY_CTRL, 0}, {INPUTEVENT_SPC_QUALIFIER_CONTROL, 0}} },
112 { DIK_RSHIFT, {{INPUTEVENT_KEY_SHIFT_RIGHT, 0}, {INPUTEVENT_SPC_QUALIFIER_SHIFT, 0}} },
113
114 { DIK_UP, {{INPUTEVENT_KEY_CURSOR_UP, 0}} },
115 { DIK_DOWN, {{INPUTEVENT_KEY_CURSOR_DOWN, 0}} },
116 { DIK_LEFT, {{INPUTEVENT_KEY_CURSOR_LEFT, 0}} },
117 { DIK_RIGHT, {{INPUTEVENT_KEY_CURSOR_RIGHT, 0}} },
118
119 { DIK_INSERT, {{INPUTEVENT_KEY_AMIGA_LEFT, 0}} },
120 { DIK_DELETE, {{INPUTEVENT_KEY_DEL, 0}} },
121 { DIK_HOME, {{INPUTEVENT_KEY_AMIGA_RIGHT, 0}} },
122 { DIK_NEXT, {{INPUTEVENT_KEY_HELP, 0}} },
123 { DIK_PRIOR, {{INPUTEVENT_SPC_FREEZEBUTTON, 0}} },
124
125 { DIK_LBRACKET, {{INPUTEVENT_KEY_LEFTBRACKET, 0}} },
126 { DIK_RBRACKET, {{INPUTEVENT_KEY_RIGHTBRACKET, 0}} },
127 { DIK_SEMICOLON, {{INPUTEVENT_KEY_SEMICOLON, 0}} },
128 { DIK_APOSTROPHE, {{INPUTEVENT_KEY_SINGLEQUOTE, 0}} },
129 { DIK_GRAVE, {{INPUTEVENT_KEY_BACKQUOTE, 0}} },
130 { DIK_BACKSLASH, {{INPUTEVENT_KEY_BACKSLASH, 0}} },
131 { DIK_COMMA, {{INPUTEVENT_KEY_COMMA, 0}} },
132 { DIK_PERIOD, {{INPUTEVENT_KEY_PERIOD, 0}} },
133 { DIK_SLASH, {{INPUTEVENT_KEY_DIV, 0}} },
134 { DIK_OEM_102, {{INPUTEVENT_KEY_30, 0}} },
135 { DIK_SYSRQ, {{INPUTEVENT_SPC_SCREENSHOT_CLIPBOARD, 0}, {INPUTEVENT_SPC_SCREENSHOT, ID_FLAG_QUALIFIER_SPECIAL}} },
136
137 { DIK_END, {{INPUTEVENT_SPC_QUALIFIER_SPECIAL, 0}} },
138 { DIK_PAUSE, {{INPUTEVENT_SPC_PAUSE, 0}, {INPUTEVENT_SPC_WARP, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_IRQ7, ID_FLAG_QUALIFIER_SPECIAL | ID_FLAG_QUALIFIER_SHIFT}} },
139
140 { DIK_F12, {{INPUTEVENT_SPC_ENTERGUI, 0}, {INPUTEVENT_SPC_ENTERDEBUGGER, ID_FLAG_QUALIFIER_SPECIAL}, {INPUTEVENT_SPC_ENTERDEBUGGER, ID_FLAG_QUALIFIER_SHIFT}, {INPUTEVENT_SPC_TOGGLEDEFAULTSCREEN, ID_FLAG_QUALIFIER_CONTROL}} },
141
142 { DIK_MEDIASTOP, {{INPUTEVENT_KEY_CDTV_STOP, 0}} },
143 { DIK_PLAYPAUSE, {{INPUTEVENT_KEY_CDTV_PLAYPAUSE, 0}} },
144 { DIK_PREVTRACK, {{INPUTEVENT_KEY_CDTV_PREV, 0}} },
145 { DIK_NEXTTRACK, {{INPUTEVENT_KEY_CDTV_NEXT, 0}} },
146
147 { -1, {{0}} } };
148
149 static struct uae_input_device_kbr_default keytrans_pc1[] = { { DIK_ESCAPE, {{INPUTEVENT_KEY_ESC, 0}} },
150
151 { DIK_F1, {{INPUTEVENT_KEY_F1, 0}} },
152 { DIK_F2, {{INPUTEVENT_KEY_F2, 0}} },
153 { DIK_F3, {{INPUTEVENT_KEY_F3, 0}} },
154 { DIK_F4, {{INPUTEVENT_KEY_F4, 0}} },
155 { DIK_F5, {{INPUTEVENT_KEY_F5, 0}} },
156 { DIK_F6, {{INPUTEVENT_KEY_F6, 0}} },
157 { DIK_F7, {{INPUTEVENT_KEY_F7, 0}} },
158 { DIK_F8, {{INPUTEVENT_KEY_F8, 0}} },
159 { DIK_F9, {{INPUTEVENT_KEY_F9, 0}} },
160 { DIK_F10, {{INPUTEVENT_KEY_F10, 0}} },
161 { DIK_F11, {{INPUTEVENT_KEY_F11, 0}} },
162 { DIK_F12, {{INPUTEVENT_KEY_F12, 0}} },
163
164 { DIK_1, {{INPUTEVENT_KEY_1, 0}} },
165 { DIK_2, {{INPUTEVENT_KEY_2, 0}} },
166 { DIK_3, {{INPUTEVENT_KEY_3, 0}} },
167 { DIK_4, {{INPUTEVENT_KEY_4, 0}} },
168 { DIK_5, {{INPUTEVENT_KEY_5, 0}} },
169 { DIK_6, {{INPUTEVENT_KEY_6, 0}} },
170 { DIK_7, {{INPUTEVENT_KEY_7, 0}} },
171 { DIK_8, {{INPUTEVENT_KEY_8, 0}} },
172 { DIK_9, {{INPUTEVENT_KEY_9, 0}} },
173 { DIK_0, {{INPUTEVENT_KEY_0, 0}} },
174
175 { DIK_TAB, {{INPUTEVENT_KEY_TAB, 0}} },
176
177 { DIK_A, {{INPUTEVENT_KEY_A, 0}} },
178 { DIK_B, {{INPUTEVENT_KEY_B, 0}} },
179 { DIK_C, {{INPUTEVENT_KEY_C, 0}} },
180 { DIK_D, {{INPUTEVENT_KEY_D, 0}} },
181 { DIK_E, {{INPUTEVENT_KEY_E, 0}} },
182 { DIK_F, {{INPUTEVENT_KEY_F, 0}} },
183 { DIK_G, {{INPUTEVENT_KEY_G, 0}} },
184 { DIK_H, {{INPUTEVENT_KEY_H, 0}} },
185 { DIK_I, {{INPUTEVENT_KEY_I, 0}} },
186 { DIK_J, {{INPUTEVENT_KEY_J, 0}} },
187 { DIK_K, {{INPUTEVENT_KEY_K, 0}} },
188 { DIK_L, {{INPUTEVENT_KEY_L, 0}} },
189 { DIK_M, {{INPUTEVENT_KEY_M, 0}} },
190 { DIK_N, {{INPUTEVENT_KEY_N, 0}} },
191 { DIK_O, {{INPUTEVENT_KEY_O, 0}} },
192 { DIK_P, {{INPUTEVENT_KEY_P, 0}} },
193 { DIK_Q, {{INPUTEVENT_KEY_Q, 0}} },
194 { DIK_R, {{INPUTEVENT_KEY_R, 0}} },
195 { DIK_S, {{INPUTEVENT_KEY_S, 0}} },
196 { DIK_T, {{INPUTEVENT_KEY_T, 0}} },
197 { DIK_U, {{INPUTEVENT_KEY_U, 0}} },
198 { DIK_W, {{INPUTEVENT_KEY_W, 0}} },
199 { DIK_V, {{INPUTEVENT_KEY_V, 0}} },
200 { DIK_X, {{INPUTEVENT_KEY_X, 0}} },
201 { DIK_Y, {{INPUTEVENT_KEY_Y, 0}} },
202 { DIK_Z, {{INPUTEVENT_KEY_Z, 0}} },
203
204 { DIK_CAPITAL, {{INPUTEVENT_KEY_CAPS_LOCK, 0}} },
205
206 { DIK_NUMPAD1, {{INPUTEVENT_KEY_NP_1, 0}} },
207 { DIK_NUMPAD2, {{INPUTEVENT_KEY_NP_2, 0}} },
208 { DIK_NUMPAD3, {{INPUTEVENT_KEY_NP_3, 0}} },
209 { DIK_NUMPAD4, {{INPUTEVENT_KEY_NP_4, 0}} },
210 { DIK_NUMPAD5, {{INPUTEVENT_KEY_NP_5, 0}} },
211 { DIK_NUMPAD6, {{INPUTEVENT_KEY_NP_6, 0}} },
212 { DIK_NUMPAD7, {{INPUTEVENT_KEY_NP_7, 0}} },
213 { DIK_NUMPAD8, {{INPUTEVENT_KEY_NP_8, 0}} },
214 { DIK_NUMPAD9, {{INPUTEVENT_KEY_NP_9, 0}} },
215 { DIK_NUMPAD0, {{INPUTEVENT_KEY_NP_0, 0}} },
216 { DIK_DECIMAL, {{INPUTEVENT_KEY_NP_PERIOD, 0}} },
217 { DIK_ADD, {{INPUTEVENT_KEY_NP_ADD, 0}} },
218 { DIK_SUBTRACT, {{INPUTEVENT_KEY_NP_SUB, 0}} },
219 { DIK_MULTIPLY, {{INPUTEVENT_KEY_NP_MUL, 0}} },
220 { DIK_DIVIDE, {{INPUTEVENT_KEY_NP_DIV, 0}} },
221 { DIK_NUMPADENTER, {{INPUTEVENT_KEY_ENTER, 0}} },
222
223 { DIK_MINUS, {{INPUTEVENT_KEY_SUB, 0}} },
224 { DIK_EQUALS, {{INPUTEVENT_KEY_EQUALS, 0}} },
225 { DIK_BACK, {{INPUTEVENT_KEY_BACKSPACE, 0}} },
226 { DIK_RETURN, {{INPUTEVENT_KEY_RETURN, 0}} },
227 { DIK_SPACE, {{INPUTEVENT_KEY_SPACE, 0}} },
228
229 { DIK_LSHIFT, {{INPUTEVENT_KEY_SHIFT_LEFT, 0}} },
230 { DIK_LCONTROL, {{INPUTEVENT_KEY_CTRL, 0}} },
231 { DIK_LWIN, {{INPUTEVENT_KEY_AMIGA_LEFT, 0}} },
232 { DIK_LMENU, {{INPUTEVENT_KEY_ALT_LEFT, 0}} },
233 { DIK_RMENU, {{INPUTEVENT_KEY_ALT_RIGHT, 0}} },
234 { DIK_RWIN, {{INPUTEVENT_KEY_AMIGA_RIGHT, 0}} },
235 { DIK_APPS, {{INPUTEVENT_KEY_APPS, 0}} },
236 { DIK_RCONTROL, {{INPUTEVENT_KEY_CTRL, 0}} },
237 { DIK_RSHIFT, {{INPUTEVENT_KEY_SHIFT_RIGHT, 0}} },
238
239 { DIK_UP, {{INPUTEVENT_KEY_CURSOR_UP, 0}} },
240 { DIK_DOWN, {{INPUTEVENT_KEY_CURSOR_DOWN, 0}} },
241 { DIK_LEFT, {{INPUTEVENT_KEY_CURSOR_LEFT, 0}} },
242 { DIK_RIGHT, {{INPUTEVENT_KEY_CURSOR_RIGHT, 0}} },
243
244 { DIK_LBRACKET, {{INPUTEVENT_KEY_LEFTBRACKET, 0}} },
245 { DIK_RBRACKET, {{INPUTEVENT_KEY_RIGHTBRACKET, 0}} },
246 { DIK_SEMICOLON, {{INPUTEVENT_KEY_SEMICOLON, 0}} },
247 { DIK_APOSTROPHE, {{INPUTEVENT_KEY_SINGLEQUOTE, 0}} },
248 { DIK_GRAVE, {{INPUTEVENT_KEY_BACKQUOTE, 0}} },
249 { DIK_BACKSLASH, {{INPUTEVENT_KEY_2B, 0}} },
250 { DIK_COMMA, {{INPUTEVENT_KEY_COMMA, 0}} },
251 { DIK_PERIOD, {{INPUTEVENT_KEY_PERIOD, 0}} },
252 { DIK_SLASH, {{INPUTEVENT_KEY_DIV, 0}} },
253 { DIK_OEM_102, {{INPUTEVENT_KEY_30, 0}} },
254
255 { DIK_INSERT, {{INPUTEVENT_KEY_INSERT, 0}} },
256 { DIK_DELETE, {{INPUTEVENT_KEY_DEL, 0}} },
257 { DIK_HOME, {{INPUTEVENT_KEY_HOME, 0}} },
258 { DIK_END, {{INPUTEVENT_KEY_END, 0}} },
259 { DIK_PRIOR, {{INPUTEVENT_KEY_PAGEUP, 0}} },
260 { DIK_NEXT, {{INPUTEVENT_KEY_PAGEDOWN, 0}} },
261 { DIK_SCROLL, {{INPUTEVENT_KEY_HELP, 0}} },
262 { DIK_SYSRQ, {{INPUTEVENT_KEY_SYSRQ, 0}} },
263
264 { DIK_MEDIASTOP, {{INPUTEVENT_KEY_CDTV_STOP, 0}} },
265 { DIK_PLAYPAUSE, {{INPUTEVENT_KEY_CDTV_PLAYPAUSE, 0}} },
266 { DIK_PREVTRACK, {{INPUTEVENT_KEY_CDTV_PREV, 0}} },
267 { DIK_NEXTTRACK, {{INPUTEVENT_KEY_CDTV_NEXT, 0}} },
268
269 { -1, {{0, 0}} }
270 };
271
272 static struct uae_input_device_kbr_default *keytrans[] = {
273 keytrans_amiga,
274 keytrans_pc1,
275 keytrans_pc1
276 };
277
278 static int kb_np[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, -1, DIK_DECIMAL, -1, DIK_NUMPADENTER, -1, -1 };
279 static int kb_ck[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_RCONTROL, DIK_RMENU, -1, DIK_RSHIFT, -1, -1 };
280 static int kb_se[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, -1 };
281 static int kb_np3[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, -1, DIK_DECIMAL, -1, DIK_NUMPADENTER, -1, -1 };
282 static int kb_ck3[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_RCONTROL, -1, DIK_RSHIFT, -1, DIK_RMENU, -1, -1 };
283 static int kb_se3[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, DIK_LCONTROL, -1, -1 };
284
285 static int kb_cd32_np[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, -1, DIK_NUMPAD0, DIK_NUMPAD5, DIK_NUMPAD1, -1, DIK_DECIMAL, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 };
286 static int kb_cd32_ck[] = { DIK_LEFT, -1, DIK_RIGHT, -1, DIK_UP, -1, DIK_DOWN, -1, DIK_RCONTROL, -1, DIK_RMENU, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 };
287 static int kb_cd32_se[] = { DIK_A, -1, DIK_D, -1, DIK_W, -1, DIK_S, -1, -1, DIK_LMENU, -1, DIK_LSHIFT, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, DIK_DIVIDE, -1, DIK_SUBTRACT, -1, DIK_MULTIPLY, -1, -1 };
288
289 static int kb_cdtv[] = { DIK_NUMPAD1, -1, DIK_NUMPAD3, -1, DIK_NUMPAD7, -1, DIK_NUMPAD9, -1, -1 };
290
291 static int kb_xa1[] = { DIK_NUMPAD4, -1, DIK_NUMPAD6, -1, DIK_NUMPAD8, -1, DIK_NUMPAD2, DIK_NUMPAD5, -1, DIK_LCONTROL, -1, DIK_LMENU, -1, DIK_SPACE, -1, -1 };
292 static int kb_xa2[] = { DIK_D, -1, DIK_G, -1, DIK_R, -1, DIK_F, -1, DIK_A, -1, DIK_S, -1, DIK_Q, -1 };
293 static int kb_arcadia[] = { DIK_F2, -1, DIK_1, -1, DIK_2, -1, DIK_5, -1, DIK_6, -1, -1 };
294 static int kb_arcadiaxa[] = { DIK_1, -1, DIK_2, -1, DIK_3, -1, DIK_4, -1, DIK_6, -1, DIK_LBRACKET, DIK_LSHIFT, -1, DIK_RBRACKET, -1, DIK_C, -1, DIK_5, -1, DIK_Z, -1, DIK_X, -1, -1 };
295
296 static int *kbmaps[] = {
297 kb_np, kb_ck, kb_se, kb_np3, kb_ck3, kb_se3,
298 kb_cd32_np, kb_cd32_ck, kb_cd32_se,
299 kb_xa1, kb_xa2, kb_arcadia, kb_arcadiaxa, kb_cdtv
300 };
301
specialpressed(void)302 static int specialpressed (void)
303 {
304 return input_getqualifiers () & ID_FLAG_QUALIFIER_SPECIAL;
305 }
shiftpressed(void)306 static int shiftpressed (void)
307 {
308 return input_getqualifiers () & ID_FLAG_QUALIFIER_SHIFT;
309 }
310
311 /* REMOVEME:
312 */
313 #if 0
314 static int altpressed (void)
315 {
316 return input_getqualifiers () & ID_FLAG_QUALIFIER_ALT;
317 }
318 #endif
319
ctrlpressed(void)320 static int ctrlpressed (void)
321 {
322 return input_getqualifiers () & ID_FLAG_QUALIFIER_CONTROL;
323 }
324
325 static int capslockstate;
326 static int host_capslockstate, host_numlockstate, host_scrolllockstate;
327
328 /*int getcapslockstate (void)
329 {
330 return capslockstate;
331 }
332 void setcapslockstate (int state)
333 {
334 capslockstate = state;
335 }*/
336
getcapslock(void)337 int getcapslock (void)
338 {
339 int capstable[7];
340
341 // this returns bogus state if caps change when in exclusive mode..
342 host_capslockstate = 0; //GetKeyState (VK_CAPITAL) & 1;
343 host_numlockstate = 0; //GetKeyState (VK_NUMLOCK) & 1;
344 host_scrolllockstate = 0; //GetKeyState (VK_SCROLL) & 1;
345 capstable[0] = DIK_CAPITAL;
346 capstable[1] = host_capslockstate;
347 capstable[2] = DIK_NUMLOCK;
348 capstable[3] = host_numlockstate;
349 capstable[4] = DIK_SCROLL;
350 capstable[5] = host_scrolllockstate;
351 capstable[6] = 0;
352 capslockstate = inputdevice_synccapslock (capslockstate, capstable);
353 return capslockstate;
354 }
355
clearallkeys(void)356 void clearallkeys (void)
357 {
358 inputdevice_updateconfig (&changed_prefs, &currprefs);
359 }
360
361 static const int np[] = {
362 DIK_NUMPAD0, 0, DIK_NUMPADPERIOD, 0, DIK_NUMPAD1, 1, DIK_NUMPAD2, 2,
363 DIK_NUMPAD3, 3, DIK_NUMPAD4, 4, DIK_NUMPAD5, 5, DIK_NUMPAD6, 6, DIK_NUMPAD7, 7,
364 DIK_NUMPAD8, 8, DIK_NUMPAD9, 9, -1 };
365
my_kbd_handler(int keyboard,int scancode,int newstate)366 void my_kbd_handler (int keyboard, int scancode, int newstate)
367 {
368 int code = 0;
369 int scancode_new;
370 int defaultguikey;
371 bool amode = currprefs.input_keyboard_type == 0;
372 bool special = false;
373 static int swapperdrive = 0;
374
375 scancode_new = scancode;
376 if (!specialpressed () && inputdevice_iskeymapped (keyboard, scancode))
377 scancode = 0;
378
379 defaultguikey = amode ? DIK_F12 : DIK_NUMLOCK;
380
381 if (newstate && code == 0 && amode) {
382
383 switch (scancode)
384 {
385 case DIK_1:
386 case DIK_2:
387 case DIK_3:
388 case DIK_4:
389 case DIK_5:
390 case DIK_6:
391 case DIK_7:
392 case DIK_8:
393 case DIK_9:
394 case DIK_0:
395 if (specialpressed ()) {
396 int num = scancode - DIK_1;
397 if (shiftpressed ())
398 num += 10;
399 if (ctrlpressed ()) {
400 swapperdrive = num;
401 if (swapperdrive > 3)
402 swapperdrive = 0;
403 } else {
404 int i;
405 for (i = 0; i < 4; i++) {
406 if (!_tcscmp (currprefs.floppyslots[i].df, currprefs.dfxlist[num]))
407 changed_prefs.floppyslots[i].df[0] = 0;
408 }
409 _tcscpy (changed_prefs.floppyslots[swapperdrive].df, currprefs.dfxlist[num]);
410 config_changed = 1;
411 }
412 special = true;
413 }
414 break;
415 case DIK_NUMPAD0:
416 case DIK_NUMPAD1:
417 case DIK_NUMPAD2:
418 case DIK_NUMPAD3:
419 case DIK_NUMPAD4:
420 case DIK_NUMPAD5:
421 case DIK_NUMPAD6:
422 case DIK_NUMPAD7:
423 case DIK_NUMPAD8:
424 case DIK_NUMPAD9:
425 case DIK_NUMPADPERIOD:
426 if (specialpressed ()) {
427 int i = 0, v = -1;
428 while (np[i] >= 0) {
429 v = np[i + 1];
430 if (np[i] == scancode)
431 break;
432 i += 2;
433 }
434 if (v >= 0)
435 code = AKS_STATESAVEQUICK + v * 2 + ((shiftpressed () || ctrlpressed ()) ? 0 : 1);
436 }
437 break;
438 }
439 }
440
441 if (code) {
442 inputdevice_add_inputcode (code, 1);
443 return;
444 }
445
446 scancode = scancode_new;
447 if (!specialpressed () && newstate) {
448 if (scancode == DIK_CAPITAL) {
449 host_capslockstate = host_capslockstate ? 0 : 1;
450 capslockstate = host_capslockstate;
451 }
452 if (scancode == DIK_NUMLOCK) {
453 host_numlockstate = host_numlockstate ? 0 : 1;
454 capslockstate = host_numlockstate;
455 }
456 if (scancode == DIK_SCROLL) {
457 host_scrolllockstate = host_scrolllockstate ? 0 : 1;
458 capslockstate = host_scrolllockstate;
459 }
460 }
461
462 if (special) {
463 inputdevice_checkqualifierkeycode (keyboard, scancode, newstate);
464 return;
465 }
466
467 // write_log ("KBDHANDLER_2: kbd2= %d, scancode= %d (0x%02x), state= %d\n", keyboard, scancode, scancode, newstate);
468
469 inputdevice_translatekeycode (keyboard, scancode, newstate);
470 }
471
keyboard_settrans(void)472 void keyboard_settrans (void)
473 {
474 inputdevice_setkeytranslation (keytrans, kbmaps);
475 }
476
477 /*int target_checkcapslock (int scancode, int *state)
478 {
479 if (scancode != DIK_CAPITAL && scancode != DIK_NUMLOCK && scancode != DIK_SCROLL)
480 return 0;
481 if (*state == 0)
482 return -1;
483 if (scancode == DIK_CAPITAL)
484 *state = host_capslockstate;
485 if (scancode == DIK_NUMLOCK)
486 *state = host_numlockstate;
487 if (scancode == DIK_SCROLL)
488 *state = host_scrolllockstate;
489 return 1;
490 }*/
491
492