1 /* RetroArch - A frontend for libretro.
2 * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
3 * Copyright (C) 2011-2017 - Daniel De Matteis
4 * Copyright (C) 2020 - neil4 (reverse LUT keyboard)
5 *
6 * RetroArch is free software: you can redistribute it and/or modify it under the terms
7 * of the GNU General Public License as published by the Free Software Found-
8 * ation, either version 3 of the License, or (at your option) any later version.
9 *
10 * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 * PURPOSE. See the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along with RetroArch.
15 * If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include <string.h>
19 #include <stdlib.h>
20 #include <ctype.h>
21
22 #include <compat/strl.h>
23 #include <retro_assert.h>
24 #include <retro_miscellaneous.h>
25
26 #ifdef HAVE_CONFIG_H
27 #include "../config.h"
28 #endif
29
30 #include "../config.def.h"
31
32 #ifdef ANDROID
33 #include <android/keycodes.h>
34 #include "drivers_keyboard/keyboard_event_android.h"
35 #endif
36
37 #ifdef DJGPP
38 #include "drivers_keyboard/keyboard_event_dos.h"
39 #endif
40
41 #ifdef __QNX__
42 #include <sys/keycodes.h>
43 #endif
44
45 #ifdef __PSL1GHT__
46 #include <io/kb.h>
47 #endif
48
49 #if defined(HAVE_SDL) || defined(HAVE_SDL2)
50 #include "SDL.h"
51 #endif
52
53 #if defined(__linux__) || defined(HAVE_WAYLAND)
54 #if defined(__linux__)
55 #include <linux/input.h>
56 #include <linux/kd.h>
57 #elif defined(__DragonFly__)
58 #include <dev/misc/evdev/input.h>
59 #elif defined(__FreeBSD__)
60 #include <dev/evdev/input.h>
61 #endif
62 #endif
63
64 #ifdef HAVE_X11
65 #include "input/include/xfree86_keycodes.h"
66 #endif
67
68 #ifdef HAVE_DINPUT
69 #undef DIRECTINPUT_VERSION
70 #define DIRECTINPUT_VERSION 0x0800
71
72 #include <dinput.h>
73 #endif
74
75 #include "input_keymaps.h"
76
77 #ifdef __APPLE__
78 #include "drivers_keyboard/keyboard_event_apple.h"
79 #endif
80
81 const struct input_key_map input_config_key_map[] = {
82 { "left", RETROK_LEFT },
83 { "right", RETROK_RIGHT },
84 { "up", RETROK_UP },
85 { "down", RETROK_DOWN },
86 { "enter", RETROK_RETURN },
87 { "kp_enter", RETROK_KP_ENTER },
88 { "tab", RETROK_TAB },
89 { "insert", RETROK_INSERT },
90 { "del", RETROK_DELETE },
91 { "end", RETROK_END },
92 { "home", RETROK_HOME },
93 { "rshift", RETROK_RSHIFT },
94 { "shift", RETROK_LSHIFT },
95 { "ctrl", RETROK_LCTRL },
96 { "alt", RETROK_LALT },
97 { "space", RETROK_SPACE },
98 { "escape", RETROK_ESCAPE },
99 { "add", RETROK_KP_PLUS },
100 { "subtract", RETROK_KP_MINUS },
101 { "kp_plus", RETROK_KP_PLUS },
102 { "kp_minus", RETROK_KP_MINUS },
103 { "f1", RETROK_F1 },
104 { "f2", RETROK_F2 },
105 { "f3", RETROK_F3 },
106 { "f4", RETROK_F4 },
107 { "f5", RETROK_F5 },
108 { "f6", RETROK_F6 },
109 { "f7", RETROK_F7 },
110 { "f8", RETROK_F8 },
111 { "f9", RETROK_F9 },
112 { "f10", RETROK_F10 },
113 { "f11", RETROK_F11 },
114 { "f12", RETROK_F12 },
115 { "num0", RETROK_0 },
116 { "num1", RETROK_1 },
117 { "num2", RETROK_2 },
118 { "num3", RETROK_3 },
119 { "num4", RETROK_4 },
120 { "num5", RETROK_5 },
121 { "num6", RETROK_6 },
122 { "num7", RETROK_7 },
123 { "num8", RETROK_8 },
124 { "num9", RETROK_9 },
125 { "pageup", RETROK_PAGEUP },
126 { "pagedown", RETROK_PAGEDOWN },
127 { "keypad0", RETROK_KP0 },
128 { "keypad1", RETROK_KP1 },
129 { "keypad2", RETROK_KP2 },
130 { "keypad3", RETROK_KP3 },
131 { "keypad4", RETROK_KP4 },
132 { "keypad5", RETROK_KP5 },
133 { "keypad6", RETROK_KP6 },
134 { "keypad7", RETROK_KP7 },
135 { "keypad8", RETROK_KP8 },
136 { "keypad9", RETROK_KP9 },
137 { "period", RETROK_PERIOD },
138 { "capslock", RETROK_CAPSLOCK },
139 { "numlock", RETROK_NUMLOCK },
140 { "backspace", RETROK_BACKSPACE },
141 { "multiply", RETROK_KP_MULTIPLY },
142 { "divide", RETROK_KP_DIVIDE },
143 { "print_screen", RETROK_PRINT },
144 { "scroll_lock", RETROK_SCROLLOCK },
145 { "tilde", RETROK_BACKQUOTE },
146 { "backquote", RETROK_BACKQUOTE },
147 { "pause", RETROK_PAUSE },
148
149 /* Keys that weren't mappable before */
150 { "quote", RETROK_QUOTE },
151 { "comma", RETROK_COMMA },
152 { "minus", RETROK_MINUS },
153 { "slash", RETROK_SLASH },
154 { "semicolon", RETROK_SEMICOLON },
155 { "equals", RETROK_EQUALS },
156 { "leftbracket", RETROK_LEFTBRACKET },
157 { "backslash", RETROK_BACKSLASH },
158 { "rightbracket", RETROK_RIGHTBRACKET },
159 { "kp_period", RETROK_KP_PERIOD },
160 { "kp_equals", RETROK_KP_EQUALS },
161 { "rctrl", RETROK_RCTRL },
162 { "ralt", RETROK_RALT },
163
164 /* Keys not referenced in any keyboard mapping
165 * (except perhaps rarch_key_map_apple_hid) */
166 { "caret", RETROK_CARET },
167 { "underscore", RETROK_UNDERSCORE },
168 { "exclaim", RETROK_EXCLAIM },
169 { "quotedbl", RETROK_QUOTEDBL },
170 { "hash", RETROK_HASH },
171 { "dollar", RETROK_DOLLAR },
172 { "ampersand", RETROK_AMPERSAND },
173 { "leftparen", RETROK_LEFTPAREN },
174 { "rightparen", RETROK_RIGHTPAREN },
175 { "asterisk", RETROK_ASTERISK },
176 { "plus", RETROK_PLUS },
177 { "colon", RETROK_COLON },
178 { "less", RETROK_LESS },
179 { "greater", RETROK_GREATER },
180 { "question", RETROK_QUESTION },
181 { "at", RETROK_AT },
182
183 { "f13", RETROK_F13 },
184 { "f14", RETROK_F14 },
185 { "f15", RETROK_F15 },
186
187 { "rmeta", RETROK_RMETA },
188 { "lmeta", RETROK_LMETA },
189 { "lsuper", RETROK_LSUPER },
190 { "rsuper", RETROK_RSUPER },
191 { "mode", RETROK_MODE },
192 { "compose", RETROK_COMPOSE },
193
194 { "help", RETROK_HELP },
195 { "sysreq", RETROK_SYSREQ },
196 { "break", RETROK_BREAK },
197 { "menu", RETROK_MENU },
198 { "power", RETROK_POWER },
199 { "euro", RETROK_EURO },
200 { "undo", RETROK_UNDO },
201 { "clear", RETROK_CLEAR },
202 { "oem102", RETROK_OEM_102 },
203
204 { "nul", RETROK_UNKNOWN },
205 { NULL, RETROK_UNKNOWN },
206 };
207
208 #ifdef HAVE_LIBNX
209 const struct rarch_key_map rarch_key_map_switch[] = {
210 { HidKeyboardKey_A, RETROK_a },
211 { HidKeyboardKey_B, RETROK_b },
212 { HidKeyboardKey_C, RETROK_c },
213 { HidKeyboardKey_D, RETROK_d },
214 { HidKeyboardKey_E, RETROK_e },
215 { HidKeyboardKey_F, RETROK_f },
216 { HidKeyboardKey_G, RETROK_g },
217 { HidKeyboardKey_H, RETROK_h },
218 { HidKeyboardKey_I, RETROK_i },
219 { HidKeyboardKey_J, RETROK_j },
220 { HidKeyboardKey_K, RETROK_k },
221 { HidKeyboardKey_L, RETROK_l },
222 { HidKeyboardKey_M, RETROK_m },
223 { HidKeyboardKey_N, RETROK_n },
224 { HidKeyboardKey_O, RETROK_o },
225 { HidKeyboardKey_P, RETROK_p },
226 { HidKeyboardKey_Q, RETROK_q },
227 { HidKeyboardKey_R, RETROK_r },
228 { HidKeyboardKey_S, RETROK_s },
229 { HidKeyboardKey_T, RETROK_t },
230 { HidKeyboardKey_U, RETROK_u },
231 { HidKeyboardKey_V, RETROK_v },
232 { HidKeyboardKey_W, RETROK_w },
233 { HidKeyboardKey_X, RETROK_x },
234 { HidKeyboardKey_Y, RETROK_y },
235 { HidKeyboardKey_Z, RETROK_z },
236 { HidKeyboardKey_Backspace, RETROK_BACKSPACE },
237 { HidKeyboardKey_Tab, RETROK_TAB },
238 { HidKeyboardKey_Return, RETROK_RETURN },
239 { HidKeyboardKey_Pause, RETROK_PAUSE },
240 { HidKeyboardKey_Escape, RETROK_ESCAPE },
241 { HidKeyboardKey_Space, RETROK_SPACE },
242 { HidKeyboardKey_Tilde, RETROK_HASH },
243 { HidKeyboardKey_Quote, RETROK_QUOTE },
244 { HidKeyboardKey_Comma, RETROK_COMMA },
245 { HidKeyboardKey_Minus, RETROK_MINUS },
246 { HidKeyboardKey_Period, RETROK_PERIOD },
247 { HidKeyboardKey_Slash, RETROK_SLASH },
248 { HidKeyboardKey_D0, RETROK_0 },
249 { HidKeyboardKey_D1, RETROK_1 },
250 { HidKeyboardKey_D2, RETROK_2 },
251 { HidKeyboardKey_D3, RETROK_3 },
252 { HidKeyboardKey_D4, RETROK_4 },
253 { HidKeyboardKey_D5, RETROK_5 },
254 { HidKeyboardKey_D6, RETROK_6 },
255 { HidKeyboardKey_D7, RETROK_7 },
256 { HidKeyboardKey_D8, RETROK_8 },
257 { HidKeyboardKey_D9, RETROK_9 },
258 { HidKeyboardKey_Semicolon, RETROK_SEMICOLON },
259 { HidKeyboardKey_Plus, RETROK_EQUALS },
260 { HidKeyboardKey_OpenBracket, RETROK_LEFTBRACKET },
261 { HidKeyboardKey_Pipe, RETROK_BACKSLASH },
262 { HidKeyboardKey_CloseBracket, RETROK_RIGHTBRACKET },
263 { HidKeyboardKey_Delete, RETROK_DELETE },
264 { HidKeyboardKey_NumPad0, RETROK_KP0 },
265 { HidKeyboardKey_NumPad1, RETROK_KP1 },
266 { HidKeyboardKey_NumPad2, RETROK_KP2 },
267 { HidKeyboardKey_NumPad3, RETROK_KP3 },
268 { HidKeyboardKey_NumPad4, RETROK_KP4 },
269 { HidKeyboardKey_NumPad5, RETROK_KP5 },
270 { HidKeyboardKey_NumPad6, RETROK_KP6 },
271 { HidKeyboardKey_NumPad7, RETROK_KP7 },
272 { HidKeyboardKey_NumPad8, RETROK_KP8 },
273 { HidKeyboardKey_NumPad9, RETROK_KP9 },
274 { HidKeyboardKey_NumPadDot, RETROK_KP_PERIOD },
275 { HidKeyboardKey_NumPadDivide, RETROK_KP_DIVIDE },
276 { HidKeyboardKey_NumPadMultiply, RETROK_KP_MULTIPLY },
277 { HidKeyboardKey_NumPadSubtract, RETROK_KP_MINUS },
278 { HidKeyboardKey_NumPadAdd, RETROK_KP_PLUS },
279 { HidKeyboardKey_NumPadEnter, RETROK_KP_ENTER },
280 { HidKeyboardKey_NumPadEquals, RETROK_KP_EQUALS },
281 { HidKeyboardKey_UpArrow, RETROK_UP },
282 { HidKeyboardKey_DownArrow, RETROK_DOWN },
283 { HidKeyboardKey_RightArrow, RETROK_RIGHT },
284 { HidKeyboardKey_LeftArrow, RETROK_LEFT },
285 { HidKeyboardKey_Insert, RETROK_INSERT },
286 { HidKeyboardKey_Home, RETROK_HOME },
287 { HidKeyboardKey_End, RETROK_END },
288 { HidKeyboardKey_PageUp, RETROK_PAGEUP },
289 { HidKeyboardKey_PageDown, RETROK_PAGEDOWN },
290 { HidKeyboardKey_F1, RETROK_F1 },
291 { HidKeyboardKey_F2, RETROK_F2 },
292 { HidKeyboardKey_F3, RETROK_F3 },
293 { HidKeyboardKey_F4, RETROK_F4 },
294 { HidKeyboardKey_F5, RETROK_F5 },
295 { HidKeyboardKey_F6, RETROK_F6 },
296 { HidKeyboardKey_F7, RETROK_F7 },
297 { HidKeyboardKey_F8, RETROK_F8 },
298 { HidKeyboardKey_F9, RETROK_F9 },
299 { HidKeyboardKey_F10, RETROK_F10 },
300 { HidKeyboardKey_F11, RETROK_F11 },
301 { HidKeyboardKey_F12, RETROK_F12 },
302 { HidKeyboardKey_F13, RETROK_F13 },
303 { HidKeyboardKey_F14, RETROK_F14 },
304 { HidKeyboardKey_F15, RETROK_F15 },
305 { HidKeyboardKey_NumLock, RETROK_NUMLOCK },
306 { HidKeyboardKey_CapsLock, RETROK_CAPSLOCK },
307 { HidKeyboardKey_ScrollLock, RETROK_SCROLLOCK },
308 { HidKeyboardKey_RightShift, RETROK_RSHIFT },
309 { HidKeyboardKey_LeftShift, RETROK_LSHIFT },
310 { HidKeyboardKey_RightControl, RETROK_RCTRL },
311 { HidKeyboardKey_LeftControl, RETROK_LCTRL },
312 { HidKeyboardKey_RightAlt, RETROK_RALT },
313 { HidKeyboardKey_LeftAlt, RETROK_LALT },
314 { HidKeyboardKey_LeftGui, RETROK_LMETA },
315 { HidKeyboardKey_RightGui, RETROK_RMETA },
316 { HidKeyboardKey_Application, RETROK_COMPOSE },
317 { HidKeyboardKey_Pause, RETROK_BREAK },
318 { HidKeyboardKey_Power, RETROK_POWER },
319 { 0, RETROK_UNKNOWN }
320 };
321 #endif
322
323 #ifdef VITA
324 /* Vita scancodes are identical to USB 2.0 standard, e.g. SDL2 */
325 const struct rarch_key_map rarch_key_map_vita[] = {
326 { 0x02A, RETROK_BACKSPACE },
327 { 0x02B, RETROK_TAB },
328 { 0x09C, RETROK_CLEAR },
329 { 0x028, RETROK_RETURN },
330 { 0x048, RETROK_PAUSE },
331 { 0x029, RETROK_ESCAPE },
332 { 0x02C, RETROK_SPACE },
333 /*{ ?, RETROK_EXCLAIM },*/
334 /*{ ?, RETROK_QUOTEDBL },*/
335 /*{ ?, RETROK_HASH },*/
336 /*{ ?, RETROK_DOLLAR },*/
337 /*{ ?, RETROK_AMPERSAND },*/
338 { 0x034, RETROK_QUOTE },
339 /*{ ?, RETROK_LEFTPAREN },*/
340 /*{ ?, RETROK_RIGHTPAREN },*/
341 /*{ ?, RETROK_ASTERISK },*/
342 /*{ ?, RETROK_PLUS },*/
343 { 0x036, RETROK_COMMA },
344 { 0x02D, RETROK_MINUS },
345 { 0x037, RETROK_PERIOD },
346 { 0x038, RETROK_SLASH },
347 { 0x027, RETROK_0 },
348 { 0x01E, RETROK_1 },
349 { 0x01F, RETROK_2 },
350 { 0x020, RETROK_3 },
351 { 0x021, RETROK_4 },
352 { 0x022, RETROK_5 },
353 { 0x023, RETROK_6 },
354 { 0x024, RETROK_7 },
355 { 0x025, RETROK_8 },
356 { 0x026, RETROK_9 },
357 /*{ ?, RETROK_COLON },*/
358 { 0x033, RETROK_SEMICOLON },
359 /*{ ?, RETROK_OEM_102 },*/
360 { 0x02E, RETROK_EQUALS },
361 /*{ ?, RETROK_GREATER },*/
362 /*{ ?, RETROK_QUESTION },*/
363 /*{ ?, RETROK_AT },*/
364 { 0x02F, RETROK_LEFTBRACKET },
365 { 0x031, RETROK_BACKSLASH },
366 { 0x030, RETROK_RIGHTBRACKET },
367 /*{ ?, RETROK_CARET },*/
368 /*{ ?, RETROK_UNDERSCORE },*/
369 { 0x035, RETROK_BACKQUOTE },
370 { 0x004, RETROK_a },
371 { 0x005, RETROK_b },
372 { 0x006, RETROK_c },
373 { 0x007, RETROK_d },
374 { 0x008, RETROK_e },
375 { 0x009, RETROK_f },
376 { 0x00A, RETROK_g },
377 { 0x00B, RETROK_h },
378 { 0x00C, RETROK_i },
379 { 0x00D, RETROK_j },
380 { 0x00E, RETROK_k },
381 { 0x00F, RETROK_l },
382 { 0x010, RETROK_m },
383 { 0x011, RETROK_n },
384 { 0x012, RETROK_o },
385 { 0x013, RETROK_p },
386 { 0x014, RETROK_q },
387 { 0x015, RETROK_r },
388 { 0x016, RETROK_s },
389 { 0x017, RETROK_t },
390 { 0x018, RETROK_u },
391 { 0x019, RETROK_v },
392 { 0x01A, RETROK_w },
393 { 0x01B, RETROK_x },
394 { 0x01C, RETROK_y },
395 { 0x01D, RETROK_z },
396 { 0x04C, RETROK_DELETE },
397 { 0x062, RETROK_KP0 },
398 { 0x059, RETROK_KP1 },
399 { 0x05A, RETROK_KP2 },
400 { 0x05B, RETROK_KP3 },
401 { 0x05C, RETROK_KP4 },
402 { 0x05D, RETROK_KP5 },
403 { 0x05E, RETROK_KP6 },
404 { 0x05F, RETROK_KP7 },
405 { 0x060, RETROK_KP8 },
406 { 0x061, RETROK_KP9 },
407 { 0x063, RETROK_KP_PERIOD },
408 { 0x054, RETROK_KP_DIVIDE },
409 { 0x055, RETROK_KP_MULTIPLY },
410 { 0x056, RETROK_KP_MINUS },
411 { 0x057, RETROK_KP_PLUS },
412 { 0x058, RETROK_KP_ENTER },
413 { 0x067, RETROK_KP_EQUALS },
414 { 0x052, RETROK_UP },
415 { 0x051, RETROK_DOWN },
416 { 0x04F, RETROK_RIGHT },
417 { 0x050, RETROK_LEFT },
418 { 0x049, RETROK_INSERT },
419 { 0x04A, RETROK_HOME },
420 { 0x04D, RETROK_END },
421 { 0x04B, RETROK_PAGEUP },
422 { 0x04E, RETROK_PAGEDOWN },
423 { 0x03A, RETROK_F1 },
424 { 0x03B, RETROK_F2 },
425 { 0x03C, RETROK_F3 },
426 { 0x03D, RETROK_F4 },
427 { 0x03E, RETROK_F5 },
428 { 0x03F, RETROK_F6 },
429 { 0x040, RETROK_F7 },
430 { 0x041, RETROK_F8 },
431 { 0x042, RETROK_F9 },
432 { 0x043, RETROK_F10 },
433 { 0x044, RETROK_F11 },
434 { 0x045, RETROK_F12 },
435 { 0x068, RETROK_F13 },
436 { 0x069, RETROK_F14 },
437 { 0x06A, RETROK_F15 },
438 { 0x053, RETROK_NUMLOCK },
439 { 0x039, RETROK_CAPSLOCK },
440 { 0x047, RETROK_SCROLLOCK },
441 { 0x0E5, RETROK_RSHIFT },
442 { 0x0E1, RETROK_LSHIFT },
443 { 0x0E4, RETROK_RCTRL },
444 { 0x0E0, RETROK_LCTRL },
445 { 0x0E6, RETROK_RALT },
446 { 0x0E2, RETROK_LALT },
447 /* { ?, RETROK_RMETA }, */
448 /* { ?, RETROK_LMETA }, */
449 { 0x0E3, RETROK_LSUPER },
450 { 0x0E7, RETROK_RSUPER },
451 /* { ?, RETROK_MODE },*/
452 { 0x075, RETROK_HELP },
453 { 0x046, RETROK_PRINT },
454 { 0x09A, RETROK_SYSREQ },
455 { 0x048, RETROK_BREAK },
456 { 0x076, RETROK_MENU },
457 { 0x066, RETROK_POWER },
458 /*{ ?, RETROK_EURO },*/
459 { 0x07A, RETROK_UNDO },
460 { 0, RETROK_UNKNOWN },
461 };
462 #endif
463
464 #if defined(HAVE_SDL) || defined(HAVE_SDL2)
465 const struct rarch_key_map rarch_key_map_sdl[] = {
466 { SDLK_BACKSPACE, RETROK_BACKSPACE },
467 { SDLK_TAB, RETROK_TAB },
468 { SDLK_CLEAR, RETROK_CLEAR },
469 { SDLK_RETURN, RETROK_RETURN },
470 { SDLK_PAUSE, RETROK_PAUSE },
471 { SDLK_ESCAPE, RETROK_ESCAPE },
472 { SDLK_SPACE, RETROK_SPACE },
473 { SDLK_EXCLAIM, RETROK_EXCLAIM },
474 { SDLK_QUOTEDBL, RETROK_QUOTEDBL },
475 { SDLK_HASH, RETROK_HASH },
476 { SDLK_DOLLAR, RETROK_DOLLAR },
477 { SDLK_AMPERSAND, RETROK_AMPERSAND },
478 { SDLK_QUOTE, RETROK_QUOTE },
479 { SDLK_LEFTPAREN, RETROK_LEFTPAREN },
480 { SDLK_RIGHTPAREN, RETROK_RIGHTPAREN },
481 { SDLK_ASTERISK, RETROK_ASTERISK },
482 { SDLK_PLUS, RETROK_PLUS },
483 { SDLK_COMMA, RETROK_COMMA },
484 { SDLK_MINUS, RETROK_MINUS },
485 { SDLK_PERIOD, RETROK_PERIOD },
486 { SDLK_SLASH, RETROK_SLASH },
487 { SDLK_0, RETROK_0 },
488 { SDLK_1, RETROK_1 },
489 { SDLK_2, RETROK_2 },
490 { SDLK_3, RETROK_3 },
491 { SDLK_4, RETROK_4 },
492 { SDLK_5, RETROK_5 },
493 { SDLK_6, RETROK_6 },
494 { SDLK_7, RETROK_7 },
495 { SDLK_8, RETROK_8 },
496 { SDLK_9, RETROK_9 },
497 { SDLK_COLON, RETROK_COLON },
498 { SDLK_SEMICOLON, RETROK_SEMICOLON },
499 { SDLK_LESS, RETROK_OEM_102 },
500 { SDLK_EQUALS, RETROK_EQUALS },
501 { SDLK_GREATER, RETROK_GREATER },
502 { SDLK_QUESTION, RETROK_QUESTION },
503 { SDLK_AT, RETROK_AT },
504 { SDLK_LEFTBRACKET, RETROK_LEFTBRACKET },
505 { SDLK_BACKSLASH, RETROK_BACKSLASH },
506 { SDLK_RIGHTBRACKET, RETROK_RIGHTBRACKET },
507 { SDLK_CARET, RETROK_CARET },
508 { SDLK_UNDERSCORE, RETROK_UNDERSCORE },
509 { SDLK_BACKQUOTE, RETROK_BACKQUOTE },
510 { SDLK_a, RETROK_a },
511 { SDLK_b, RETROK_b },
512 { SDLK_c, RETROK_c },
513 { SDLK_d, RETROK_d },
514 { SDLK_e, RETROK_e },
515 { SDLK_f, RETROK_f },
516 { SDLK_g, RETROK_g },
517 { SDLK_h, RETROK_h },
518 { SDLK_i, RETROK_i },
519 { SDLK_j, RETROK_j },
520 { SDLK_k, RETROK_k },
521 { SDLK_l, RETROK_l },
522 { SDLK_m, RETROK_m },
523 { SDLK_n, RETROK_n },
524 { SDLK_o, RETROK_o },
525 { SDLK_p, RETROK_p },
526 { SDLK_q, RETROK_q },
527 { SDLK_r, RETROK_r },
528 { SDLK_s, RETROK_s },
529 { SDLK_t, RETROK_t },
530 { SDLK_u, RETROK_u },
531 { SDLK_v, RETROK_v },
532 { SDLK_w, RETROK_w },
533 { SDLK_x, RETROK_x },
534 { SDLK_y, RETROK_y },
535 { SDLK_z, RETROK_z },
536 { SDLK_DELETE, RETROK_DELETE },
537 #ifdef HAVE_SDL2
538 { SDLK_KP_0, RETROK_KP0 },
539 { SDLK_KP_1, RETROK_KP1 },
540 { SDLK_KP_2, RETROK_KP2 },
541 { SDLK_KP_3, RETROK_KP3 },
542 { SDLK_KP_4, RETROK_KP4 },
543 { SDLK_KP_5, RETROK_KP5 },
544 { SDLK_KP_6, RETROK_KP6 },
545 { SDLK_KP_7, RETROK_KP7 },
546 { SDLK_KP_8, RETROK_KP8 },
547 { SDLK_KP_9, RETROK_KP9 },
548 #else
549 { SDLK_KP0, RETROK_KP0 },
550 { SDLK_KP1, RETROK_KP1 },
551 { SDLK_KP2, RETROK_KP2 },
552 { SDLK_KP3, RETROK_KP3 },
553 { SDLK_KP4, RETROK_KP4 },
554 { SDLK_KP5, RETROK_KP5 },
555 { SDLK_KP6, RETROK_KP6 },
556 { SDLK_KP7, RETROK_KP7 },
557 { SDLK_KP8, RETROK_KP8 },
558 { SDLK_KP9, RETROK_KP9 },
559 #endif
560 { SDLK_KP_PERIOD, RETROK_KP_PERIOD },
561 { SDLK_KP_DIVIDE, RETROK_KP_DIVIDE },
562 { SDLK_KP_MULTIPLY, RETROK_KP_MULTIPLY },
563 { SDLK_KP_MINUS, RETROK_KP_MINUS },
564 { SDLK_KP_PLUS, RETROK_KP_PLUS },
565 { SDLK_KP_ENTER, RETROK_KP_ENTER },
566 { SDLK_KP_EQUALS, RETROK_KP_EQUALS },
567 { SDLK_UP, RETROK_UP },
568 { SDLK_DOWN, RETROK_DOWN },
569 { SDLK_RIGHT, RETROK_RIGHT },
570 { SDLK_LEFT, RETROK_LEFT },
571 { SDLK_INSERT, RETROK_INSERT },
572 { SDLK_HOME, RETROK_HOME },
573 { SDLK_END, RETROK_END },
574 { SDLK_PAGEUP, RETROK_PAGEUP },
575 { SDLK_PAGEDOWN, RETROK_PAGEDOWN },
576 { SDLK_F1, RETROK_F1 },
577 { SDLK_F2, RETROK_F2 },
578 { SDLK_F3, RETROK_F3 },
579 { SDLK_F4, RETROK_F4 },
580 { SDLK_F5, RETROK_F5 },
581 { SDLK_F6, RETROK_F6 },
582 { SDLK_F7, RETROK_F7 },
583 { SDLK_F8, RETROK_F8 },
584 { SDLK_F9, RETROK_F9 },
585 { SDLK_F10, RETROK_F10 },
586 { SDLK_F11, RETROK_F11 },
587 { SDLK_F12, RETROK_F12 },
588 { SDLK_F13, RETROK_F13 },
589 { SDLK_F14, RETROK_F14 },
590 { SDLK_F15, RETROK_F15 },
591 #ifdef HAVE_SDL2
592 { SDLK_NUMLOCKCLEAR, RETROK_NUMLOCK },
593 #else
594 { SDLK_NUMLOCK, RETROK_NUMLOCK },
595 #endif
596 { SDLK_CAPSLOCK, RETROK_CAPSLOCK },
597 #ifdef HAVE_SDL2
598 { SDLK_SCROLLLOCK, RETROK_SCROLLOCK },
599 #else
600 { SDLK_SCROLLOCK, RETROK_SCROLLOCK },
601 #endif
602 { SDLK_RSHIFT, RETROK_RSHIFT },
603 { SDLK_LSHIFT, RETROK_LSHIFT },
604 { SDLK_RCTRL, RETROK_RCTRL },
605 { SDLK_LCTRL, RETROK_LCTRL },
606 { SDLK_RALT, RETROK_RALT },
607 { SDLK_LALT, RETROK_LALT },
608 #ifdef HAVE_SDL2
609 /* { ?, RETROK_RMETA }, */
610 /* { ?, RETROK_LMETA }, */
611 { SDLK_LGUI, RETROK_LSUPER },
612 { SDLK_RGUI, RETROK_RSUPER },
613 #else
614 { SDLK_RMETA, RETROK_RMETA },
615 { SDLK_LMETA, RETROK_LMETA },
616 { SDLK_LSUPER, RETROK_LSUPER },
617 { SDLK_RSUPER, RETROK_RSUPER },
618 #endif
619 { SDLK_MODE, RETROK_MODE },
620 #ifndef HAVE_SDL2
621 { SDLK_COMPOSE, RETROK_COMPOSE },
622 #endif
623 { SDLK_HELP, RETROK_HELP },
624 #ifdef HAVE_SDL2
625 { SDLK_PRINTSCREEN, RETROK_PRINT },
626 #else
627 { SDLK_PRINT, RETROK_PRINT },
628 #endif
629 { SDLK_SYSREQ, RETROK_SYSREQ },
630 { SDLK_PAUSE, RETROK_BREAK },
631 { SDLK_MENU, RETROK_MENU },
632 { SDLK_POWER, RETROK_POWER },
633
634 #ifndef HAVE_SDL2
635 { SDLK_EURO, RETROK_EURO },
636 #endif
637 { SDLK_UNDO, RETROK_UNDO },
638
639 { 0, RETROK_UNKNOWN },
640 };
641 #endif
642
643 #ifdef HAVE_DINPUT
644 const struct rarch_key_map rarch_key_map_dinput[] = {
645 { DIK_LEFT, RETROK_LEFT },
646 { DIK_RIGHT, RETROK_RIGHT },
647 { DIK_UP, RETROK_UP },
648 { DIK_DOWN, RETROK_DOWN },
649 { DIK_RETURN, RETROK_RETURN },
650 { DIK_TAB, RETROK_TAB },
651 { DIK_INSERT, RETROK_INSERT },
652 { DIK_DELETE, RETROK_DELETE },
653 { DIK_RSHIFT, RETROK_RSHIFT },
654 { DIK_LSHIFT, RETROK_LSHIFT },
655 { DIK_RCONTROL, RETROK_RCTRL },
656 { DIK_LCONTROL, RETROK_LCTRL },
657 { DIK_RMENU, RETROK_RALT },
658 { DIK_LALT, RETROK_LALT },
659 { DIK_LWIN, RETROK_LSUPER },
660 { DIK_RWIN, RETROK_RSUPER },
661 { DIK_APPS, RETROK_MENU },
662 { DIK_END, RETROK_END },
663 { DIK_HOME, RETROK_HOME },
664 { DIK_NEXT, RETROK_PAGEDOWN },
665 { DIK_PRIOR, RETROK_PAGEUP },
666 { DIK_SPACE, RETROK_SPACE },
667 { DIK_ESCAPE, RETROK_ESCAPE },
668 { DIK_BACKSPACE, RETROK_BACKSPACE },
669 { DIK_NUMPADENTER, RETROK_KP_ENTER },
670 { DIK_NUMPADPLUS, RETROK_KP_PLUS },
671 { DIK_NUMPADMINUS, RETROK_KP_MINUS },
672 { DIK_NUMPADSTAR, RETROK_KP_MULTIPLY },
673 { DIK_DIVIDE, RETROK_KP_DIVIDE },
674 { DIK_GRAVE, RETROK_BACKQUOTE },
675 { DIK_PAUSE, RETROK_PAUSE },
676 { DIK_NUMPAD0, RETROK_KP0 },
677 { DIK_NUMPAD1, RETROK_KP1 },
678 { DIK_NUMPAD2, RETROK_KP2 },
679 { DIK_NUMPAD3, RETROK_KP3 },
680 { DIK_NUMPAD4, RETROK_KP4 },
681 { DIK_NUMPAD5, RETROK_KP5 },
682 { DIK_NUMPAD6, RETROK_KP6 },
683 { DIK_NUMPAD7, RETROK_KP7 },
684 { DIK_NUMPAD8, RETROK_KP8 },
685 { DIK_NUMPAD9, RETROK_KP9 },
686 { DIK_0, RETROK_0 },
687 { DIK_1, RETROK_1 },
688 { DIK_2, RETROK_2 },
689 { DIK_3, RETROK_3 },
690 { DIK_4, RETROK_4 },
691 { DIK_5, RETROK_5 },
692 { DIK_6, RETROK_6 },
693 { DIK_7, RETROK_7 },
694 { DIK_8, RETROK_8 },
695 { DIK_9, RETROK_9 },
696 { DIK_F1, RETROK_F1 },
697 { DIK_F2, RETROK_F2 },
698 { DIK_F3, RETROK_F3 },
699 { DIK_F4, RETROK_F4 },
700 { DIK_F5, RETROK_F5 },
701 { DIK_F6, RETROK_F6 },
702 { DIK_F7, RETROK_F7 },
703 { DIK_F8, RETROK_F8 },
704 { DIK_F9, RETROK_F9 },
705 { DIK_F10, RETROK_F10 },
706 { DIK_F11, RETROK_F11 },
707 { DIK_F12, RETROK_F12 },
708 { DIK_F13, RETROK_F13 },
709 { DIK_F14, RETROK_F14 },
710 { DIK_F15, RETROK_F15 },
711 { DIK_A, RETROK_a },
712 { DIK_B, RETROK_b },
713 { DIK_C, RETROK_c },
714 { DIK_D, RETROK_d },
715 { DIK_E, RETROK_e },
716 { DIK_F, RETROK_f },
717 { DIK_G, RETROK_g },
718 { DIK_H, RETROK_h },
719 { DIK_I, RETROK_i },
720 { DIK_J, RETROK_j },
721 { DIK_K, RETROK_k },
722 { DIK_L, RETROK_l },
723 { DIK_M, RETROK_m },
724 { DIK_N, RETROK_n },
725 { DIK_O, RETROK_o },
726 { DIK_P, RETROK_p },
727 { DIK_Q, RETROK_q },
728 { DIK_R, RETROK_r },
729 { DIK_S, RETROK_s },
730 { DIK_T, RETROK_t },
731 { DIK_U, RETROK_u },
732 { DIK_V, RETROK_v },
733 { DIK_W, RETROK_w },
734 { DIK_X, RETROK_x },
735 { DIK_Y, RETROK_y },
736 { DIK_Z, RETROK_z },
737 { DIK_APOSTROPHE, RETROK_QUOTE },
738 { DIK_COMMA, RETROK_COMMA },
739 { DIK_MINUS, RETROK_MINUS },
740 { DIK_SLASH, RETROK_SLASH },
741 { DIK_SEMICOLON, RETROK_SEMICOLON },
742 { DIK_EQUALS, RETROK_EQUALS },
743 { DIK_LBRACKET, RETROK_LEFTBRACKET },
744 { DIK_BACKSLASH, RETROK_BACKSLASH },
745 { DIK_RBRACKET, RETROK_RIGHTBRACKET },
746 { DIK_DECIMAL, RETROK_KP_PERIOD },
747 { DIK_PERIOD, RETROK_PERIOD },
748 { DIK_SCROLL, RETROK_SCROLLOCK },
749 { DIK_CAPSLOCK, RETROK_CAPSLOCK },
750 { DIK_NUMLOCK, RETROK_NUMLOCK },
751 { DIK_OEM_102, RETROK_OEM_102 },
752 { 0, RETROK_UNKNOWN },
753 };
754 #endif
755
756 #ifdef EMSCRIPTEN
757 /* this is generated at runtime, so it isn't constant */
758 struct rarch_key_map rarch_key_map_rwebinput[RARCH_KEY_MAP_RWEBINPUT_SIZE];
759 #endif
760
761 #ifdef WIIU
762 const struct rarch_key_map rarch_key_map_wiiu[] = {
763 { 4, RETROK_a },
764 { 5, RETROK_b },
765 { 6, RETROK_c },
766 { 7, RETROK_d },
767 { 8, RETROK_e },
768 { 9, RETROK_f },
769 { 10, RETROK_g },
770 { 11, RETROK_h },
771 { 12, RETROK_i },
772 { 13, RETROK_j },
773 { 14, RETROK_k },
774 { 15, RETROK_l },
775 { 16, RETROK_m },
776 { 17, RETROK_n },
777 { 18, RETROK_o },
778 { 19, RETROK_p },
779 { 20, RETROK_q },
780 { 21, RETROK_r },
781 { 22, RETROK_s },
782 { 23, RETROK_t },
783 { 24, RETROK_u },
784 { 25, RETROK_v },
785 { 26, RETROK_w },
786 { 27, RETROK_x },
787 { 28, RETROK_y },
788 { 29, RETROK_z },
789 { 30, RETROK_1 },
790 { 31, RETROK_2 },
791 { 32, RETROK_3 },
792 { 33, RETROK_4 },
793 { 34, RETROK_5 },
794 { 35, RETROK_6 },
795 { 36, RETROK_7 },
796 { 37, RETROK_8 },
797 { 38, RETROK_9 },
798 { 39, RETROK_0 },
799 { 40, RETROK_RETURN },
800 { 41, RETROK_ESCAPE },
801 { 42, RETROK_BACKSPACE },
802 { 43, RETROK_TAB },
803 { 44, RETROK_SPACE },
804 { 45, RETROK_MINUS },
805 { 46, RETROK_EQUALS },
806 { 47, RETROK_LEFTBRACKET },
807 { 48, RETROK_RIGHTBRACKET },
808 { 49, RETROK_BACKSLASH },
809 { 51, RETROK_SEMICOLON },
810 { 52, RETROK_QUOTE },
811 { 53, RETROK_BACKQUOTE },
812 { 54, RETROK_COMMA },
813 { 55, RETROK_PERIOD },
814 { 56, RETROK_SLASH },
815 { 57, RETROK_CAPSLOCK },
816 { 58, RETROK_F1 },
817 { 59, RETROK_F2 },
818 { 60, RETROK_F3 },
819 { 61, RETROK_F4 },
820 { 62, RETROK_F5 },
821 { 63, RETROK_F6 },
822 { 64, RETROK_F7 },
823 { 65, RETROK_F8 },
824 { 66, RETROK_F9 },
825 { 67, RETROK_F10 },
826 { 68, RETROK_F11 },
827 { 69, RETROK_F12 },
828 { 71, RETROK_SCROLLOCK },
829 { 72, RETROK_PAUSE },
830 { 73, RETROK_INSERT },
831 { 74, RETROK_HOME },
832 { 75, RETROK_PAGEUP },
833 { 76, RETROK_DELETE },
834 { 77, RETROK_END },
835 { 78, RETROK_PAGEDOWN },
836 { 79, RETROK_RIGHT },
837 { 80, RETROK_LEFT },
838 { 81, RETROK_DOWN },
839 { 82, RETROK_UP },
840 { 83, RETROK_NUMLOCK },
841 { 84, RETROK_KP_DIVIDE },
842 { 85, RETROK_KP_MULTIPLY },
843 { 86, RETROK_KP_MINUS },
844 { 87, RETROK_KP_PLUS },
845 { 88, RETROK_KP_ENTER },
846 { 89, RETROK_KP1 },
847 { 90, RETROK_KP2 },
848 { 91, RETROK_KP3 },
849 { 92, RETROK_KP4 },
850 { 93, RETROK_KP5 },
851 { 94, RETROK_KP6 },
852 { 95, RETROK_KP7 },
853 { 96, RETROK_KP8 },
854 { 97, RETROK_KP9 },
855 { 98, RETROK_KP0 },
856 { 99, RETROK_KP_PERIOD },
857 { 224, RETROK_LCTRL },
858 { 225, RETROK_LSHIFT },
859 { 226, RETROK_LALT },
860 { 228, RETROK_RCTRL },
861 { 229, RETROK_RSHIFT },
862 { 230, RETROK_RALT },
863 { 0, RETROK_UNKNOWN },
864 };
865 #endif
866
867 #ifdef HAVE_X11
868
869 const struct rarch_key_map rarch_key_map_x11[] = {
870
871 { XFVK_ESC, RETROK_ESCAPE },
872 { XFVK_FK01, RETROK_F1 },
873 { XFVK_FK02, RETROK_F2 },
874 { XFVK_FK03, RETROK_F3 },
875 { XFVK_FK04, RETROK_F4 },
876 { XFVK_FK05, RETROK_F5 },
877 { XFVK_FK06, RETROK_F6 },
878 { XFVK_FK07, RETROK_F7 },
879 { XFVK_FK08, RETROK_F8 },
880 { XFVK_FK09, RETROK_F9 },
881 { XFVK_FK10, RETROK_F10 },
882 { XFVK_FK11, RETROK_F11 },
883 { XFVK_FK12, RETROK_F12 },
884
885 { XFVK_TLDE, RETROK_BACKQUOTE },
886 { XFVK_AE01, RETROK_1 },
887 { XFVK_AE02, RETROK_2 },
888 { XFVK_AE03, RETROK_3 },
889 { XFVK_AE04, RETROK_4 },
890 { XFVK_AE05, RETROK_5 },
891 { XFVK_AE06, RETROK_6 },
892 { XFVK_AE07, RETROK_7 },
893 { XFVK_AE08, RETROK_8 },
894 { XFVK_AE09, RETROK_9 },
895 { XFVK_AE10, RETROK_0 },
896 { XFVK_AE11, RETROK_MINUS },
897 { XFVK_AE12, RETROK_EQUALS },
898 { XFVK_BKSP, RETROK_BACKSPACE },
899
900 { XFVK_TAB, RETROK_TAB },
901 { XFVK_AD01, RETROK_q },
902 { XFVK_AD02, RETROK_w },
903 { XFVK_AD03, RETROK_e },
904 { XFVK_AD04, RETROK_r },
905 { XFVK_AD05, RETROK_t },
906 { XFVK_AD06, RETROK_y },
907 { XFVK_AD07, RETROK_u },
908 { XFVK_AD08, RETROK_i },
909 { XFVK_AD09, RETROK_o },
910 { XFVK_AD10, RETROK_p },
911 { XFVK_AD11, RETROK_LEFTBRACKET },
912 { XFVK_AD12, RETROK_RIGHTBRACKET },
913 { XFVK_RTRN, RETROK_RETURN },
914
915 { XFVK_CAPS, RETROK_CAPSLOCK },
916 { XFVK_AC01, RETROK_a },
917 { XFVK_AC02, RETROK_s },
918 { XFVK_AC03, RETROK_d },
919 { XFVK_AC04, RETROK_f },
920 { XFVK_AC05, RETROK_g },
921 { XFVK_AC06, RETROK_h },
922 { XFVK_AC07, RETROK_j },
923 { XFVK_AC08, RETROK_k },
924 { XFVK_AC09, RETROK_l },
925 { XFVK_AC10, RETROK_SEMICOLON },
926 { XFVK_AC11, RETROK_QUOTE },
927 { XFVK_AC12, RETROK_BACKSLASH },
928
929 { XFVK_LFSH, RETROK_LSHIFT },
930 { XFVK_AB01, RETROK_z },
931 { XFVK_AB02, RETROK_x },
932 { XFVK_AB03, RETROK_c },
933 { XFVK_AB04, RETROK_v },
934 { XFVK_AB05, RETROK_b },
935 { XFVK_AB06, RETROK_n },
936 { XFVK_AB07, RETROK_m },
937 { XFVK_AB08, RETROK_COMMA },
938 { XFVK_AB09, RETROK_PERIOD },
939 { XFVK_AB10, RETROK_SLASH },
940 { XFVK_RTSH, RETROK_RSHIFT },
941
942 { XFVK_LALT, RETROK_LALT },
943 { XFVK_LCTL, RETROK_LCTRL },
944 { XFVK_SPCE, RETROK_SPACE },
945 { XFVK_RCTL, RETROK_RCTRL },
946 { XFVK_RALT, RETROK_RALT },
947
948 { XFVK_LSGT, RETROK_OEM_102 },
949 { XFVK_MENU, RETROK_MENU },
950 { XFVK_LWIN, RETROK_LSUPER },
951 { XFVK_RWIN, RETROK_RSUPER },
952 { XFVK_CALC, RETROK_HELP },
953
954 { XFVK_PRSC, RETROK_PRINT },
955 { XFVK_SCLK, RETROK_SCROLLOCK },
956 { XFVK_PAUS, RETROK_PAUSE },
957 { XFVK_INS, RETROK_INSERT },
958 { XFVK_HOME, RETROK_HOME },
959 { XFVK_PGUP, RETROK_PAGEUP },
960 { XFVK_DELE, RETROK_DELETE },
961 { XFVK_END, RETROK_END },
962 { XFVK_PGDN, RETROK_PAGEDOWN },
963 { XFVK_UP, RETROK_UP },
964 { XFVK_LEFT, RETROK_LEFT },
965 { XFVK_DOWN, RETROK_DOWN },
966 { XFVK_RGHT, RETROK_RIGHT },
967
968 { XFVK_NMLK, RETROK_NUMLOCK },
969 { XFVK_KPDV, RETROK_KP_DIVIDE },
970 { XFVK_KPMU, RETROK_KP_MULTIPLY },
971 { XFVK_KPSU, RETROK_KP_MINUS },
972 { XFVK_KP7, RETROK_KP7 },
973 { XFVK_KP8, RETROK_KP8 },
974 { XFVK_KP9, RETROK_KP9 },
975 { XFVK_KPAD, RETROK_KP_PLUS },
976 { XFVK_KP4, RETROK_KP4 },
977 { XFVK_KP5, RETROK_KP5 },
978 { XFVK_KP6, RETROK_KP6 },
979 { XFVK_KP1, RETROK_KP1 },
980 { XFVK_KP2, RETROK_KP2 },
981 { XFVK_KP3, RETROK_KP3 },
982 { XFVK_KPEN, RETROK_KP_ENTER },
983 { XFVK_KP0, RETROK_KP0 },
984 { XFVK_KPDL, RETROK_KP_PERIOD },
985 { XFVK_KPEQ, RETROK_KP_EQUALS },
986
987 { 0, RETROK_UNKNOWN },
988 };
989 #endif
990
991 #if defined(__linux__) || defined(HAVE_WAYLAND)
992 /* Note: Only one input can be mapped to each
993 * RETROK_* key. If several physical inputs
994 * correspond to the same key, these inputs
995 * must be merged at the input driver level */
996 const struct rarch_key_map rarch_key_map_linux[] = {
997 { KEY_BACKSPACE, RETROK_BACKSPACE },
998 { KEY_TAB, RETROK_TAB },
999 { KEY_CLEAR, RETROK_CLEAR },
1000 /* { KEY_EXIT, RETROK_CLEAR }, */ /* Duplicate - Skip */
1001 { KEY_ENTER, RETROK_RETURN },
1002 /* { KEY_OK, RETROK_RETURN }, */ /* Duplicate - Skip */
1003 /* { KEY_SELECT, RETROK_RETURN }, */ /* Duplicate - Skip */
1004 { KEY_PAUSE, RETROK_PAUSE },
1005 { KEY_ESC, RETROK_ESCAPE },
1006 { KEY_SPACE, RETROK_SPACE },
1007 /* { ?, RETROK_EXCLAIM }, */
1008 /* { ?, RETROK_QUOTEDBL }, */
1009 /* { ?, RETROK_HASH }, */
1010 #ifndef ANDROID
1011 { KEY_DOLLAR, RETROK_DOLLAR },
1012 #endif
1013 /* { ?, RETROK_AMPERSAND }, */
1014 { KEY_APOSTROPHE, RETROK_QUOTE },
1015 { KEY_KPLEFTPAREN, RETROK_LEFTPAREN },
1016 { KEY_KPRIGHTPAREN, RETROK_RIGHTPAREN },
1017 { KEY_KPASTERISK, RETROK_ASTERISK },
1018 { KEY_KPPLUS, RETROK_PLUS },
1019 { KEY_COMMA, RETROK_COMMA },
1020 { KEY_MINUS, RETROK_MINUS },
1021 { KEY_DOT, RETROK_PERIOD },
1022 { KEY_SLASH, RETROK_SLASH },
1023 { KEY_0, RETROK_0 },
1024 { KEY_1, RETROK_1 },
1025 { KEY_2, RETROK_2 },
1026 { KEY_3, RETROK_3 },
1027 { KEY_4, RETROK_4 },
1028 { KEY_5, RETROK_5 },
1029 { KEY_6, RETROK_6 },
1030 { KEY_7, RETROK_7 },
1031 { KEY_8, RETROK_8 },
1032 { KEY_9, RETROK_9 },
1033 /* { KEY_COLON, RETROK_COLON }, */
1034 { KEY_SEMICOLON, RETROK_SEMICOLON },
1035 /* { KEY_LESS, RETROK_LESS }, */
1036 { KEY_EQUAL, RETROK_EQUALS },
1037 /* { KEY_GREATER, RETROK_GREATER }, */
1038 { KEY_QUESTION, RETROK_QUESTION },
1039 /* { KEY_AT, RETROK_AT }, */
1040 { KEY_LEFTBRACE, RETROK_LEFTBRACKET },
1041 { KEY_BACKSLASH, RETROK_BACKSLASH },
1042 { KEY_RIGHTBRACE, RETROK_RIGHTBRACKET },
1043 /* { ?, RETROK_CARET }, */
1044 /* { ?, RETROK_UNDERSCORE }, */
1045 { KEY_GRAVE, RETROK_BACKQUOTE },
1046 { KEY_A, RETROK_a },
1047 { KEY_B, RETROK_b },
1048 { KEY_C, RETROK_c },
1049 { KEY_D, RETROK_d },
1050 { KEY_E, RETROK_e },
1051 { KEY_F, RETROK_f },
1052 { KEY_G, RETROK_g },
1053 { KEY_H, RETROK_h },
1054 { KEY_I, RETROK_i },
1055 { KEY_J, RETROK_j },
1056 { KEY_K, RETROK_k },
1057 { KEY_L, RETROK_l },
1058 { KEY_M, RETROK_m },
1059 { KEY_N, RETROK_n },
1060 { KEY_O, RETROK_o },
1061 { KEY_P, RETROK_p },
1062 { KEY_Q, RETROK_q },
1063 { KEY_R, RETROK_r },
1064 { KEY_S, RETROK_s },
1065 { KEY_T, RETROK_t },
1066 { KEY_U, RETROK_u },
1067 { KEY_V, RETROK_v },
1068 { KEY_W, RETROK_w },
1069 { KEY_X, RETROK_x },
1070 { KEY_Y, RETROK_y },
1071 { KEY_Z, RETROK_z },
1072 { KEY_DELETE, RETROK_DELETE },
1073 { KEY_KP0, RETROK_KP0 },
1074 { KEY_KP1, RETROK_KP1 },
1075 { KEY_KP2, RETROK_KP2 },
1076 { KEY_KP3, RETROK_KP3 },
1077 { KEY_KP4, RETROK_KP4 },
1078 { KEY_KP5, RETROK_KP5 },
1079 { KEY_KP6, RETROK_KP6 },
1080 { KEY_KP7, RETROK_KP7 },
1081 { KEY_KP8, RETROK_KP8 },
1082 { KEY_KP9, RETROK_KP9 },
1083 { KEY_KPDOT, RETROK_KP_PERIOD },
1084 { KEY_KPSLASH, RETROK_KP_DIVIDE },
1085 { KEY_KPASTERISK, RETROK_KP_MULTIPLY },
1086 { KEY_KPMINUS, RETROK_KP_MINUS },
1087 { KEY_KPPLUS, RETROK_KP_PLUS },
1088 { KEY_KPENTER, RETROK_KP_ENTER },
1089 { KEY_KPEQUAL, RETROK_KP_EQUALS },
1090 { KEY_UP, RETROK_UP },
1091 { KEY_DOWN, RETROK_DOWN },
1092 { KEY_RIGHT, RETROK_RIGHT },
1093 { KEY_LEFT, RETROK_LEFT },
1094 { KEY_INSERT, RETROK_INSERT },
1095 { KEY_HOME, RETROK_HOME },
1096 { KEY_END, RETROK_END },
1097 { KEY_PAGEUP, RETROK_PAGEUP },
1098 { KEY_PAGEDOWN, RETROK_PAGEDOWN },
1099 { KEY_F1, RETROK_F1 },
1100 { KEY_F2, RETROK_F2 },
1101 { KEY_F3, RETROK_F3 },
1102 { KEY_F4, RETROK_F4 },
1103 { KEY_F5, RETROK_F5 },
1104 { KEY_F6, RETROK_F6 },
1105 { KEY_F7, RETROK_F7 },
1106 { KEY_F8, RETROK_F8 },
1107 { KEY_F9, RETROK_F9 },
1108 { KEY_F10, RETROK_F10 },
1109 { KEY_F11, RETROK_F11 },
1110 { KEY_F12, RETROK_F12 },
1111 { KEY_F13, RETROK_F13 },
1112 { KEY_F14, RETROK_F14 },
1113 { KEY_F15, RETROK_F15 },
1114 { KEY_NUMLOCK, RETROK_NUMLOCK },
1115 { KEY_CAPSLOCK, RETROK_CAPSLOCK },
1116 { KEY_SCROLLLOCK, RETROK_SCROLLOCK },
1117 { KEY_RIGHTSHIFT, RETROK_RSHIFT },
1118 { KEY_LEFTSHIFT, RETROK_LSHIFT },
1119 { KEY_RIGHTCTRL, RETROK_RCTRL },
1120 { KEY_LEFTCTRL, RETROK_LCTRL },
1121 { KEY_RIGHTALT, RETROK_RALT },
1122 { KEY_LEFTALT, RETROK_LALT },
1123 /* { ?, RETROK_RMETA }, */
1124 /* { ?, RETROK_LMETA }, */
1125 { KEY_LEFTMETA, RETROK_LSUPER },
1126 { KEY_RIGHTMETA, RETROK_RSUPER },
1127 { KEY_MODE, RETROK_MODE },
1128 { KEY_COMPOSE, RETROK_COMPOSE },
1129 { KEY_HELP, RETROK_HELP },
1130 { KEY_PRINT, RETROK_PRINT },
1131 { KEY_SYSRQ, RETROK_SYSREQ },
1132 { KEY_BREAK, RETROK_BREAK },
1133 { KEY_MENU, RETROK_MENU },
1134 { KEY_POWER, RETROK_POWER },
1135 #ifndef ANDROID
1136 { KEY_EURO, RETROK_EURO },
1137 #endif
1138 { KEY_UNDO, RETROK_UNDO },
1139 { KEY_102ND, RETROK_OEM_102 },
1140 { 0, RETROK_UNKNOWN },
1141 };
1142 #endif
1143
1144 #ifdef ANDROID
1145 const struct rarch_key_map rarch_key_map_android[] = {
1146 { AKEYCODE_DEL, RETROK_BACKSPACE },
1147 { AKEYCODE_TAB, RETROK_TAB },
1148 { AKEYCODE_CLEAR, RETROK_CLEAR },
1149 { AKEYCODE_ENTER, RETROK_RETURN },
1150 { AKEYCODE_BREAK, RETROK_PAUSE },
1151 { AKEYCODE_ESCAPE, RETROK_ESCAPE },
1152 { AKEYCODE_SPACE, RETROK_SPACE },
1153 { AKEYCODE_APOSTROPHE, RETROK_QUOTE },
1154 { AKEYCODE_NUMPAD_LEFT_PAREN, RETROK_LEFTPAREN },
1155 { AKEYCODE_NUMPAD_RIGHT_PAREN, RETROK_RIGHTPAREN },
1156 { AKEYCODE_NUMPAD_MULTIPLY, RETROK_ASTERISK },
1157 { AKEYCODE_NUMPAD_ADD, RETROK_PLUS },
1158 { AKEYCODE_COMMA, RETROK_COMMA },
1159 { AKEYCODE_MINUS, RETROK_MINUS },
1160 { AKEYCODE_PERIOD, RETROK_PERIOD },
1161 { AKEYCODE_SLASH, RETROK_SLASH },
1162 { AKEYCODE_0, RETROK_0 },
1163 { AKEYCODE_1, RETROK_1 },
1164 { AKEYCODE_2, RETROK_2 },
1165 { AKEYCODE_3, RETROK_3 },
1166 { AKEYCODE_4, RETROK_4 },
1167 { AKEYCODE_5, RETROK_5 },
1168 { AKEYCODE_6, RETROK_6 },
1169 { AKEYCODE_7, RETROK_7 },
1170 { AKEYCODE_8, RETROK_8 },
1171 { AKEYCODE_9, RETROK_9 },
1172 { AKEYCODE_SEMICOLON, RETROK_SEMICOLON },
1173 { AKEYCODE_EQUALS, RETROK_EQUALS },
1174 { AKEYCODE_LEFT_BRACKET, RETROK_LEFTBRACKET },
1175 { AKEYCODE_BACKSLASH, RETROK_BACKSLASH },
1176 { AKEYCODE_RIGHT_BRACKET, RETROK_RIGHTBRACKET },
1177 { AKEYCODE_GRAVE, RETROK_BACKQUOTE },
1178 { AKEYCODE_A, RETROK_a },
1179 { AKEYCODE_B, RETROK_b },
1180 { AKEYCODE_C, RETROK_c },
1181 { AKEYCODE_D, RETROK_d },
1182 { AKEYCODE_E, RETROK_e },
1183 { AKEYCODE_F, RETROK_f },
1184 { AKEYCODE_G, RETROK_g },
1185 { AKEYCODE_H, RETROK_h },
1186 { AKEYCODE_I, RETROK_i },
1187 { AKEYCODE_J, RETROK_j },
1188 { AKEYCODE_K, RETROK_k },
1189 { AKEYCODE_L, RETROK_l },
1190 { AKEYCODE_M, RETROK_m },
1191 { AKEYCODE_N, RETROK_n },
1192 { AKEYCODE_O, RETROK_o },
1193 { AKEYCODE_P, RETROK_p },
1194 { AKEYCODE_Q, RETROK_q },
1195 { AKEYCODE_R, RETROK_r },
1196 { AKEYCODE_S, RETROK_s },
1197 { AKEYCODE_T, RETROK_t },
1198 { AKEYCODE_U, RETROK_u },
1199 { AKEYCODE_V, RETROK_v },
1200 { AKEYCODE_W, RETROK_w },
1201 { AKEYCODE_X, RETROK_x },
1202 { AKEYCODE_Y, RETROK_y },
1203 { AKEYCODE_Z, RETROK_z },
1204 { AKEYCODE_DEL, RETROK_DELETE },
1205 { AKEYCODE_NUMPAD_0, RETROK_KP0 },
1206 { AKEYCODE_NUMPAD_1, RETROK_KP1 },
1207 { AKEYCODE_NUMPAD_2, RETROK_KP2 },
1208 { AKEYCODE_NUMPAD_3, RETROK_KP3 },
1209 { AKEYCODE_NUMPAD_4, RETROK_KP4 },
1210 { AKEYCODE_NUMPAD_5, RETROK_KP5 },
1211 { AKEYCODE_NUMPAD_6, RETROK_KP6 },
1212 { AKEYCODE_NUMPAD_7, RETROK_KP7 },
1213 { AKEYCODE_NUMPAD_8, RETROK_KP8 },
1214 { AKEYCODE_NUMPAD_9, RETROK_KP9 },
1215 { AKEYCODE_NUMPAD_DOT, RETROK_KP_PERIOD },
1216 { AKEYCODE_NUMPAD_DIVIDE, RETROK_KP_DIVIDE },
1217 { AKEYCODE_NUMPAD_MULTIPLY, RETROK_KP_MULTIPLY },
1218 { AKEYCODE_NUMPAD_SUBTRACT, RETROK_KP_MINUS },
1219 { AKEYCODE_NUMPAD_ADD, RETROK_KP_PLUS },
1220 { AKEYCODE_NUMPAD_ENTER, RETROK_KP_ENTER },
1221 { AKEYCODE_NUMPAD_EQUALS, RETROK_KP_EQUALS },
1222 { AKEYCODE_DPAD_UP, RETROK_UP },
1223 { AKEYCODE_DPAD_DOWN, RETROK_DOWN },
1224 { AKEYCODE_DPAD_RIGHT, RETROK_RIGHT },
1225 { AKEYCODE_DPAD_LEFT, RETROK_LEFT },
1226 { AKEYCODE_INSERT, RETROK_INSERT },
1227 { AKEYCODE_MOVE_HOME, RETROK_HOME },
1228 { AKEYCODE_MOVE_END, RETROK_END },
1229 { AKEYCODE_PAGE_UP, RETROK_PAGEUP },
1230 { AKEYCODE_PAGE_DOWN, RETROK_PAGEDOWN },
1231 { AKEYCODE_F1, RETROK_F1 },
1232 { AKEYCODE_F2, RETROK_F2 },
1233 { AKEYCODE_F3, RETROK_F3 },
1234 { AKEYCODE_F4, RETROK_F4 },
1235 { AKEYCODE_F5, RETROK_F5 },
1236 { AKEYCODE_F6, RETROK_F6 },
1237 { AKEYCODE_F7, RETROK_F7 },
1238 { AKEYCODE_F8, RETROK_F8 },
1239 { AKEYCODE_F9, RETROK_F9 },
1240 { AKEYCODE_F10, RETROK_F10 },
1241 { AKEYCODE_F11, RETROK_F11 },
1242 { AKEYCODE_F12, RETROK_F12 },
1243 { AKEYCODE_NUM_LOCK, RETROK_NUMLOCK },
1244 { AKEYCODE_CAPS_LOCK, RETROK_CAPSLOCK },
1245 { AKEYCODE_SCROLL_LOCK, RETROK_SCROLLOCK },
1246 { AKEYCODE_SHIFT_LEFT, RETROK_RSHIFT },
1247 { AKEYCODE_SHIFT_RIGHT, RETROK_LSHIFT },
1248 { AKEYCODE_CTRL_RIGHT, RETROK_RCTRL },
1249 { AKEYCODE_CTRL_LEFT, RETROK_LCTRL },
1250 { AKEYCODE_ALT_RIGHT, RETROK_RALT },
1251 { AKEYCODE_ALT_LEFT, RETROK_LALT },
1252 { 0, RETROK_UNKNOWN },
1253 };
1254 #endif
1255
1256 #ifdef __QNX__
1257 const struct rarch_key_map rarch_key_map_qnx[] = {
1258 { KEYCODE_BACKSPACE, RETROK_BACKSPACE },
1259 { KEYCODE_RETURN, RETROK_RETURN },
1260 { KEYCODE_SPACE, RETROK_SPACE },
1261 { KEYCODE_UP, RETROK_UP },
1262 { KEYCODE_DOWN, RETROK_DOWN },
1263 { KEYCODE_LEFT, RETROK_LEFT },
1264 { KEYCODE_RIGHT, RETROK_RIGHT },
1265 { KEYCODE_A, RETROK_a },
1266 { KEYCODE_B, RETROK_b },
1267 { KEYCODE_C, RETROK_c },
1268 { KEYCODE_D, RETROK_d },
1269 { KEYCODE_E, RETROK_e },
1270 { KEYCODE_F, RETROK_f },
1271 { KEYCODE_G, RETROK_g },
1272 { KEYCODE_H, RETROK_h },
1273 { KEYCODE_I, RETROK_i },
1274 { KEYCODE_J, RETROK_j },
1275 { KEYCODE_K, RETROK_k },
1276 { KEYCODE_L, RETROK_l },
1277 { KEYCODE_M, RETROK_m },
1278 { KEYCODE_N, RETROK_n },
1279 { KEYCODE_O, RETROK_o },
1280 { KEYCODE_P, RETROK_p },
1281 { KEYCODE_Q, RETROK_q },
1282 { KEYCODE_R, RETROK_r },
1283 { KEYCODE_S, RETROK_s },
1284 { KEYCODE_T, RETROK_t },
1285 { KEYCODE_U, RETROK_u },
1286 { KEYCODE_V, RETROK_v },
1287 { KEYCODE_W, RETROK_w },
1288 { KEYCODE_X, RETROK_x },
1289 { KEYCODE_Y, RETROK_y },
1290 { KEYCODE_Z, RETROK_z },
1291 { KEYCODE_ZERO, RETROK_0 },
1292 { KEYCODE_ONE, RETROK_1 },
1293 { KEYCODE_TWO, RETROK_2 },
1294 { KEYCODE_THREE, RETROK_3 },
1295 { KEYCODE_FOUR, RETROK_4 },
1296 { KEYCODE_FIVE, RETROK_5 },
1297 { KEYCODE_SIX, RETROK_6 },
1298 { KEYCODE_SEVEN, RETROK_7 },
1299 { KEYCODE_EIGHT, RETROK_8 },
1300 { KEYCODE_NINE, RETROK_9 },
1301 { KEYCODE_INSERT, RETROK_INSERT },
1302 { KEYCODE_HOME, RETROK_HOME },
1303 { KEYCODE_END, RETROK_END },
1304 { KEYCODE_PG_UP, RETROK_PAGEUP },
1305 { KEYCODE_PG_DOWN, RETROK_PAGEDOWN },
1306 { KEYCODE_F1, RETROK_F1 },
1307 { KEYCODE_F2, RETROK_F2 },
1308 { KEYCODE_F3, RETROK_F3 },
1309 { KEYCODE_F4, RETROK_F4 },
1310 { KEYCODE_F5, RETROK_F5 },
1311 { KEYCODE_F6, RETROK_F6 },
1312 { KEYCODE_F7, RETROK_F7 },
1313 { KEYCODE_F8, RETROK_F8 },
1314 { KEYCODE_F9, RETROK_F9 },
1315 { KEYCODE_F10, RETROK_F10 },
1316 { KEYCODE_F11, RETROK_F11 },
1317 { KEYCODE_F12, RETROK_F12 },
1318 { KEYCODE_LEFT_SHIFT, RETROK_LSHIFT },
1319 { KEYCODE_RIGHT_SHIFT, RETROK_RSHIFT },
1320 { KEYCODE_LEFT_CTRL, RETROK_LCTRL },
1321 { KEYCODE_RIGHT_CTRL, RETROK_RCTRL },
1322 { KEYCODE_LEFT_ALT, RETROK_LALT },
1323 { KEYCODE_RIGHT_ALT, RETROK_RALT },
1324 // TODO/FIXME: Code for 'sym' key on BB keyboards. Figure out which sys/keycodes.h define this maps to.
1325 { 61651, RETROK_RSUPER },
1326 { KEYCODE_DOLLAR, RETROK_DOLLAR },
1327 { KEYCODE_MENU, RETROK_MENU },
1328 { 0, RETROK_UNKNOWN },
1329 };
1330 #endif
1331
1332 #ifdef __APPLE__
1333 const struct rarch_key_map rarch_key_map_apple_hid[] = {
1334 { KEY_Delete, RETROK_BACKSPACE },
1335 { KEY_Tab, RETROK_TAB },
1336 /* { ?, RETROK_CLEAR }, */
1337 { KEY_Enter, RETROK_RETURN },
1338 { KEY_Pause, RETROK_PAUSE },
1339 { KEY_Escape, RETROK_ESCAPE },
1340 { KEY_Space, RETROK_SPACE },
1341 /* { ?, RETROK_EXCLAIM }, */
1342 /* { ?, RETROK_QUOTEDBL }, */
1343 /* { ?, RETROK_HASH }, */
1344 /* { ?, RETROK_DOLLAR }, */
1345 /* { ?, RETROK_AMPERSAND }, */
1346 { KEY_Quote, RETROK_QUOTE },
1347 /* { ?, RETROK_LEFTPAREN }, */
1348 /* { ?, RETROK_RIGHTPAREN }, */
1349 /* { ?, RETROK_ASTERISK }, */
1350 /* { ?, RETROK_PLUS }, */
1351 { KEY_Comma, RETROK_COMMA },
1352 { KEY_Minus, RETROK_MINUS },
1353 { KEY_Period, RETROK_PERIOD },
1354 { KEY_Slash, RETROK_SLASH },
1355 { KEY_0, RETROK_0 },
1356 { KEY_1, RETROK_1 },
1357 { KEY_2, RETROK_2 },
1358 { KEY_3, RETROK_3 },
1359 { KEY_4, RETROK_4 },
1360 { KEY_5, RETROK_5 },
1361 { KEY_6, RETROK_6 },
1362 { KEY_7, RETROK_7 },
1363 { KEY_8, RETROK_8 },
1364 { KEY_9, RETROK_9 },
1365 /* { ?, RETROK_COLON }, */
1366 { KEY_Semicolon, RETROK_SEMICOLON },
1367 /* { ?, RETROK_LESS }, */
1368 { KEY_Equals, RETROK_EQUALS },
1369 /* { ?, RETROK_GREATER }, */
1370 /* { ?, RETROK_QUESTION }, */
1371 /* { ?, RETROK_AT }, */
1372 { KEY_LeftBracket, RETROK_LEFTBRACKET },
1373 { KEY_Backslash, RETROK_BACKSLASH },
1374 { KEY_RightBracket, RETROK_RIGHTBRACKET },
1375 /* { ?, RETROK_CARET }, */
1376 /* { ?, RETROK_UNDERSCORE }, */
1377 { KEY_Grave, RETROK_BACKQUOTE },
1378 { KEY_A, RETROK_a },
1379 { KEY_B, RETROK_b },
1380 { KEY_C, RETROK_c },
1381 { KEY_D, RETROK_d },
1382 { KEY_E, RETROK_e },
1383 { KEY_F, RETROK_f },
1384 { KEY_G, RETROK_g },
1385 { KEY_H, RETROK_h },
1386 { KEY_I, RETROK_i },
1387 { KEY_J, RETROK_j },
1388 { KEY_K, RETROK_k },
1389 { KEY_L, RETROK_l },
1390 { KEY_M, RETROK_m },
1391 { KEY_N, RETROK_n },
1392 { KEY_O, RETROK_o },
1393 { KEY_P, RETROK_p },
1394 { KEY_Q, RETROK_q },
1395 { KEY_R, RETROK_r },
1396 { KEY_S, RETROK_s },
1397 { KEY_T, RETROK_t },
1398 { KEY_U, RETROK_u },
1399 { KEY_V, RETROK_v },
1400 { KEY_W, RETROK_w },
1401 { KEY_X, RETROK_x },
1402 { KEY_Y, RETROK_y },
1403 { KEY_Z, RETROK_z },
1404 { KEY_DeleteForward, RETROK_DELETE },
1405
1406 { KP_0, RETROK_KP0 },
1407 { KP_1, RETROK_KP1 },
1408 { KP_2, RETROK_KP2 },
1409 { KP_3, RETROK_KP3 },
1410 { KP_4, RETROK_KP4 },
1411 { KP_5, RETROK_KP5 },
1412 { KP_6, RETROK_KP6 },
1413 { KP_7, RETROK_KP7 },
1414 { KP_8, RETROK_KP8 },
1415 { KP_9, RETROK_KP9 },
1416 { KP_Point, RETROK_KP_PERIOD },
1417 { KP_Divide, RETROK_KP_DIVIDE },
1418 { KP_Multiply, RETROK_KP_MULTIPLY },
1419 { KP_Subtract, RETROK_KP_MINUS },
1420 { KP_Add, RETROK_KP_PLUS },
1421 { KP_Enter, RETROK_KP_ENTER },
1422 { KP_Equals, RETROK_KP_EQUALS },
1423
1424 { KEY_Up, RETROK_UP },
1425 { KEY_Down, RETROK_DOWN },
1426 { KEY_Right, RETROK_RIGHT },
1427 { KEY_Left, RETROK_LEFT },
1428 { KEY_Insert, RETROK_INSERT },
1429 { KEY_Home, RETROK_HOME },
1430 { KEY_End, RETROK_END },
1431 { KEY_PageUp, RETROK_PAGEUP },
1432 { KEY_PageDown, RETROK_PAGEDOWN },
1433
1434 { KEY_F1, RETROK_F1 },
1435 { KEY_F2, RETROK_F2 },
1436 { KEY_F3, RETROK_F3 },
1437 { KEY_F4, RETROK_F4 },
1438 { KEY_F5, RETROK_F5 },
1439 { KEY_F6, RETROK_F6 },
1440 { KEY_F7, RETROK_F7 },
1441 { KEY_F8, RETROK_F8 },
1442 { KEY_F9, RETROK_F9 },
1443 { KEY_F10, RETROK_F10 },
1444 { KEY_F11, RETROK_F11 },
1445 { KEY_F12, RETROK_F12 },
1446 { KEY_F13, RETROK_F13 },
1447 { KEY_F14, RETROK_F14 },
1448 { KEY_F15, RETROK_F15 },
1449
1450 /* { ?, RETROK_NUMLOCK }, */
1451 { KEY_CapsLock, RETROK_CAPSLOCK },
1452 /* { ?, RETROK_SCROLLOCK }, */
1453 { KEY_RightShift, RETROK_RSHIFT },
1454 { KEY_LeftShift, RETROK_LSHIFT },
1455 { KEY_RightControl, RETROK_RCTRL },
1456 { KEY_LeftControl, RETROK_LCTRL },
1457 { KEY_RightAlt, RETROK_RALT },
1458 { KEY_LeftAlt, RETROK_LALT },
1459 { KEY_RightGUI, RETROK_RMETA },
1460 { KEY_LeftGUI, RETROK_RMETA },
1461 /* { ?, RETROK_LSUPER }, */
1462 /* { ?, RETROK_RSUPER }, */
1463 /* { ?, RETROK_MODE }, */
1464 /* { ?, RETROK_COMPOSE }, */
1465
1466 /* { ?, RETROK_HELP }, */
1467 { KEY_PrintScreen, RETROK_PRINT },
1468 /* { ?, RETROK_SYSREQ }, */
1469 /* { ?, RETROK_BREAK }, */
1470 { KEY_Menu, RETROK_MENU },
1471 /* { ?, RETROK_POWER }, */
1472 /* { ?, RETROK_EURO }, */
1473 /* { ?, RETROK_UNDO }, */
1474 { KEY_NonUSBackslash, RETROK_OEM_102 },
1475 { 0, RETROK_UNKNOWN }
1476 };
1477 #endif
1478
1479 #ifdef DJGPP
1480 const struct rarch_key_map rarch_key_map_dos[] = {
1481 { DOSKEY_ESCAPE, RETROK_ESCAPE },
1482 { DOSKEY_F1, RETROK_F1 },
1483 { DOSKEY_F2, RETROK_F2 },
1484 { DOSKEY_F3, RETROK_F3 },
1485 { DOSKEY_F4, RETROK_F4 },
1486 { DOSKEY_F5, RETROK_F5 },
1487 { DOSKEY_F6, RETROK_F6 },
1488 { DOSKEY_F7, RETROK_F7 },
1489 { DOSKEY_F8, RETROK_F8 },
1490 { DOSKEY_F9, RETROK_F9 },
1491 { DOSKEY_F10, RETROK_F10 },
1492
1493 { DOSKEY_BACKQUOTE, RETROK_BACKQUOTE },
1494 { DOSKEY_1, RETROK_1 },
1495 { DOSKEY_2, RETROK_2 },
1496 { DOSKEY_3, RETROK_3 },
1497 { DOSKEY_4, RETROK_4 },
1498 { DOSKEY_5, RETROK_5 },
1499 { DOSKEY_6, RETROK_6 },
1500 { DOSKEY_7, RETROK_7 },
1501 { DOSKEY_8, RETROK_8 },
1502 { DOSKEY_9, RETROK_9 },
1503 { DOSKEY_0, RETROK_0 },
1504 { DOSKEY_MINUS, RETROK_MINUS },
1505 { DOSKEY_EQUAL, RETROK_EQUALS },
1506 { DOSKEY_BACKSPACE, RETROK_BACKSPACE },
1507
1508 { DOSKEY_TAB, RETROK_TAB },
1509 { DOSKEY_q, RETROK_q },
1510 { DOSKEY_w, RETROK_w },
1511 { DOSKEY_e, RETROK_e },
1512 { DOSKEY_r, RETROK_r },
1513 { DOSKEY_t, RETROK_t },
1514 { DOSKEY_y, RETROK_y },
1515 { DOSKEY_u, RETROK_u },
1516 { DOSKEY_i, RETROK_i },
1517 { DOSKEY_o, RETROK_o },
1518 { DOSKEY_p, RETROK_p },
1519 { DOSKEY_LBRACKET, RETROK_LEFTBRACKET },
1520 { DOSKEY_RBRACKET, RETROK_RIGHTBRACKET },
1521 { DOSKEY_BACKSLASH, RETROK_BACKSLASH },
1522
1523 { DOSKEY_CAPSLOCK, RETROK_CAPSLOCK },
1524 { DOSKEY_a, RETROK_a },
1525 { DOSKEY_s, RETROK_s },
1526 { DOSKEY_d, RETROK_d },
1527 { DOSKEY_f, RETROK_f },
1528 { DOSKEY_g, RETROK_g },
1529 { DOSKEY_h, RETROK_h },
1530 { DOSKEY_j, RETROK_j },
1531 { DOSKEY_k, RETROK_k },
1532 { DOSKEY_l, RETROK_l },
1533 { DOSKEY_SEMICOLON, RETROK_SEMICOLON },
1534 { DOSKEY_QUOTE, RETROK_QUOTE },
1535 { DOSKEY_RETURN, RETROK_RETURN },
1536
1537 { DOSKEY_LSHIFT, RETROK_LSHIFT },
1538 { DOSKEY_z, RETROK_z },
1539 { DOSKEY_x, RETROK_x },
1540 { DOSKEY_c, RETROK_c },
1541 { DOSKEY_v, RETROK_v },
1542 { DOSKEY_b, RETROK_b },
1543 { DOSKEY_n, RETROK_n },
1544 { DOSKEY_m, RETROK_m },
1545 { DOSKEY_COMMA, RETROK_COMMA },
1546 { DOSKEY_PERIOD, RETROK_PERIOD },
1547 { DOSKEY_SLASH, RETROK_SLASH },
1548 { DOSKEY_RSHIFT, RETROK_RSHIFT },
1549
1550 { DOSKEY_LCTRL, RETROK_LCTRL },
1551 { DOSKEY_LSUPER, RETROK_LSUPER },
1552 { DOSKEY_LALT, RETROK_LALT },
1553 { DOSKEY_SPACE, RETROK_SPACE },
1554 { DOSKEY_RALT, RETROK_RALT },
1555 { DOSKEY_RSUPER, RETROK_RSUPER },
1556 { DOSKEY_MENU, RETROK_MENU },
1557 { DOSKEY_RCTRL, RETROK_RCTRL },
1558
1559 { DOSKEY_UP, RETROK_UP },
1560 { DOSKEY_DOWN, RETROK_DOWN },
1561 { DOSKEY_LEFT, RETROK_LEFT },
1562 { DOSKEY_RIGHT, RETROK_RIGHT },
1563
1564 { DOSKEY_HOME, RETROK_HOME },
1565 { DOSKEY_END, RETROK_END },
1566 { DOSKEY_PGUP, RETROK_PAGEUP },
1567 { DOSKEY_PGDN, RETROK_PAGEDOWN },
1568
1569 { 0, RETROK_UNKNOWN }
1570 };
1571 #endif
1572
1573 #ifdef __PSL1GHT__
1574 const struct rarch_key_map rarch_key_map_psl1ght[] = {
1575 { KB_RAWKEY_A, RETROK_a },
1576 { KB_RAWKEY_B, RETROK_b },
1577 { KB_RAWKEY_C, RETROK_c },
1578 { KB_RAWKEY_D, RETROK_d },
1579 { KB_RAWKEY_E, RETROK_e },
1580 { KB_RAWKEY_F, RETROK_f },
1581 { KB_RAWKEY_G, RETROK_g },
1582 { KB_RAWKEY_H, RETROK_h },
1583 { KB_RAWKEY_I, RETROK_i },
1584 { KB_RAWKEY_J, RETROK_j },
1585 { KB_RAWKEY_K, RETROK_k },
1586 { KB_RAWKEY_L, RETROK_l },
1587 { KB_RAWKEY_M, RETROK_m },
1588 { KB_RAWKEY_N, RETROK_n },
1589 { KB_RAWKEY_O, RETROK_o },
1590 { KB_RAWKEY_P, RETROK_p },
1591 { KB_RAWKEY_Q, RETROK_q },
1592 { KB_RAWKEY_R, RETROK_r },
1593 { KB_RAWKEY_S, RETROK_s },
1594 { KB_RAWKEY_T, RETROK_t },
1595 { KB_RAWKEY_U, RETROK_u },
1596 { KB_RAWKEY_V, RETROK_v },
1597 { KB_RAWKEY_W, RETROK_w },
1598 { KB_RAWKEY_X, RETROK_x },
1599 { KB_RAWKEY_Y, RETROK_y },
1600 { KB_RAWKEY_Z, RETROK_z },
1601 { KB_RAWKEY_BS, RETROK_BACKSPACE },
1602 { KB_RAWKEY_TAB, RETROK_TAB },
1603 { KB_RAWKEY_ENTER, RETROK_RETURN },
1604 { KB_RAWKEY_PAUSE, RETROK_PAUSE },
1605 { KB_RAWKEY_ESCAPE, RETROK_ESCAPE },
1606 { KB_RAWKEY_SPACE, RETROK_SPACE },
1607 { KB_RAWKEY_QUOTATION_101, RETROK_QUOTE },
1608 { KB_RAWKEY_COMMA, RETROK_COMMA },
1609 { KB_RAWKEY_MINUS, RETROK_MINUS },
1610 { KB_RAWKEY_PERIOD, RETROK_PERIOD },
1611 { KB_RAWKEY_SLASH, RETROK_SLASH },
1612 { KB_RAWKEY_0, RETROK_0 },
1613 { KB_RAWKEY_1, RETROK_1 },
1614 { KB_RAWKEY_2, RETROK_2 },
1615 { KB_RAWKEY_3, RETROK_3 },
1616 { KB_RAWKEY_4, RETROK_4 },
1617 { KB_RAWKEY_5, RETROK_5 },
1618 { KB_RAWKEY_6, RETROK_6 },
1619 { KB_RAWKEY_7, RETROK_7 },
1620 { KB_RAWKEY_8, RETROK_8 },
1621 { KB_RAWKEY_9, RETROK_9 },
1622 { KB_RAWKEY_SEMICOLON, RETROK_SEMICOLON },
1623 { KB_RAWKEY_EQUAL_101, RETROK_EQUALS },
1624 { KB_RAWKEY_LEFT_BRACKET_101, RETROK_LEFTBRACKET },
1625 { KB_RAWKEY_BACKSLASH_101, RETROK_BACKSLASH },
1626 { KB_RAWKEY_RIGHT_BRACKET_101, RETROK_RIGHTBRACKET },
1627 { KB_RAWKEY_DELETE, RETROK_DELETE },
1628 { KB_RAWKEY_KPAD_0, RETROK_KP0 },
1629 { KB_RAWKEY_KPAD_1, RETROK_KP1 },
1630 { KB_RAWKEY_KPAD_2, RETROK_KP2 },
1631 { KB_RAWKEY_KPAD_3, RETROK_KP3 },
1632 { KB_RAWKEY_KPAD_4, RETROK_KP4 },
1633 { KB_RAWKEY_KPAD_5, RETROK_KP5 },
1634 { KB_RAWKEY_KPAD_6, RETROK_KP6 },
1635 { KB_RAWKEY_KPAD_7, RETROK_KP7 },
1636 { KB_RAWKEY_KPAD_8, RETROK_KP8 },
1637 { KB_RAWKEY_KPAD_9, RETROK_KP9 },
1638 { KB_RAWKEY_KPAD_PERIOD, RETROK_KP_PERIOD },
1639 { KB_RAWKEY_KPAD_SLASH, RETROK_KP_DIVIDE },
1640 { KB_RAWKEY_KPAD_ASTERISK, RETROK_KP_MULTIPLY },
1641 { KB_RAWKEY_KPAD_MINUS, RETROK_KP_MINUS },
1642 { KB_RAWKEY_KPAD_PLUS, RETROK_KP_PLUS },
1643 { KB_RAWKEY_KPAD_ENTER, RETROK_KP_ENTER },
1644 { KB_RAWKEY_UP_ARROW, RETROK_UP },
1645 { KB_RAWKEY_DOWN_ARROW, RETROK_DOWN },
1646 { KB_RAWKEY_RIGHT_ARROW, RETROK_RIGHT },
1647 { KB_RAWKEY_LEFT_ARROW, RETROK_LEFT },
1648 { KB_RAWKEY_INSERT, RETROK_INSERT },
1649 { KB_RAWKEY_HOME, RETROK_HOME },
1650 { KB_RAWKEY_END, RETROK_END },
1651 { KB_RAWKEY_PAGE_UP, RETROK_PAGEUP },
1652 { KB_RAWKEY_PAGE_DOWN, RETROK_PAGEDOWN },
1653 { KB_RAWKEY_F1, RETROK_F1 },
1654 { KB_RAWKEY_F2, RETROK_F2 },
1655 { KB_RAWKEY_F3, RETROK_F3 },
1656 { KB_RAWKEY_F4, RETROK_F4 },
1657 { KB_RAWKEY_F5, RETROK_F5 },
1658 { KB_RAWKEY_F6, RETROK_F6 },
1659 { KB_RAWKEY_F7, RETROK_F7 },
1660 { KB_RAWKEY_F8, RETROK_F8 },
1661 { KB_RAWKEY_F9, RETROK_F9 },
1662 { KB_RAWKEY_F10, RETROK_F10 },
1663 { KB_RAWKEY_F11, RETROK_F11 },
1664 { KB_RAWKEY_F12, RETROK_F12 },
1665 { KB_RAWKEY_KPAD_NUMLOCK, RETROK_NUMLOCK },
1666 { KB_RAWKEY_CAPS_LOCK, RETROK_CAPSLOCK },
1667 { KB_RAWKEY_SCROLL_LOCK, RETROK_SCROLLOCK },
1668 { KB_RAWKEY_PAUSE, RETROK_BREAK },
1669
1670 /*
1671 { KB_RAWKEY_HASHTILDE, RETROK_HASH },
1672 { KB_RAWKEY_KPLEFTPAREN, RETROK_LEFTPAREN },
1673 { KB_RAWKEY_KPRIGHTPAREN, RETROK_RIGHTPAREN },
1674 { KB_RAWKEY_LEFTMETA, RETROK_LMETA },
1675 { KB_RAWKEY_RIGHTMETA, RETROK_RMETA },
1676 { KB_RAWKEY_COMPOSE, RETROK_COMPOSE },
1677 { KB_RAWKEY_HELP, RETROK_HELP },
1678 { KB_RAWKEY_POWER, RETROK_POWER },
1679 { KB_RAWKEY_UNDO, RETROK_UNDO },
1680 { KB_RAWKEY_KPAD_EQUAL, RETROK_KP_EQUALS },
1681
1682 KB_RAWKEY_PRINTSCREEN
1683 KB_RAWKEY_APPLICATION
1684
1685 KB_RAWKEY_106_KANJI
1686 KB_RAWKEY_KANA
1687 KB_RAWKEY_HENKAN
1688 KB_RAWKEY_MUHENKAN
1689 KB_RAWKEY_ACCENT_CIRCONFLEX_106
1690 KB_RAWKEY_ATMARK_106
1691 KB_RAWKEY_LEFT_BRACKET_106
1692 KB_RAWKEY_RIGHT_BRACKET_106
1693 KB_RAWKEY_COLON_106
1694 KB_RAWKEY_BACKSLASH_106
1695 KB_RAWKEY_YEN_106 */
1696
1697 { 0, RETROK_UNKNOWN }
1698 };
1699 #endif
1700
1701 #if defined(_WIN32) && _WIN32_WINNT >= 0x0501 && !defined(__WINRT__)
1702 const struct rarch_key_map rarch_key_map_winraw[] = {
1703 { VK_BACK, RETROK_BACKSPACE },
1704 { VK_TAB, RETROK_TAB },
1705 { VK_CLEAR, RETROK_CLEAR },
1706 { VK_RETURN, RETROK_RETURN },
1707 { VK_PAUSE, RETROK_PAUSE },
1708 { VK_ESCAPE, RETROK_ESCAPE },
1709 { VK_MODECHANGE, RETROK_MODE },
1710 { VK_SPACE, RETROK_SPACE },
1711 { VK_PRIOR, RETROK_PAGEUP },
1712 { VK_NEXT, RETROK_PAGEDOWN },
1713 { VK_END, RETROK_END },
1714 { VK_HOME, RETROK_HOME },
1715 { VK_LEFT, RETROK_LEFT },
1716 { VK_UP, RETROK_UP },
1717 { VK_RIGHT, RETROK_RIGHT },
1718 { VK_DOWN, RETROK_DOWN },
1719 { VK_PRINT, RETROK_PRINT },
1720 { VK_INSERT, RETROK_INSERT },
1721 { VK_DELETE, RETROK_DELETE },
1722 { VK_HELP, RETROK_HELP },
1723 { 0x30, RETROK_0 },
1724 { 0x31, RETROK_1 },
1725 { 0x32, RETROK_2 },
1726 { 0x33, RETROK_3 },
1727 { 0x34, RETROK_4 },
1728 { 0x35, RETROK_5 },
1729 { 0x36, RETROK_6 },
1730 { 0x37, RETROK_7 },
1731 { 0x38, RETROK_8 },
1732 { 0x39, RETROK_9 },
1733 { 0x41, RETROK_a },
1734 { 0x42, RETROK_b },
1735 { 0x43, RETROK_c },
1736 { 0x44, RETROK_d },
1737 { 0x45, RETROK_e },
1738 { 0x46, RETROK_f },
1739 { 0x47, RETROK_g },
1740 { 0x48, RETROK_h },
1741 { 0x49, RETROK_i },
1742 { 0x4A, RETROK_j },
1743 { 0x4B, RETROK_k },
1744 { 0x4C, RETROK_l },
1745 { 0x4D, RETROK_m },
1746 { 0x4E, RETROK_n },
1747 { 0x4F, RETROK_o },
1748 { 0x50, RETROK_p },
1749 { 0x51, RETROK_q },
1750 { 0x52, RETROK_r },
1751 { 0x53, RETROK_s },
1752 { 0x54, RETROK_t },
1753 { 0x55, RETROK_u },
1754 { 0x56, RETROK_v },
1755 { 0x57, RETROK_w },
1756 { 0x58, RETROK_x },
1757 { 0x59, RETROK_y },
1758 { 0x5A, RETROK_z },
1759 { VK_LWIN, RETROK_LSUPER },
1760 { VK_RWIN, RETROK_RSUPER },
1761 { VK_APPS, RETROK_MENU },
1762 { VK_NUMPAD0, RETROK_KP0 },
1763 { VK_NUMPAD1, RETROK_KP1 },
1764 { VK_NUMPAD2, RETROK_KP2 },
1765 { VK_NUMPAD3, RETROK_KP3 },
1766 { VK_NUMPAD4, RETROK_KP4 },
1767 { VK_NUMPAD5, RETROK_KP5 },
1768 { VK_NUMPAD6, RETROK_KP6 },
1769 { VK_NUMPAD7, RETROK_KP7 },
1770 { VK_NUMPAD8, RETROK_KP8 },
1771 { VK_NUMPAD9, RETROK_KP9 },
1772 { VK_MULTIPLY, RETROK_KP_MULTIPLY },
1773 { VK_ADD, RETROK_KP_PLUS },
1774 { VK_SUBTRACT, RETROK_KP_MINUS },
1775 { VK_DECIMAL, RETROK_KP_PERIOD },
1776 { VK_DIVIDE, RETROK_KP_DIVIDE },
1777 { VK_F1, RETROK_F1 },
1778 { VK_F2, RETROK_F2 },
1779 { VK_F3, RETROK_F3 },
1780 { VK_F4, RETROK_F4 },
1781 { VK_F5, RETROK_F5 },
1782 { VK_F6, RETROK_F6 },
1783 { VK_F7, RETROK_F7 },
1784 { VK_F8, RETROK_F8 },
1785 { VK_F9, RETROK_F9 },
1786 { VK_F10, RETROK_F10 },
1787 { VK_F11, RETROK_F11 },
1788 { VK_F12, RETROK_F12 },
1789 { VK_F13, RETROK_F13 },
1790 { VK_F14, RETROK_F14 },
1791 { VK_F15, RETROK_F15 },
1792 { VK_NUMLOCK, RETROK_NUMLOCK },
1793 { VK_SCROLL, RETROK_SCROLLOCK },
1794 { VK_LSHIFT, RETROK_LSHIFT },
1795 { VK_RSHIFT, RETROK_RSHIFT },
1796 { VK_LCONTROL, RETROK_LCTRL },
1797 { VK_RCONTROL, RETROK_RCTRL },
1798 { VK_LMENU, RETROK_LALT },
1799 { VK_RMENU, RETROK_RALT },
1800 { 0xE0, RETROK_KP_ENTER },
1801 { VK_CAPITAL, RETROK_CAPSLOCK },
1802 { VK_OEM_1, RETROK_SEMICOLON },
1803 { VK_OEM_PLUS, RETROK_EQUALS },
1804 { VK_OEM_COMMA, RETROK_COMMA },
1805 { VK_OEM_MINUS, RETROK_MINUS },
1806 { VK_OEM_PERIOD, RETROK_PERIOD },
1807 { VK_OEM_2, RETROK_SLASH },
1808 { VK_OEM_3, RETROK_BACKQUOTE },
1809 { VK_OEM_4, RETROK_LEFTBRACKET },
1810 { VK_OEM_5, RETROK_BACKSLASH },
1811 { VK_OEM_6, RETROK_RIGHTBRACKET },
1812 { VK_OEM_7, RETROK_QUOTE },
1813 { VK_OEM_102, RETROK_OEM_102 },
1814 { 0, RETROK_UNKNOWN }
1815 };
1816 #endif
1817
1818 #ifdef __WINRT__
1819 /* Refer to uwp_main.cpp - on WinRT these constants are defined as C++ enum classes
1820 * so they can't be placed in a C source file */
1821 #endif
1822
1823 /* TODO/FIXME - global */
1824 enum retro_key rarch_keysym_lut[RETROK_LAST];
1825
1826 /* TODO/FIXME - static globals */
1827 static unsigned *rarch_keysym_rlut = NULL;
1828 static unsigned rarch_keysym_rlut_size = 0;
1829
1830 /**
1831 * input_keymaps_init_keyboard_lut:
1832 * @map : Keyboard map.
1833 *
1834 * Initializes and sets the keyboard layout to a keyboard map (@map).
1835 **/
input_keymaps_init_keyboard_lut(const struct rarch_key_map * map)1836 void input_keymaps_init_keyboard_lut(const struct rarch_key_map *map)
1837 {
1838 const struct rarch_key_map *map_start = map;
1839 memset(rarch_keysym_lut, 0, sizeof(rarch_keysym_lut));
1840 rarch_keysym_rlut_size = 0;
1841
1842 for (; map->rk != RETROK_UNKNOWN; map++)
1843 {
1844 rarch_keysym_lut[map->rk] = (enum retro_key)map->sym;
1845 if (map->sym > rarch_keysym_rlut_size)
1846 rarch_keysym_rlut_size = map->sym;
1847 }
1848
1849 if (rarch_keysym_rlut_size < 65536)
1850 {
1851 if (rarch_keysym_rlut)
1852 free(rarch_keysym_rlut);
1853
1854 rarch_keysym_rlut = (unsigned*)calloc(++rarch_keysym_rlut_size, sizeof(unsigned));
1855
1856 for (map = map_start; map->rk != RETROK_UNKNOWN; map++)
1857 rarch_keysym_rlut[map->sym] = (enum retro_key)map->rk;
1858 }
1859 else
1860 rarch_keysym_rlut_size = 0;
1861 }
1862
1863 /**
1864 * input_keymaps_translate_keysym_to_rk:
1865 * @sym : Key symbol.
1866 *
1867 * Translates a key symbol from the keyboard layout table
1868 * to an associated retro key identifier.
1869 *
1870 * Returns: Retro key identifier.
1871 **/
input_keymaps_translate_keysym_to_rk(unsigned sym)1872 enum retro_key input_keymaps_translate_keysym_to_rk(unsigned sym)
1873 {
1874 unsigned i;
1875
1876 /* Fast path */
1877 if (rarch_keysym_rlut && sym < rarch_keysym_rlut_size)
1878 return (enum retro_key)rarch_keysym_rlut[sym];
1879
1880 /* Slow path */
1881 for (i = 0; i < ARRAY_SIZE(rarch_keysym_lut); i++)
1882 {
1883 if (rarch_keysym_lut[i] != sym)
1884 continue;
1885
1886 return (enum retro_key)i;
1887 }
1888
1889 return RETROK_UNKNOWN;
1890 }
1891
1892 /**
1893 * input_keymaps_translate_rk_to_str:
1894 * @key : Retro key identifier.
1895 * @buf : Buffer.
1896 * @size : Size of @buf.
1897 *
1898 * Translates a retro key identifier to a human-readable
1899 * identifier string.
1900 **/
input_keymaps_translate_rk_to_str(enum retro_key key,char * buf,size_t size)1901 void input_keymaps_translate_rk_to_str(enum retro_key key, char *buf, size_t size)
1902 {
1903 unsigned i;
1904
1905 retro_assert(size >= 2);
1906 *buf = '\0';
1907
1908 if (key >= RETROK_a && key <= RETROK_z)
1909 {
1910 buf[0] = (key - RETROK_a) + 'a';
1911 buf[1] = '\0';
1912 return;
1913 }
1914
1915 for (i = 0; input_config_key_map[i].str; i++)
1916 {
1917 if (input_config_key_map[i].key != key)
1918 continue;
1919
1920 strlcpy(buf, input_config_key_map[i].str, size);
1921 break;
1922 }
1923 }
1924