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