2 * Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3, as published
6 * by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranties of
10 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11 * PURPOSE. See the GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program. If not, see <http://www.gnu.org/licenses/>.
17 #pragma GCC diagnostic push
18 #pragma GCC diagnostic ignored "-Wswitch-default"
19 #include "anbox/platform/sdl/keycode_converter.h"
20 #pragma GCC diagnostic pop
22 #include <linux/input.h>
27 std::uint16_t KeycodeConverter::convert(const SDL_Scancode &scan_code) {
28 for (std::uint16_t n = 0; n < code_map.size(); n++) {
29 if (code_map[n] == scan_code) return n;
34 const std::array<SDL_Scancode, 249> KeycodeConverter::code_map = {{
35 SDL_SCANCODE_UNKNOWN, /* KEY_RESERVED 0 */
36 SDL_SCANCODE_ESCAPE, /* KEY_ESC 1 */
37 SDL_SCANCODE_1, /* KEY_1 2 */
38 SDL_SCANCODE_2, /* KEY_2 3 */
39 SDL_SCANCODE_3, /* KEY_3 4 */
40 SDL_SCANCODE_4, /* KEY_4 5 */
41 SDL_SCANCODE_5, /* KEY_5 6 */
42 SDL_SCANCODE_6, /* KEY_6 7 */
43 SDL_SCANCODE_7, /* KEY_7 8 */
44 SDL_SCANCODE_8, /* KEY_8 9 */
45 SDL_SCANCODE_9, /* KEY_9 10 */
46 SDL_SCANCODE_0, /* KEY_0 11 */
47 SDL_SCANCODE_MINUS, /* KEY_MINUS 12 */
48 SDL_SCANCODE_EQUALS, /* KEY_EQUAL 13 */
49 SDL_SCANCODE_BACKSPACE, /* KEY_BACKSPACE 14 */
50 SDL_SCANCODE_TAB, /* KEY_TAB 15 */
51 SDL_SCANCODE_Q, /* KEY_Q 16 */
52 SDL_SCANCODE_W, /* KEY_W 17 */
53 SDL_SCANCODE_E, /* KEY_E 18 */
54 SDL_SCANCODE_R, /* KEY_R 19 */
55 SDL_SCANCODE_T, /* KEY_T 20 */
56 SDL_SCANCODE_Y, /* KEY_Y 21 */
57 SDL_SCANCODE_U, /* KEY_U 22 */
58 SDL_SCANCODE_I, /* KEY_I 23 */
59 SDL_SCANCODE_O, /* KEY_O 24 */
60 SDL_SCANCODE_P, /* KEY_P 25 */
61 SDL_SCANCODE_LEFTBRACKET, /* KEY_LEFTBRACE 26 */
62 SDL_SCANCODE_RIGHTBRACKET, /* KEY_RIGHTBRACE 27 */
63 SDL_SCANCODE_RETURN, /* KEY_ENTER 28 */
64 SDL_SCANCODE_LCTRL, /* KEY_LEFTCTRL 29 */
65 SDL_SCANCODE_A, /* KEY_A 30 */
66 SDL_SCANCODE_S, /* KEY_S 31 */
67 SDL_SCANCODE_D, /* KEY_D 32 */
68 SDL_SCANCODE_F, /* KEY_F 33 */
69 SDL_SCANCODE_G, /* KEY_G 34 */
70 SDL_SCANCODE_H, /* KEY_H 35 */
71 SDL_SCANCODE_J, /* KEY_J 36 */
72 SDL_SCANCODE_K, /* KEY_K 37 */
73 SDL_SCANCODE_L, /* KEY_L 38 */
74 SDL_SCANCODE_SEMICOLON, /* KEY_SEMICOLON 39 */
75 SDL_SCANCODE_APOSTROPHE, /* KEY_APOSTROPHE 40 */
76 SDL_SCANCODE_GRAVE, /* KEY_GRAVE 41 */
77 SDL_SCANCODE_LSHIFT, /* KEY_LEFTSHIFT 42 */
78 SDL_SCANCODE_BACKSLASH, /* KEY_BACKSLASH 43 */
79 SDL_SCANCODE_Z, /* KEY_Z 44 */
80 SDL_SCANCODE_X, /* KEY_X 45 */
81 SDL_SCANCODE_C, /* KEY_C 46 */
82 SDL_SCANCODE_V, /* KEY_V 47 */
83 SDL_SCANCODE_B, /* KEY_B 48 */
84 SDL_SCANCODE_N, /* KEY_N 49 */
85 SDL_SCANCODE_M, /* KEY_M 50 */
86 SDL_SCANCODE_COMMA, /* KEY_COMMA 51 */
87 SDL_SCANCODE_PERIOD, /* KEY_DOT 52 */
88 SDL_SCANCODE_SLASH, /* KEY_SLASH 53 */
89 SDL_SCANCODE_RSHIFT, /* KEY_RIGHTSHIFT 54 */
90 SDL_SCANCODE_KP_MULTIPLY, /* KEY_KPASTERISK 55 */
91 SDL_SCANCODE_LALT, /* KEY_LEFTALT 56 */
92 SDL_SCANCODE_SPACE, /* KEY_SPACE 57 */
93 SDL_SCANCODE_CAPSLOCK, /* KEY_CAPSLOCK 58 */
94 SDL_SCANCODE_F1, /* KEY_F1 59 */
95 SDL_SCANCODE_F2, /* KEY_F2 60 */
96 SDL_SCANCODE_F3, /* KEY_F3 61 */
97 SDL_SCANCODE_F4, /* KEY_F4 62 */
98 SDL_SCANCODE_F5, /* KEY_F5 63 */
99 SDL_SCANCODE_F6, /* KEY_F6 64 */
100 SDL_SCANCODE_F7, /* KEY_F7 65 */
101 SDL_SCANCODE_F8, /* KEY_F8 66 */
102 SDL_SCANCODE_F9, /* KEY_F9 67 */
103 SDL_SCANCODE_F10, /* KEY_F10 68 */
104 SDL_SCANCODE_NUMLOCKCLEAR, /* KEY_NUMLOCK 69 */
105 SDL_SCANCODE_SCROLLLOCK, /* KEY_SCROLLLOCK 70 */
106 SDL_SCANCODE_KP_7, /* KEY_KP7 71 */
107 SDL_SCANCODE_KP_8, /* KEY_KP8 72 */
108 SDL_SCANCODE_KP_9, /* KEY_KP9 73 */
109 SDL_SCANCODE_KP_MINUS, /* KEY_KPMINUS 74 */
110 SDL_SCANCODE_KP_4, /* KEY_KP4 75 */
111 SDL_SCANCODE_KP_5, /* KEY_KP5 76 */
112 SDL_SCANCODE_KP_6, /* KEY_KP6 77 */
113 SDL_SCANCODE_KP_PLUS, /* KEY_KPPLUS 78 */
114 SDL_SCANCODE_KP_1, /* KEY_KP1 79 */
115 SDL_SCANCODE_KP_2, /* KEY_KP2 80 */
116 SDL_SCANCODE_KP_3, /* KEY_KP3 81 */
117 SDL_SCANCODE_KP_0, /* KEY_KP0 82 */
118 SDL_SCANCODE_KP_PERIOD, /* KEY_KPDOT 83 */
119 SDL_SCANCODE_UNKNOWN, /* 84 */
120 SDL_SCANCODE_LANG5, /* KEY_ZENKAKUHANKAKU 85 */
121 SDL_SCANCODE_UNKNOWN, /* KEY_102ND 86 */
122 SDL_SCANCODE_F11, /* KEY_F11 87 */
123 SDL_SCANCODE_F12, /* KEY_F12 88 */
124 SDL_SCANCODE_UNKNOWN, /* KEY_RO 89 */
125 SDL_SCANCODE_LANG3, /* KEY_KATAKANA 90 */
126 SDL_SCANCODE_LANG4, /* KEY_HIRAGANA 91 */
127 SDL_SCANCODE_UNKNOWN, /* KEY_HENKAN 92 */
128 SDL_SCANCODE_LANG3, /* KEY_KATAKANAHIRAGANA 93 */
129 SDL_SCANCODE_UNKNOWN, /* KEY_MUHENKAN 94 */
130 SDL_SCANCODE_KP_COMMA, /* KEY_KPJPCOMMA 95 */
131 SDL_SCANCODE_KP_ENTER, /* KEY_KPENTER 96 */
132 SDL_SCANCODE_RCTRL, /* KEY_RIGHTCTRL 97 */
133 SDL_SCANCODE_KP_DIVIDE, /* KEY_KPSLASH 98 */
134 SDL_SCANCODE_SYSREQ, /* KEY_SYSRQ 99 */
135 SDL_SCANCODE_RALT, /* KEY_RIGHTALT 100 */
136 SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED 101 */
137 SDL_SCANCODE_HOME, /* KEY_HOME 102 */
138 SDL_SCANCODE_UP, /* KEY_UP 103 */
139 SDL_SCANCODE_PAGEUP, /* KEY_PAGEUP 104 */
140 SDL_SCANCODE_LEFT, /* KEY_LEFT 105 */
141 SDL_SCANCODE_RIGHT, /* KEY_RIGHT 106 */
142 SDL_SCANCODE_END, /* KEY_END 107 */
143 SDL_SCANCODE_DOWN, /* KEY_DOWN 108 */
144 SDL_SCANCODE_PAGEDOWN, /* KEY_PAGEDOWN 109 */
145 SDL_SCANCODE_INSERT, /* KEY_INSERT 110 */
146 SDL_SCANCODE_DELETE, /* KEY_DELETE 111 */
147 SDL_SCANCODE_UNKNOWN, /* KEY_MACRO 112 */
148 SDL_SCANCODE_MUTE, /* KEY_MUTE 113 */
149 SDL_SCANCODE_VOLUMEDOWN, /* KEY_VOLUMEDOWN 114 */
150 SDL_SCANCODE_VOLUMEUP, /* KEY_VOLUMEUP 115 */
151 SDL_SCANCODE_POWER, /* KEY_POWER 116 SC System Power Down */
152 SDL_SCANCODE_KP_EQUALS, /* KEY_KPEQUAL 117 */
153 SDL_SCANCODE_KP_MINUS, /* KEY_KPPLUSMINUS 118 */
154 SDL_SCANCODE_PAUSE, /* KEY_PAUSE 119 */
155 SDL_SCANCODE_UNKNOWN, /* KEY_SCALE 120 AL Compiz Scale (Expose) */
156 SDL_SCANCODE_KP_COMMA, /* KEY_KPCOMMA 121 */
157 SDL_SCANCODE_LANG1, /* KEY_HANGEUL,KEY_HANGUEL 122 */
158 SDL_SCANCODE_LANG2, /* KEY_HANJA 123 */
159 SDL_SCANCODE_INTERNATIONAL3, /* KEY_YEN 124 */
160 SDL_SCANCODE_LGUI, /* KEY_LEFTMETA 125 */
161 SDL_SCANCODE_RGUI, /* KEY_RIGHTMETA 126 */
162 SDL_SCANCODE_APPLICATION, /* KEY_COMPOSE 127 */
163 SDL_SCANCODE_STOP, /* KEY_STOP 128 AC Stop */
164 SDL_SCANCODE_AGAIN, /* KEY_AGAIN 129 */
165 SDL_SCANCODE_UNKNOWN, /* KEY_PROPS 130 AC Properties */
166 SDL_SCANCODE_UNDO, /* KEY_UNDO 131 AC Undo */
167 SDL_SCANCODE_UNKNOWN, /* KEY_FRONT 132 */
168 SDL_SCANCODE_COPY, /* KEY_COPY 133 AC Copy */
169 SDL_SCANCODE_UNKNOWN, /* KEY_OPEN 134 AC Open */
170 SDL_SCANCODE_PASTE, /* KEY_PASTE 135 AC Paste */
171 SDL_SCANCODE_FIND, /* KEY_FIND 136 AC Search */
172 SDL_SCANCODE_CUT, /* KEY_CUT 137 AC Cut */
173 SDL_SCANCODE_HELP, /* KEY_HELP 138 AL Integrated Help Center */
174 SDL_SCANCODE_MENU, /* KEY_MENU 139 Menu (show menu) */
175 SDL_SCANCODE_CALCULATOR, /* KEY_CALC 140 AL Calculator */
176 SDL_SCANCODE_UNKNOWN, /* KEY_SETUP 141 */
177 SDL_SCANCODE_SLEEP, /* KEY_SLEEP 142 SC System Sleep */
178 SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP 143 System Wake Up */
179 SDL_SCANCODE_UNKNOWN, /* KEY_FILE 144 AL Local Machine Browser */
180 SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE 145 */
181 SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE 146 */
182 SDL_SCANCODE_UNKNOWN, /* KEY_XFER 147 */
183 SDL_SCANCODE_APP1, /* KEY_PROG1 148 */
184 SDL_SCANCODE_APP1, /* KEY_PROG2 149 */
185 SDL_SCANCODE_WWW, /* KEY_WWW 150 AL Internet Browser */
186 SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS 151 */
187 SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE,KEY_SCREENLOCK 152 AL Terminal
189 SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTION 153 */
190 SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS 154 */
191 SDL_SCANCODE_MAIL, /* KEY_MAIL 155 */
192 SDL_SCANCODE_AC_BOOKMARKS, /* KEY_BOOKMARKS 156 AC Bookmarks */
193 SDL_SCANCODE_COMPUTER, /* KEY_COMPUTER 157 */
194 SDL_SCANCODE_AC_BACK, /* KEY_BACK 158 AC Back */
195 SDL_SCANCODE_AC_FORWARD, /* KEY_FORWARD 159 AC Forward */
196 SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD 160 */
197 SDL_SCANCODE_EJECT, /* KEY_EJECTCD 161 */
198 SDL_SCANCODE_UNKNOWN, /* KEY_EJECTCLOSECD 162 */
199 SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG 163 */
200 SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE 164 */
201 SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG 165 */
202 SDL_SCANCODE_AUDIOSTOP, /* KEY_STOPCD 166 */
203 SDL_SCANCODE_UNKNOWN, /* KEY_RECORD 167 */
204 SDL_SCANCODE_UNKNOWN, /* KEY_REWIND 168 */
205 SDL_SCANCODE_UNKNOWN, /* KEY_PHONE 169 Media Select Telephone */
206 SDL_SCANCODE_UNKNOWN, /* KEY_ISO 170 */
207 SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG 171 AL Consumer Control
209 SDL_SCANCODE_AC_HOME, /* KEY_HOMEPAGE 172 AC Home */
210 SDL_SCANCODE_AC_REFRESH, /* KEY_REFRESH 173 AC Refresh */
211 SDL_SCANCODE_UNKNOWN, /* KEY_EXIT 174 AC Exit */
212 SDL_SCANCODE_UNKNOWN, /* KEY_MOVE 175 */
213 SDL_SCANCODE_UNKNOWN, /* KEY_EDIT 176 */
214 SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP 177 */
215 SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN 178 */
216 SDL_SCANCODE_KP_LEFTPAREN, /* KEY_KPLEFTPAREN 179 */
217 SDL_SCANCODE_KP_RIGHTPAREN, /* KEY_KPRIGHTPAREN 180 */
218 SDL_SCANCODE_UNKNOWN, /* KEY_NEW 181 AC New */
219 SDL_SCANCODE_AGAIN, /* KEY_REDO 182 AC Redo/Repeat */
220 SDL_SCANCODE_F13, /* KEY_F13 183 */
221 SDL_SCANCODE_F14, /* KEY_F14 184 */
222 SDL_SCANCODE_F15, /* KEY_F15 185 */
223 SDL_SCANCODE_F16, /* KEY_F16 186 */
224 SDL_SCANCODE_F17, /* KEY_F17 187 */
225 SDL_SCANCODE_F18, /* KEY_F18 188 */
226 SDL_SCANCODE_F19, /* KEY_F19 189 */
227 SDL_SCANCODE_F20, /* KEY_F20 190 */
228 SDL_SCANCODE_F21, /* KEY_F21 191 */
229 SDL_SCANCODE_F22, /* KEY_F22 192 */
230 SDL_SCANCODE_F23, /* KEY_F23 193 */
231 SDL_SCANCODE_F24, /* KEY_F24 194 */
232 SDL_SCANCODE_UNKNOWN, /* 195 */
233 SDL_SCANCODE_UNKNOWN, /* 196 */
234 SDL_SCANCODE_UNKNOWN, /* 197 */
235 SDL_SCANCODE_UNKNOWN, /* 198 */
236 SDL_SCANCODE_UNKNOWN, /* 199 */
237 SDL_SCANCODE_UNKNOWN, /* KEY_PLAYCD 200 */
238 SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD 201 */
239 SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 202 */
240 SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 203 */
241 SDL_SCANCODE_UNKNOWN, /* KEY_DASHBOARD 204 AL Dashboard */
242 SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND 205 */
243 SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE 206 AC Close */
244 SDL_SCANCODE_UNKNOWN, /* KEY_PLAY 207 */
245 SDL_SCANCODE_UNKNOWN, /* KEY_FASTFORWARD 208 */
246 SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST 209 */
247 SDL_SCANCODE_UNKNOWN, /* KEY_PRINT 210 AC Print */
248 SDL_SCANCODE_UNKNOWN, /* KEY_HP 211 */
249 SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA 212 */
250 SDL_SCANCODE_UNKNOWN, /* KEY_SOUND 213 */
251 SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION 214 */
252 SDL_SCANCODE_UNKNOWN, /* KEY_EMAIL 215 */
253 SDL_SCANCODE_UNKNOWN, /* KEY_CHAT 216 */
254 SDL_SCANCODE_UNKNOWN, /* KEY_SEARCH 217 */
255 SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT 218 */
256 SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE 219 AL Checkbook/Finance */
257 SDL_SCANCODE_UNKNOWN, /* KEY_SPORT 220 */
258 SDL_SCANCODE_UNKNOWN, /* KEY_SHOP 221 */
259 SDL_SCANCODE_UNKNOWN, /* KEY_ALTERASE 222 */
260 SDL_SCANCODE_UNKNOWN, /* KEY_CANCEL 223 AC Cancel */
261 SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESSDOWN 224 */
262 SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESSUP 225 */
263 SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA 226 */
264 SDL_SCANCODE_UNKNOWN, /* KEY_SWITCHVIDEOMODE 227 Cycle between available
265 video outputs (Monitor/LCD/TV-out/etc) */
266 SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMTOGGLE 228 */
267 SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMDOWN 229 */
268 SDL_SCANCODE_UNKNOWN, /* KEY_KBDILLUMUP 230 */
269 SDL_SCANCODE_UNKNOWN, /* KEY_SEND 231 AC Send */
270 SDL_SCANCODE_UNKNOWN, /* KEY_REPLY 232 AC Reply */
271 SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL 233 AC Forward Msg */
272 SDL_SCANCODE_UNKNOWN, /* KEY_SAVE 234 AC Save */
273 SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS 235 */
274 SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY 236 */
275 SDL_SCANCODE_UNKNOWN, /* KEY_BLUETOOTH 237 */
276 SDL_SCANCODE_UNKNOWN, /* KEY_WLAN 238 */
277 SDL_SCANCODE_UNKNOWN, /* KEY_UWB 239 */
278 SDL_SCANCODE_UNKNOWN, /* KEY_UNKNOWN 240 */
279 SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_NEXT 241 drive next video source */
280 SDL_SCANCODE_UNKNOWN, /* KEY_VIDEO_PREV 242 drive previous video
282 SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_CYCLE 243 brightness up, after
284 SDL_SCANCODE_UNKNOWN, /* KEY_BRIGHTNESS_ZERO 244 brightness off, use
286 SDL_SCANCODE_UNKNOWN, /* KEY_DISPLAY_OFF 245 display device to off
288 SDL_SCANCODE_UNKNOWN, /* KEY_WIMAX 246 */
289 SDL_SCANCODE_UNKNOWN, /* KEY_RFKILL 247 Key that controls all radios
291 SDL_SCANCODE_UNKNOWN /* KEY_MICMUTE 248 Mute / unmute the microphone */
294 } // namespace platform