Keyboard.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. /**
  2. * Copyright (c) 2006-2022 LOVE Development Team
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty. In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. *
  8. * Permission is granted to anyone to use this software for any purpose,
  9. * including commercial applications, and to alter it and redistribute it
  10. * freely, subject to the following restrictions:
  11. *
  12. * 1. The origin of this software must not be misrepresented; you must not
  13. * claim that you wrote the original software. If you use this software
  14. * in a product, an acknowledgment in the product documentation would be
  15. * appreciated but is not required.
  16. * 2. Altered source versions must be plainly marked as such, and must not be
  17. * misrepresented as being the original software.
  18. * 3. This notice may not be removed or altered from any source distribution.
  19. **/
  20. #include <SDL_version.h>
  21. #include "Keyboard.h"
  22. #include "window/Window.h"
  23. // SDL before 2.0.18 lack KMOD_SCROLL. Use KMOD_RESERVED instead.
  24. #if !SDL_VERSION_ATLEAST(2, 0, 18)
  25. #define KMOD_SCROLL KMOD_RESERVED
  26. #endif // !SDL_VERSION_ATLEAST(2, 0, 18)
  27. namespace love
  28. {
  29. namespace keyboard
  30. {
  31. namespace sdl
  32. {
  33. Keyboard::Keyboard()
  34. : key_repeat(false)
  35. {
  36. }
  37. const char *Keyboard::getName() const
  38. {
  39. return "love.keyboard.sdl";
  40. }
  41. void Keyboard::setKeyRepeat(bool enable)
  42. {
  43. key_repeat = enable;
  44. }
  45. bool Keyboard::hasKeyRepeat() const
  46. {
  47. return key_repeat;
  48. }
  49. bool Keyboard::isDown(const std::vector<Key> &keylist) const
  50. {
  51. const Uint8 *state = SDL_GetKeyboardState(nullptr);
  52. for (Key key : keylist)
  53. {
  54. SDL_Scancode scancode = SDL_GetScancodeFromKey(keymap[key]);
  55. if (state[scancode])
  56. return true;
  57. }
  58. return false;
  59. }
  60. bool Keyboard::isScancodeDown(const std::vector<Scancode> &scancodelist) const
  61. {
  62. const Uint8 *state = SDL_GetKeyboardState(nullptr);
  63. for (Scancode scancode : scancodelist)
  64. {
  65. SDL_Scancode sdlcode = SDL_SCANCODE_UNKNOWN;
  66. if (scancodes.find(scancode, sdlcode) && state[sdlcode])
  67. return true;
  68. }
  69. return false;
  70. }
  71. bool Keyboard::isModifierActive(ModifierKey key) const
  72. {
  73. int modstate = SDL_GetModState();
  74. switch (key)
  75. {
  76. case MODKEY_NUMLOCK:
  77. return (modstate & KMOD_NUM) != 0;
  78. case MODKEY_CAPSLOCK:
  79. return (modstate & KMOD_CAPS) != 0;
  80. case MODKEY_SCROLLLOCK:
  81. return (modstate & KMOD_SCROLL) != 0;
  82. case MODKEY_MODE:
  83. return (modstate & KMOD_MODE) != 0;
  84. default:
  85. break;
  86. }
  87. return false;
  88. }
  89. Keyboard::Key Keyboard::getKeyFromScancode(Scancode scancode) const
  90. {
  91. SDL_Scancode sdlscancode = SDL_SCANCODE_UNKNOWN;
  92. scancodes.find(scancode, sdlscancode);
  93. SDL_Keycode sdlkey = SDL_GetKeyFromScancode(sdlscancode);
  94. for (int i = 0; i < KEY_MAX_ENUM; i++)
  95. {
  96. if (keymap[i] == sdlkey)
  97. return (Key) i;
  98. }
  99. return KEY_UNKNOWN;
  100. }
  101. Keyboard::Scancode Keyboard::getScancodeFromKey(Key key) const
  102. {
  103. Scancode scancode = SCANCODE_UNKNOWN;
  104. if (key != KEY_MAX_ENUM)
  105. {
  106. SDL_Keycode sdlkey = keymap[key];
  107. SDL_Scancode sdlscancode = SDL_GetScancodeFromKey(sdlkey);
  108. scancodes.find(sdlscancode, scancode);
  109. }
  110. return scancode;
  111. }
  112. void Keyboard::setTextInput(bool enable)
  113. {
  114. if (enable)
  115. SDL_StartTextInput();
  116. else
  117. SDL_StopTextInput();
  118. }
  119. void Keyboard::setTextInput(bool enable, double x, double y, double w, double h)
  120. {
  121. // SDL_SetTextInputRect expects coordinates in window-space but setTextInput
  122. // takes pixels, so we should convert.
  123. auto window = Module::getInstance<window::Window>(M_WINDOW);
  124. if (window)
  125. {
  126. window->DPIToWindowCoords(&x, &y);
  127. window->DPIToWindowCoords(&w, &h);
  128. }
  129. SDL_Rect rect = {(int) x, (int) y, (int) w, (int) h};
  130. SDL_SetTextInputRect(&rect);
  131. setTextInput(enable);
  132. }
  133. bool Keyboard::hasTextInput() const
  134. {
  135. return SDL_IsTextInputActive() != SDL_FALSE;
  136. }
  137. bool Keyboard::hasScreenKeyboard() const
  138. {
  139. return SDL_HasScreenKeyboardSupport() != SDL_FALSE;
  140. }
  141. bool Keyboard::getConstant(Scancode in, SDL_Scancode &out)
  142. {
  143. return scancodes.find(in, out);
  144. }
  145. bool Keyboard::getConstant(SDL_Scancode in, Scancode &out)
  146. {
  147. return scancodes.find(in, out);
  148. }
  149. const SDL_Keycode *Keyboard::createKeyMap()
  150. {
  151. // Array must be static so its lifetime continues once the function returns.
  152. static SDL_Keycode k[Keyboard::KEY_MAX_ENUM] = {SDLK_UNKNOWN};
  153. k[Keyboard::KEY_UNKNOWN] = SDLK_UNKNOWN;
  154. k[Keyboard::KEY_RETURN] = SDLK_RETURN;
  155. k[Keyboard::KEY_ESCAPE] = SDLK_ESCAPE;
  156. k[Keyboard::KEY_BACKSPACE] = SDLK_BACKSPACE;
  157. k[Keyboard::KEY_TAB] = SDLK_TAB;
  158. k[Keyboard::KEY_SPACE] = SDLK_SPACE;
  159. k[Keyboard::KEY_EXCLAIM] = SDLK_EXCLAIM;
  160. k[Keyboard::KEY_QUOTEDBL] = SDLK_QUOTEDBL;
  161. k[Keyboard::KEY_HASH] = SDLK_HASH;
  162. k[Keyboard::KEY_PERCENT] = SDLK_PERCENT;
  163. k[Keyboard::KEY_DOLLAR] = SDLK_DOLLAR;
  164. k[Keyboard::KEY_AMPERSAND] = SDLK_AMPERSAND;
  165. k[Keyboard::KEY_QUOTE] = SDLK_QUOTE;
  166. k[Keyboard::KEY_LEFTPAREN] = SDLK_LEFTPAREN;
  167. k[Keyboard::KEY_RIGHTPAREN] = SDLK_RIGHTPAREN;
  168. k[Keyboard::KEY_ASTERISK] = SDLK_ASTERISK;
  169. k[Keyboard::KEY_PLUS] = SDLK_PLUS;
  170. k[Keyboard::KEY_COMMA] = SDLK_COMMA;
  171. k[Keyboard::KEY_MINUS] = SDLK_MINUS;
  172. k[Keyboard::KEY_PERIOD] = SDLK_PERIOD;
  173. k[Keyboard::KEY_SLASH] = SDLK_SLASH;
  174. k[Keyboard::KEY_0] = SDLK_0;
  175. k[Keyboard::KEY_1] = SDLK_1;
  176. k[Keyboard::KEY_2] = SDLK_2;
  177. k[Keyboard::KEY_3] = SDLK_3;
  178. k[Keyboard::KEY_4] = SDLK_4;
  179. k[Keyboard::KEY_5] = SDLK_5;
  180. k[Keyboard::KEY_6] = SDLK_6;
  181. k[Keyboard::KEY_7] = SDLK_7;
  182. k[Keyboard::KEY_8] = SDLK_8;
  183. k[Keyboard::KEY_9] = SDLK_9;
  184. k[Keyboard::KEY_COLON] = SDLK_COLON;
  185. k[Keyboard::KEY_SEMICOLON] = SDLK_SEMICOLON;
  186. k[Keyboard::KEY_LESS] = SDLK_LESS;
  187. k[Keyboard::KEY_EQUALS] = SDLK_EQUALS;
  188. k[Keyboard::KEY_GREATER] = SDLK_GREATER;
  189. k[Keyboard::KEY_QUESTION] = SDLK_QUESTION;
  190. k[Keyboard::KEY_AT] = SDLK_AT;
  191. k[Keyboard::KEY_LEFTBRACKET] = SDLK_LEFTBRACKET;
  192. k[Keyboard::KEY_BACKSLASH] = SDLK_BACKSLASH;
  193. k[Keyboard::KEY_RIGHTBRACKET] = SDLK_RIGHTBRACKET;
  194. k[Keyboard::KEY_CARET] = SDLK_CARET;
  195. k[Keyboard::KEY_UNDERSCORE] = SDLK_UNDERSCORE;
  196. k[Keyboard::KEY_BACKQUOTE] = SDLK_BACKQUOTE;
  197. k[Keyboard::KEY_A] = SDLK_a;
  198. k[Keyboard::KEY_B] = SDLK_b;
  199. k[Keyboard::KEY_C] = SDLK_c;
  200. k[Keyboard::KEY_D] = SDLK_d;
  201. k[Keyboard::KEY_E] = SDLK_e;
  202. k[Keyboard::KEY_F] = SDLK_f;
  203. k[Keyboard::KEY_G] = SDLK_g;
  204. k[Keyboard::KEY_H] = SDLK_h;
  205. k[Keyboard::KEY_I] = SDLK_i;
  206. k[Keyboard::KEY_J] = SDLK_j;
  207. k[Keyboard::KEY_K] = SDLK_k;
  208. k[Keyboard::KEY_L] = SDLK_l;
  209. k[Keyboard::KEY_M] = SDLK_m;
  210. k[Keyboard::KEY_N] = SDLK_n;
  211. k[Keyboard::KEY_O] = SDLK_o;
  212. k[Keyboard::KEY_P] = SDLK_p;
  213. k[Keyboard::KEY_Q] = SDLK_q;
  214. k[Keyboard::KEY_R] = SDLK_r;
  215. k[Keyboard::KEY_S] = SDLK_s;
  216. k[Keyboard::KEY_T] = SDLK_t;
  217. k[Keyboard::KEY_U] = SDLK_u;
  218. k[Keyboard::KEY_V] = SDLK_v;
  219. k[Keyboard::KEY_W] = SDLK_w;
  220. k[Keyboard::KEY_X] = SDLK_x;
  221. k[Keyboard::KEY_Y] = SDLK_y;
  222. k[Keyboard::KEY_Z] = SDLK_z;
  223. k[Keyboard::KEY_CAPSLOCK] = SDLK_CAPSLOCK;
  224. k[Keyboard::KEY_F1] = SDLK_F1;
  225. k[Keyboard::KEY_F2] = SDLK_F2;
  226. k[Keyboard::KEY_F3] = SDLK_F3;
  227. k[Keyboard::KEY_F4] = SDLK_F4;
  228. k[Keyboard::KEY_F5] = SDLK_F5;
  229. k[Keyboard::KEY_F6] = SDLK_F6;
  230. k[Keyboard::KEY_F7] = SDLK_F7;
  231. k[Keyboard::KEY_F8] = SDLK_F8;
  232. k[Keyboard::KEY_F9] = SDLK_F9;
  233. k[Keyboard::KEY_F10] = SDLK_F10;
  234. k[Keyboard::KEY_F11] = SDLK_F11;
  235. k[Keyboard::KEY_F12] = SDLK_F12;
  236. k[Keyboard::KEY_PRINTSCREEN] = SDLK_PRINTSCREEN;
  237. k[Keyboard::KEY_SCROLLLOCK] = SDLK_SCROLLLOCK;
  238. k[Keyboard::KEY_PAUSE] = SDLK_PAUSE;
  239. k[Keyboard::KEY_INSERT] = SDLK_INSERT;
  240. k[Keyboard::KEY_HOME] = SDLK_HOME;
  241. k[Keyboard::KEY_PAGEUP] = SDLK_PAGEUP;
  242. k[Keyboard::KEY_DELETE] = SDLK_DELETE;
  243. k[Keyboard::KEY_END] = SDLK_END;
  244. k[Keyboard::KEY_PAGEDOWN] = SDLK_PAGEDOWN;
  245. k[Keyboard::KEY_RIGHT] = SDLK_RIGHT;
  246. k[Keyboard::KEY_LEFT] = SDLK_LEFT;
  247. k[Keyboard::KEY_DOWN] = SDLK_DOWN;
  248. k[Keyboard::KEY_UP] = SDLK_UP;
  249. k[Keyboard::KEY_NUMLOCKCLEAR] = SDLK_NUMLOCKCLEAR;
  250. k[Keyboard::KEY_KP_DIVIDE] = SDLK_KP_DIVIDE;
  251. k[Keyboard::KEY_KP_MULTIPLY] = SDLK_KP_MULTIPLY;
  252. k[Keyboard::KEY_KP_MINUS] = SDLK_KP_MINUS;
  253. k[Keyboard::KEY_KP_PLUS] = SDLK_KP_PLUS;
  254. k[Keyboard::KEY_KP_ENTER] = SDLK_KP_ENTER;
  255. k[Keyboard::KEY_KP_0] = SDLK_KP_0;
  256. k[Keyboard::KEY_KP_1] = SDLK_KP_1;
  257. k[Keyboard::KEY_KP_2] = SDLK_KP_2;
  258. k[Keyboard::KEY_KP_3] = SDLK_KP_3;
  259. k[Keyboard::KEY_KP_4] = SDLK_KP_4;
  260. k[Keyboard::KEY_KP_5] = SDLK_KP_5;
  261. k[Keyboard::KEY_KP_6] = SDLK_KP_6;
  262. k[Keyboard::KEY_KP_7] = SDLK_KP_7;
  263. k[Keyboard::KEY_KP_8] = SDLK_KP_8;
  264. k[Keyboard::KEY_KP_9] = SDLK_KP_9;
  265. k[Keyboard::KEY_KP_PERIOD] = SDLK_KP_PERIOD;
  266. k[Keyboard::KEY_KP_COMMA] = SDLK_KP_COMMA;
  267. k[Keyboard::KEY_KP_EQUALS] = SDLK_KP_EQUALS;
  268. k[Keyboard::KEY_APPLICATION] = SDLK_APPLICATION;
  269. k[Keyboard::KEY_POWER] = SDLK_POWER;
  270. k[Keyboard::KEY_F13] = SDLK_F13;
  271. k[Keyboard::KEY_F14] = SDLK_F14;
  272. k[Keyboard::KEY_F15] = SDLK_F15;
  273. k[Keyboard::KEY_F16] = SDLK_F16;
  274. k[Keyboard::KEY_F17] = SDLK_F17;
  275. k[Keyboard::KEY_F18] = SDLK_F18;
  276. k[Keyboard::KEY_F19] = SDLK_F19;
  277. k[Keyboard::KEY_F20] = SDLK_F20;
  278. k[Keyboard::KEY_F21] = SDLK_F21;
  279. k[Keyboard::KEY_F22] = SDLK_F22;
  280. k[Keyboard::KEY_F23] = SDLK_F23;
  281. k[Keyboard::KEY_F24] = SDLK_F24;
  282. k[Keyboard::KEY_EXECUTE] = SDLK_EXECUTE;
  283. k[Keyboard::KEY_HELP] = SDLK_HELP;
  284. k[Keyboard::KEY_MENU] = SDLK_MENU;
  285. k[Keyboard::KEY_SELECT] = SDLK_SELECT;
  286. k[Keyboard::KEY_STOP] = SDLK_STOP;
  287. k[Keyboard::KEY_AGAIN] = SDLK_AGAIN;
  288. k[Keyboard::KEY_UNDO] = SDLK_UNDO;
  289. k[Keyboard::KEY_CUT] = SDLK_CUT;
  290. k[Keyboard::KEY_COPY] = SDLK_COPY;
  291. k[Keyboard::KEY_PASTE] = SDLK_PASTE;
  292. k[Keyboard::KEY_FIND] = SDLK_FIND;
  293. k[Keyboard::KEY_MUTE] = SDLK_MUTE;
  294. k[Keyboard::KEY_VOLUMEUP] = SDLK_VOLUMEUP;
  295. k[Keyboard::KEY_VOLUMEDOWN] = SDLK_VOLUMEDOWN;
  296. k[Keyboard::KEY_ALTERASE] = SDLK_ALTERASE;
  297. k[Keyboard::KEY_SYSREQ] = SDLK_SYSREQ;
  298. k[Keyboard::KEY_CANCEL] = SDLK_CANCEL;
  299. k[Keyboard::KEY_CLEAR] = SDLK_CLEAR;
  300. k[Keyboard::KEY_PRIOR] = SDLK_PRIOR;
  301. k[Keyboard::KEY_RETURN2] = SDLK_RETURN2;
  302. k[Keyboard::KEY_SEPARATOR] = SDLK_SEPARATOR;
  303. k[Keyboard::KEY_OUT] = SDLK_OUT;
  304. k[Keyboard::KEY_OPER] = SDLK_OPER;
  305. k[Keyboard::KEY_CLEARAGAIN] = SDLK_CLEARAGAIN;
  306. k[Keyboard::KEY_THOUSANDSSEPARATOR] = SDLK_THOUSANDSSEPARATOR;
  307. k[Keyboard::KEY_DECIMALSEPARATOR] = SDLK_DECIMALSEPARATOR;
  308. k[Keyboard::KEY_CURRENCYUNIT] = SDLK_CURRENCYUNIT;
  309. k[Keyboard::KEY_CURRENCYSUBUNIT] = SDLK_CURRENCYSUBUNIT;
  310. k[Keyboard::KEY_LCTRL] = SDLK_LCTRL;
  311. k[Keyboard::KEY_LSHIFT] = SDLK_LSHIFT;
  312. k[Keyboard::KEY_LALT] = SDLK_LALT;
  313. k[Keyboard::KEY_LGUI] = SDLK_LGUI;
  314. k[Keyboard::KEY_RCTRL] = SDLK_RCTRL;
  315. k[Keyboard::KEY_RSHIFT] = SDLK_RSHIFT;
  316. k[Keyboard::KEY_RALT] = SDLK_RALT;
  317. k[Keyboard::KEY_RGUI] = SDLK_RGUI;
  318. k[Keyboard::KEY_MODE] = SDLK_MODE;
  319. k[Keyboard::KEY_AUDIONEXT] = SDLK_AUDIONEXT;
  320. k[Keyboard::KEY_AUDIOPREV] = SDLK_AUDIOPREV;
  321. k[Keyboard::KEY_AUDIOSTOP] = SDLK_AUDIOSTOP;
  322. k[Keyboard::KEY_AUDIOPLAY] = SDLK_AUDIOPLAY;
  323. k[Keyboard::KEY_AUDIOMUTE] = SDLK_AUDIOMUTE;
  324. k[Keyboard::KEY_MEDIASELECT] = SDLK_MEDIASELECT;
  325. k[Keyboard::KEY_WWW] = SDLK_WWW;
  326. k[Keyboard::KEY_MAIL] = SDLK_MAIL;
  327. k[Keyboard::KEY_CALCULATOR] = SDLK_CALCULATOR;
  328. k[Keyboard::KEY_COMPUTER] = SDLK_COMPUTER;
  329. k[Keyboard::KEY_APP_SEARCH] = SDLK_AC_SEARCH;
  330. k[Keyboard::KEY_APP_HOME] = SDLK_AC_HOME;
  331. k[Keyboard::KEY_APP_BACK] = SDLK_AC_BACK;
  332. k[Keyboard::KEY_APP_FORWARD] = SDLK_AC_FORWARD;
  333. k[Keyboard::KEY_APP_STOP] = SDLK_AC_STOP;
  334. k[Keyboard::KEY_APP_REFRESH] = SDLK_AC_REFRESH;
  335. k[Keyboard::KEY_APP_BOOKMARKS] = SDLK_AC_BOOKMARKS;
  336. k[Keyboard::KEY_BRIGHTNESSDOWN] = SDLK_BRIGHTNESSDOWN;
  337. k[Keyboard::KEY_BRIGHTNESSUP] = SDLK_BRIGHTNESSUP;
  338. k[Keyboard::KEY_DISPLAYSWITCH] = SDLK_DISPLAYSWITCH;
  339. k[Keyboard::KEY_KBDILLUMTOGGLE] = SDLK_KBDILLUMTOGGLE;
  340. k[Keyboard::KEY_KBDILLUMDOWN] = SDLK_KBDILLUMDOWN;
  341. k[Keyboard::KEY_KBDILLUMUP] = SDLK_KBDILLUMUP;
  342. k[Keyboard::KEY_EJECT] = SDLK_EJECT;
  343. k[Keyboard::KEY_SLEEP] = SDLK_SLEEP;
  344. return k;
  345. }
  346. const SDL_Keycode *Keyboard::keymap = Keyboard::createKeyMap();
  347. EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES>::Entry Keyboard::scancodeEntries[] =
  348. {
  349. {SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN},
  350. {SCANCODE_A, SDL_SCANCODE_A},
  351. {SCANCODE_B, SDL_SCANCODE_B},
  352. {SCANCODE_C, SDL_SCANCODE_C},
  353. {SCANCODE_D, SDL_SCANCODE_D},
  354. {SCANCODE_E, SDL_SCANCODE_E},
  355. {SCANCODE_F, SDL_SCANCODE_F},
  356. {SCANCODE_G, SDL_SCANCODE_G},
  357. {SCANCODE_H, SDL_SCANCODE_H},
  358. {SCANCODE_I, SDL_SCANCODE_I},
  359. {SCANCODE_J, SDL_SCANCODE_J},
  360. {SCANCODE_K, SDL_SCANCODE_K},
  361. {SCANCODE_L, SDL_SCANCODE_L},
  362. {SCANCODE_M, SDL_SCANCODE_M},
  363. {SCANCODE_N, SDL_SCANCODE_N},
  364. {SCANCODE_O, SDL_SCANCODE_O},
  365. {SCANCODE_P, SDL_SCANCODE_P},
  366. {SCANCODE_Q, SDL_SCANCODE_Q},
  367. {SCANCODE_R, SDL_SCANCODE_R},
  368. {SCANCODE_S, SDL_SCANCODE_S},
  369. {SCANCODE_T, SDL_SCANCODE_T},
  370. {SCANCODE_U, SDL_SCANCODE_U},
  371. {SCANCODE_V, SDL_SCANCODE_V},
  372. {SCANCODE_W, SDL_SCANCODE_W},
  373. {SCANCODE_X, SDL_SCANCODE_X},
  374. {SCANCODE_Y, SDL_SCANCODE_Y},
  375. {SCANCODE_Z, SDL_SCANCODE_Z},
  376. {SCANCODE_1, SDL_SCANCODE_1},
  377. {SCANCODE_2, SDL_SCANCODE_2},
  378. {SCANCODE_3, SDL_SCANCODE_3},
  379. {SCANCODE_4, SDL_SCANCODE_4},
  380. {SCANCODE_5, SDL_SCANCODE_5},
  381. {SCANCODE_6, SDL_SCANCODE_6},
  382. {SCANCODE_7, SDL_SCANCODE_7},
  383. {SCANCODE_8, SDL_SCANCODE_8},
  384. {SCANCODE_9, SDL_SCANCODE_9},
  385. {SCANCODE_0, SDL_SCANCODE_0},
  386. {SCANCODE_RETURN, SDL_SCANCODE_RETURN},
  387. {SCANCODE_ESCAPE, SDL_SCANCODE_ESCAPE},
  388. {SCANCODE_BACKSPACE, SDL_SCANCODE_BACKSPACE},
  389. {SCANCODE_TAB, SDL_SCANCODE_TAB},
  390. {SCANCODE_SPACE, SDL_SCANCODE_SPACE},
  391. {SCANCODE_MINUS, SDL_SCANCODE_MINUS},
  392. {SCANCODE_EQUALS, SDL_SCANCODE_EQUALS},
  393. {SCANCODE_LEFTBRACKET, SDL_SCANCODE_LEFTBRACKET},
  394. {SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RIGHTBRACKET},
  395. {SCANCODE_BACKSLASH, SDL_SCANCODE_BACKSLASH},
  396. {SCANCODE_NONUSHASH, SDL_SCANCODE_NONUSHASH},
  397. {SCANCODE_SEMICOLON, SDL_SCANCODE_SEMICOLON},
  398. {SCANCODE_APOSTROPHE, SDL_SCANCODE_APOSTROPHE},
  399. {SCANCODE_GRAVE, SDL_SCANCODE_GRAVE},
  400. {SCANCODE_COMMA, SDL_SCANCODE_COMMA},
  401. {SCANCODE_PERIOD, SDL_SCANCODE_PERIOD},
  402. {SCANCODE_SLASH, SDL_SCANCODE_SLASH},
  403. {SCANCODE_CAPSLOCK, SDL_SCANCODE_CAPSLOCK},
  404. {SCANCODE_F1, SDL_SCANCODE_F1},
  405. {SCANCODE_F2, SDL_SCANCODE_F2},
  406. {SCANCODE_F3, SDL_SCANCODE_F3},
  407. {SCANCODE_F4, SDL_SCANCODE_F4},
  408. {SCANCODE_F5, SDL_SCANCODE_F5},
  409. {SCANCODE_F6, SDL_SCANCODE_F6},
  410. {SCANCODE_F7, SDL_SCANCODE_F7},
  411. {SCANCODE_F8, SDL_SCANCODE_F8},
  412. {SCANCODE_F9, SDL_SCANCODE_F9},
  413. {SCANCODE_F10, SDL_SCANCODE_F10},
  414. {SCANCODE_F11, SDL_SCANCODE_F11},
  415. {SCANCODE_F12, SDL_SCANCODE_F12},
  416. {SCANCODE_PRINTSCREEN, SDL_SCANCODE_PRINTSCREEN},
  417. {SCANCODE_SCROLLLOCK, SDL_SCANCODE_SCROLLLOCK},
  418. {SCANCODE_PAUSE, SDL_SCANCODE_PAUSE},
  419. {SCANCODE_INSERT, SDL_SCANCODE_INSERT},
  420. {SCANCODE_HOME, SDL_SCANCODE_HOME},
  421. {SCANCODE_PAGEUP, SDL_SCANCODE_PAGEUP},
  422. {SCANCODE_DELETE, SDL_SCANCODE_DELETE},
  423. {SCANCODE_END, SDL_SCANCODE_END},
  424. {SCANCODE_PAGEDOWN, SDL_SCANCODE_PAGEDOWN},
  425. {SCANCODE_RIGHT, SDL_SCANCODE_RIGHT},
  426. {SCANCODE_LEFT, SDL_SCANCODE_LEFT},
  427. {SCANCODE_DOWN, SDL_SCANCODE_DOWN},
  428. {SCANCODE_UP, SDL_SCANCODE_UP},
  429. {SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_NUMLOCKCLEAR},
  430. {SCANCODE_KP_DIVIDE, SDL_SCANCODE_KP_DIVIDE},
  431. {SCANCODE_KP_MULTIPLY, SDL_SCANCODE_KP_MULTIPLY},
  432. {SCANCODE_KP_MINUS, SDL_SCANCODE_KP_MINUS},
  433. {SCANCODE_KP_PLUS, SDL_SCANCODE_KP_PLUS},
  434. {SCANCODE_KP_ENTER, SDL_SCANCODE_KP_ENTER},
  435. {SCANCODE_KP_1, SDL_SCANCODE_KP_1},
  436. {SCANCODE_KP_2, SDL_SCANCODE_KP_2},
  437. {SCANCODE_KP_3, SDL_SCANCODE_KP_3},
  438. {SCANCODE_KP_4, SDL_SCANCODE_KP_4},
  439. {SCANCODE_KP_5, SDL_SCANCODE_KP_5},
  440. {SCANCODE_KP_6, SDL_SCANCODE_KP_6},
  441. {SCANCODE_KP_7, SDL_SCANCODE_KP_7},
  442. {SCANCODE_KP_8, SDL_SCANCODE_KP_8},
  443. {SCANCODE_KP_9, SDL_SCANCODE_KP_9},
  444. {SCANCODE_KP_0, SDL_SCANCODE_KP_0},
  445. {SCANCODE_KP_PERIOD, SDL_SCANCODE_KP_PERIOD},
  446. {SCANCODE_NONUSBACKSLASH, SDL_SCANCODE_NONUSBACKSLASH},
  447. {SCANCODE_APPLICATION, SDL_SCANCODE_APPLICATION},
  448. {SCANCODE_POWER, SDL_SCANCODE_POWER},
  449. {SCANCODE_KP_EQUALS, SDL_SCANCODE_KP_EQUALS},
  450. {SCANCODE_F13, SDL_SCANCODE_F13},
  451. {SCANCODE_F14, SDL_SCANCODE_F14},
  452. {SCANCODE_F15, SDL_SCANCODE_F15},
  453. {SCANCODE_F16, SDL_SCANCODE_F16},
  454. {SCANCODE_F17, SDL_SCANCODE_F17},
  455. {SCANCODE_F18, SDL_SCANCODE_F18},
  456. {SCANCODE_F19, SDL_SCANCODE_F19},
  457. {SCANCODE_F20, SDL_SCANCODE_F20},
  458. {SCANCODE_F21, SDL_SCANCODE_F21},
  459. {SCANCODE_F22, SDL_SCANCODE_F22},
  460. {SCANCODE_F23, SDL_SCANCODE_F23},
  461. {SCANCODE_F24, SDL_SCANCODE_F24},
  462. {SCANCODE_EXECUTE, SDL_SCANCODE_EXECUTE},
  463. {SCANCODE_HELP, SDL_SCANCODE_HELP},
  464. {SCANCODE_MENU, SDL_SCANCODE_MENU},
  465. {SCANCODE_SELECT, SDL_SCANCODE_SELECT},
  466. {SCANCODE_STOP, SDL_SCANCODE_STOP},
  467. {SCANCODE_AGAIN, SDL_SCANCODE_AGAIN},
  468. {SCANCODE_UNDO, SDL_SCANCODE_UNDO},
  469. {SCANCODE_CUT, SDL_SCANCODE_CUT},
  470. {SCANCODE_COPY, SDL_SCANCODE_COPY},
  471. {SCANCODE_PASTE, SDL_SCANCODE_PASTE},
  472. {SCANCODE_FIND, SDL_SCANCODE_FIND},
  473. {SCANCODE_MUTE, SDL_SCANCODE_MUTE},
  474. {SCANCODE_VOLUMEUP, SDL_SCANCODE_VOLUMEUP},
  475. {SCANCODE_VOLUMEDOWN, SDL_SCANCODE_VOLUMEDOWN},
  476. {SCANCODE_KP_COMMA, SDL_SCANCODE_KP_COMMA},
  477. {SCANCODE_KP_EQUALSAS400, SDL_SCANCODE_KP_EQUALSAS400},
  478. {SCANCODE_INTERNATIONAL1, SDL_SCANCODE_INTERNATIONAL1},
  479. {SCANCODE_INTERNATIONAL2, SDL_SCANCODE_INTERNATIONAL2},
  480. {SCANCODE_INTERNATIONAL3, SDL_SCANCODE_INTERNATIONAL3},
  481. {SCANCODE_INTERNATIONAL4, SDL_SCANCODE_INTERNATIONAL4},
  482. {SCANCODE_INTERNATIONAL5, SDL_SCANCODE_INTERNATIONAL5},
  483. {SCANCODE_INTERNATIONAL6, SDL_SCANCODE_INTERNATIONAL6},
  484. {SCANCODE_INTERNATIONAL7, SDL_SCANCODE_INTERNATIONAL7},
  485. {SCANCODE_INTERNATIONAL8, SDL_SCANCODE_INTERNATIONAL8},
  486. {SCANCODE_INTERNATIONAL9, SDL_SCANCODE_INTERNATIONAL9},
  487. {SCANCODE_LANG1, SDL_SCANCODE_LANG1},
  488. {SCANCODE_LANG2, SDL_SCANCODE_LANG2},
  489. {SCANCODE_LANG3, SDL_SCANCODE_LANG3},
  490. {SCANCODE_LANG4, SDL_SCANCODE_LANG4},
  491. {SCANCODE_LANG5, SDL_SCANCODE_LANG5},
  492. {SCANCODE_LANG6, SDL_SCANCODE_LANG6},
  493. {SCANCODE_LANG7, SDL_SCANCODE_LANG7},
  494. {SCANCODE_LANG8, SDL_SCANCODE_LANG8},
  495. {SCANCODE_LANG9, SDL_SCANCODE_LANG9},
  496. {SCANCODE_ALTERASE, SDL_SCANCODE_ALTERASE},
  497. {SCANCODE_SYSREQ, SDL_SCANCODE_SYSREQ},
  498. {SCANCODE_CANCEL, SDL_SCANCODE_CANCEL},
  499. {SCANCODE_CLEAR, SDL_SCANCODE_CLEAR},
  500. {SCANCODE_PRIOR, SDL_SCANCODE_PRIOR},
  501. {SCANCODE_RETURN2, SDL_SCANCODE_RETURN2},
  502. {SCANCODE_SEPARATOR, SDL_SCANCODE_SEPARATOR},
  503. {SCANCODE_OUT, SDL_SCANCODE_OUT},
  504. {SCANCODE_OPER, SDL_SCANCODE_OPER},
  505. {SCANCODE_CLEARAGAIN, SDL_SCANCODE_CLEARAGAIN},
  506. {SCANCODE_CRSEL, SDL_SCANCODE_CRSEL},
  507. {SCANCODE_EXSEL, SDL_SCANCODE_EXSEL},
  508. {SCANCODE_KP_00, SDL_SCANCODE_KP_00},
  509. {SCANCODE_KP_000, SDL_SCANCODE_KP_000},
  510. {SCANCODE_THOUSANDSSEPARATOR, SDL_SCANCODE_THOUSANDSSEPARATOR},
  511. {SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_DECIMALSEPARATOR},
  512. {SCANCODE_CURRENCYUNIT, SDL_SCANCODE_CURRENCYUNIT},
  513. {SCANCODE_CURRENCYSUBUNIT, SDL_SCANCODE_CURRENCYSUBUNIT},
  514. {SCANCODE_KP_LEFTPAREN, SDL_SCANCODE_KP_LEFTPAREN},
  515. {SCANCODE_KP_RIGHTPAREN, SDL_SCANCODE_KP_RIGHTPAREN},
  516. {SCANCODE_KP_LEFTBRACE, SDL_SCANCODE_KP_LEFTBRACE},
  517. {SCANCODE_KP_RIGHTBRACE, SDL_SCANCODE_KP_RIGHTBRACE},
  518. {SCANCODE_KP_TAB, SDL_SCANCODE_KP_TAB},
  519. {SCANCODE_KP_BACKSPACE, SDL_SCANCODE_KP_BACKSPACE},
  520. {SCANCODE_KP_A, SDL_SCANCODE_KP_A},
  521. {SCANCODE_KP_B, SDL_SCANCODE_KP_B},
  522. {SCANCODE_KP_C, SDL_SCANCODE_KP_C},
  523. {SCANCODE_KP_D, SDL_SCANCODE_KP_D},
  524. {SCANCODE_KP_E, SDL_SCANCODE_KP_E},
  525. {SCANCODE_KP_F, SDL_SCANCODE_KP_F},
  526. {SCANCODE_KP_XOR, SDL_SCANCODE_KP_XOR},
  527. {SCANCODE_KP_POWER, SDL_SCANCODE_KP_POWER},
  528. {SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_PERCENT},
  529. {SCANCODE_KP_LESS, SDL_SCANCODE_KP_LESS},
  530. {SCANCODE_KP_GREATER, SDL_SCANCODE_KP_GREATER},
  531. {SCANCODE_KP_AMPERSAND, SDL_SCANCODE_KP_AMPERSAND},
  532. {SCANCODE_KP_DBLAMPERSAND, SDL_SCANCODE_KP_DBLAMPERSAND},
  533. {SCANCODE_KP_VERTICALBAR, SDL_SCANCODE_KP_VERTICALBAR},
  534. {SCANCODE_KP_DBLVERTICALBAR, SDL_SCANCODE_KP_DBLVERTICALBAR},
  535. {SCANCODE_KP_COLON, SDL_SCANCODE_KP_COLON},
  536. {SCANCODE_KP_HASH, SDL_SCANCODE_KP_HASH},
  537. {SCANCODE_KP_SPACE, SDL_SCANCODE_KP_SPACE},
  538. {SCANCODE_KP_AT, SDL_SCANCODE_KP_AT},
  539. {SCANCODE_KP_EXCLAM, SDL_SCANCODE_KP_EXCLAM},
  540. {SCANCODE_KP_MEMSTORE, SDL_SCANCODE_KP_MEMSTORE},
  541. {SCANCODE_KP_MEMRECALL, SDL_SCANCODE_KP_MEMRECALL},
  542. {SCANCODE_KP_MEMCLEAR, SDL_SCANCODE_KP_MEMCLEAR},
  543. {SCANCODE_KP_MEMADD, SDL_SCANCODE_KP_MEMADD},
  544. {SCANCODE_KP_MEMSUBTRACT, SDL_SCANCODE_KP_MEMSUBTRACT},
  545. {SCANCODE_KP_MEMMULTIPLY, SDL_SCANCODE_KP_MEMMULTIPLY},
  546. {SCANCODE_KP_MEMDIVIDE, SDL_SCANCODE_KP_MEMDIVIDE},
  547. {SCANCODE_KP_PLUSMINUS, SDL_SCANCODE_KP_PLUSMINUS},
  548. {SCANCODE_KP_CLEAR, SDL_SCANCODE_KP_CLEAR},
  549. {SCANCODE_KP_CLEARENTRY, SDL_SCANCODE_KP_CLEARENTRY},
  550. {SCANCODE_KP_BINARY, SDL_SCANCODE_KP_BINARY},
  551. {SCANCODE_KP_OCTAL, SDL_SCANCODE_KP_OCTAL},
  552. {SCANCODE_KP_DECIMAL, SDL_SCANCODE_KP_DECIMAL},
  553. {SCANCODE_KP_HEXADECIMAL, SDL_SCANCODE_KP_HEXADECIMAL},
  554. {SCANCODE_LCTRL, SDL_SCANCODE_LCTRL},
  555. {SCANCODE_LSHIFT, SDL_SCANCODE_LSHIFT},
  556. {SCANCODE_LALT, SDL_SCANCODE_LALT},
  557. {SCANCODE_LGUI, SDL_SCANCODE_LGUI},
  558. {SCANCODE_RCTRL, SDL_SCANCODE_RCTRL},
  559. {SCANCODE_RSHIFT, SDL_SCANCODE_RSHIFT},
  560. {SCANCODE_RALT, SDL_SCANCODE_RALT},
  561. {SCANCODE_RGUI, SDL_SCANCODE_RGUI},
  562. {SCANCODE_MODE, SDL_SCANCODE_MODE},
  563. {SCANCODE_AUDIONEXT, SDL_SCANCODE_AUDIONEXT},
  564. {SCANCODE_AUDIOPREV, SDL_SCANCODE_AUDIOPREV},
  565. {SCANCODE_AUDIOSTOP, SDL_SCANCODE_AUDIOSTOP},
  566. {SCANCODE_AUDIOPLAY, SDL_SCANCODE_AUDIOPLAY},
  567. {SCANCODE_AUDIOMUTE, SDL_SCANCODE_AUDIOMUTE},
  568. {SCANCODE_MEDIASELECT, SDL_SCANCODE_MEDIASELECT},
  569. {SCANCODE_WWW, SDL_SCANCODE_WWW},
  570. {SCANCODE_MAIL, SDL_SCANCODE_MAIL},
  571. {SCANCODE_CALCULATOR, SDL_SCANCODE_CALCULATOR},
  572. {SCANCODE_COMPUTER, SDL_SCANCODE_COMPUTER},
  573. {SCANCODE_AC_SEARCH, SDL_SCANCODE_AC_SEARCH},
  574. {SCANCODE_AC_HOME, SDL_SCANCODE_AC_HOME},
  575. {SCANCODE_AC_BACK, SDL_SCANCODE_AC_BACK},
  576. {SCANCODE_AC_FORWARD, SDL_SCANCODE_AC_FORWARD},
  577. {SCANCODE_AC_STOP, SDL_SCANCODE_AC_STOP},
  578. {SCANCODE_AC_REFRESH, SDL_SCANCODE_AC_REFRESH},
  579. {SCANCODE_AC_BOOKMARKS, SDL_SCANCODE_AC_BOOKMARKS},
  580. {SCANCODE_BRIGHTNESSDOWN, SDL_SCANCODE_BRIGHTNESSDOWN},
  581. {SCANCODE_BRIGHTNESSUP, SDL_SCANCODE_BRIGHTNESSUP},
  582. {SCANCODE_DISPLAYSWITCH, SDL_SCANCODE_DISPLAYSWITCH},
  583. {SCANCODE_KBDILLUMTOGGLE, SDL_SCANCODE_KBDILLUMTOGGLE},
  584. {SCANCODE_KBDILLUMDOWN, SDL_SCANCODE_KBDILLUMDOWN},
  585. {SCANCODE_KBDILLUMUP, SDL_SCANCODE_KBDILLUMUP},
  586. {SCANCODE_EJECT, SDL_SCANCODE_EJECT},
  587. {SCANCODE_SLEEP, SDL_SCANCODE_SLEEP},
  588. {SCANCODE_APP1, SDL_SCANCODE_APP1},
  589. {SCANCODE_APP2, SDL_SCANCODE_APP2},
  590. };
  591. EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));
  592. } // sdl
  593. } // keyboard
  594. } // love