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