Event.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. /**
  2. * Copyright (c) 2006-2014 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 "Event.h"
  21. #include "keyboard/Keyboard.h"
  22. #include "mouse/Mouse.h"
  23. #include "joystick/JoystickModule.h"
  24. #include "joystick/sdl/Joystick.h"
  25. #include "graphics/Graphics.h"
  26. #include "window/Window.h"
  27. #include "common/Exception.h"
  28. #include "audio/Audio.h"
  29. #include "common/config.h"
  30. #include <cmath>
  31. namespace love
  32. {
  33. namespace event
  34. {
  35. namespace sdl
  36. {
  37. // SDL reports mouse coordinates in the window coordinate system in OS X, but
  38. // we want them in pixel coordinates (may be different with high-DPI enabled.)
  39. static void windowToPixelCoords(int *x, int *y)
  40. {
  41. #ifndef LOVE_ANDROID
  42. double scale = 1.0;
  43. window::Window *window = (window::Window *) Module::findInstance("love.window.");
  44. if (window != nullptr)
  45. scale = window->getPixelScale();
  46. if (x != nullptr)
  47. *x = int(double(*x) * scale);
  48. if (y != nullptr)
  49. *y = int(double(*y) * scale);
  50. #endif
  51. }
  52. const char *Event::getName() const
  53. {
  54. return "love.event.sdl";
  55. }
  56. Event::Event()
  57. {
  58. if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0)
  59. throw love::Exception("%s", SDL_GetError());
  60. }
  61. Event::~Event()
  62. {
  63. SDL_QuitSubSystem(SDL_INIT_EVENTS);
  64. }
  65. void Event::pump()
  66. {
  67. SDL_PumpEvents();
  68. static SDL_Event e;
  69. Message *msg;
  70. while (SDL_PollEvent(&e))
  71. {
  72. msg = convert(e);
  73. if (msg)
  74. {
  75. push(msg);
  76. msg->release();
  77. }
  78. }
  79. }
  80. Message *Event::wait()
  81. {
  82. static SDL_Event e;
  83. bool ok = (SDL_WaitEvent(&e) == 1);
  84. if (!ok)
  85. return NULL;
  86. return convert(e);
  87. }
  88. void Event::clear()
  89. {
  90. static SDL_Event e;
  91. while (SDL_PollEvent(&e))
  92. {
  93. // Do nothing with 'e' ...
  94. }
  95. love::event::Event::clear();
  96. }
  97. Message *Event::convert(const SDL_Event &e) const
  98. {
  99. Message *msg = nullptr;
  100. std::vector<Variant *> vargs;
  101. vargs.reserve(4);
  102. love::keyboard::Keyboard *kb = nullptr;
  103. love::keyboard::Keyboard::Key key;
  104. love::mouse::Mouse::Button button;
  105. const char *txt;
  106. std::map<SDL_Keycode, love::keyboard::Keyboard::Key>::const_iterator keyit;
  107. switch (e.type)
  108. {
  109. case SDL_KEYDOWN:
  110. if (e.key.repeat)
  111. {
  112. kb = (love::keyboard::Keyboard *) Module::findInstance("love.keyboard.");
  113. if (kb && !kb->hasKeyRepeat())
  114. break;
  115. }
  116. keyit = keys.find(e.key.keysym.sym);
  117. if (keyit != keys.end())
  118. key = keyit->second;
  119. else
  120. key = love::keyboard::Keyboard::KEY_UNKNOWN;
  121. if (!love::keyboard::Keyboard::getConstant(key, txt))
  122. txt = "unknown";
  123. vargs.push_back(new Variant(txt, strlen(txt)));
  124. vargs.push_back(new Variant(e.key.repeat != 0));
  125. msg = new Message("keypressed", vargs);
  126. break;
  127. case SDL_KEYUP:
  128. keyit = keys.find(e.key.keysym.sym);
  129. if (keyit != keys.end())
  130. key = keyit->second;
  131. else
  132. key = love::keyboard::Keyboard::KEY_UNKNOWN;
  133. if (!love::keyboard::Keyboard::getConstant(key, txt))
  134. txt = "unknown";
  135. vargs.push_back(new Variant(txt, strlen(txt)));
  136. msg = new Message("keyreleased", vargs);
  137. break;
  138. case SDL_TEXTINPUT:
  139. txt = e.text.text;
  140. vargs.push_back(new Variant(txt, strlen(txt)));
  141. msg = new Message("textinput", vargs);
  142. break;
  143. case SDL_TEXTEDITING:
  144. txt = e.edit.text;
  145. vargs.push_back(new Variant(txt, strlen(txt)));
  146. vargs.push_back(new Variant((double) e.edit.start));
  147. vargs.push_back(new Variant((double) e.edit.length));
  148. msg = new Message("textedit", vargs);
  149. break;
  150. case SDL_MOUSEBUTTONDOWN:
  151. case SDL_MOUSEBUTTONUP:
  152. if (buttons.find(e.button.button, button) && mouse::Mouse::getConstant(button, txt))
  153. {
  154. int x = e.button.x;
  155. int y = e.button.y;
  156. windowToPixelCoords(&x, &y);
  157. vargs.push_back(new Variant((double) x));
  158. vargs.push_back(new Variant((double) y));
  159. vargs.push_back(new Variant(txt, strlen(txt)));
  160. vargs.push_back(new Variant(e.button.which == SDL_TOUCH_MOUSEID));
  161. msg = new Message((e.type == SDL_MOUSEBUTTONDOWN) ?
  162. "mousepressed" : "mousereleased",
  163. vargs);
  164. }
  165. break;
  166. case SDL_MOUSEWHEEL:
  167. if (e.wheel.y != 0)
  168. {
  169. button = (e.wheel.y > 0) ? mouse::Mouse::BUTTON_WHEELUP : mouse::Mouse::BUTTON_WHEELDOWN;
  170. if (!love::mouse::Mouse::getConstant(button, txt))
  171. break;
  172. int mx, my;
  173. SDL_GetMouseState(&mx, &my);
  174. windowToPixelCoords(&mx, &my);
  175. vargs.push_back(new Variant((double) mx));
  176. vargs.push_back(new Variant((double) my));
  177. vargs.push_back(new Variant(txt, strlen(txt)));
  178. vargs.push_back(new Variant(false));
  179. msg = new Message("mousepressed", vargs);
  180. }
  181. break;
  182. case SDL_FINGERDOWN:
  183. case SDL_FINGERUP:
  184. case SDL_FINGERMOTION:
  185. vargs.push_back(new Variant((double) e.tfinger.fingerId));
  186. vargs.push_back(new Variant((double) e.tfinger.x));
  187. vargs.push_back(new Variant((double) e.tfinger.y));
  188. vargs.push_back(new Variant((double) e.tfinger.pressure));
  189. if (e.type == SDL_FINGERDOWN)
  190. txt = "touchpressed";
  191. else if (e.type == SDL_FINGERUP)
  192. txt = "touchreleased";
  193. else
  194. txt = "touchmoved";
  195. msg = new Message(txt, vargs);
  196. break;
  197. case SDL_MULTIGESTURE:
  198. vargs.push_back(new Variant((double) e.mgesture.x));
  199. vargs.push_back(new Variant((double) e.mgesture.y));
  200. vargs.push_back(new Variant((double) e.mgesture.dTheta));
  201. vargs.push_back(new Variant((double) e.mgesture.dDist));
  202. vargs.push_back(new Variant((double) e.mgesture.numFingers));
  203. msg = new Message("touchgestured", vargs);
  204. break;
  205. case SDL_JOYBUTTONDOWN:
  206. case SDL_JOYBUTTONUP:
  207. case SDL_JOYAXISMOTION:
  208. case SDL_JOYBALLMOTION:
  209. case SDL_JOYHATMOTION:
  210. case SDL_JOYDEVICEADDED:
  211. case SDL_JOYDEVICEREMOVED:
  212. case SDL_CONTROLLERBUTTONDOWN:
  213. case SDL_CONTROLLERBUTTONUP:
  214. case SDL_CONTROLLERAXISMOTION:
  215. msg = convertJoystickEvent(e);
  216. break;
  217. case SDL_WINDOWEVENT:
  218. msg = convertWindowEvent(e);
  219. break;
  220. case SDL_DROPFILE:
  221. SDL_free(e.drop.file);
  222. break;
  223. case SDL_QUIT:
  224. msg = new Message("quit");
  225. break;
  226. case SDL_APP_LOWMEMORY:
  227. msg = new Message("lowmemory");
  228. break;
  229. default:
  230. break;
  231. }
  232. for (auto it = vargs.begin(); it != vargs.end(); ++it)
  233. {
  234. if ((*it) != nullptr)
  235. (*it)->release();
  236. }
  237. return msg;
  238. }
  239. Message *Event::convertJoystickEvent(const SDL_Event &e) const
  240. {
  241. joystick::JoystickModule *joymodule = (joystick::JoystickModule *) Module::findInstance("love.joystick.");
  242. if (!joymodule)
  243. return nullptr;
  244. Message *msg = nullptr;
  245. std::vector<Variant *> vargs;
  246. vargs.reserve(4);
  247. Proxy proxy;
  248. love::joystick::Joystick::Hat hat;
  249. love::joystick::Joystick::GamepadButton padbutton;
  250. love::joystick::Joystick::GamepadAxis padaxis;
  251. const char *txt;
  252. switch (e.type)
  253. {
  254. case SDL_JOYBUTTONDOWN:
  255. case SDL_JOYBUTTONUP:
  256. proxy.flags = JOYSTICK_JOYSTICK_T;
  257. proxy.data = joymodule->getJoystickFromID(e.jbutton.which);
  258. if (!proxy.data)
  259. break;
  260. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  261. vargs.push_back(new Variant((double)(e.jbutton.button+1)));
  262. msg = new Message((e.type == SDL_JOYBUTTONDOWN) ?
  263. "joystickpressed" : "joystickreleased",
  264. vargs);
  265. break;
  266. case SDL_JOYAXISMOTION:
  267. {
  268. proxy.flags = JOYSTICK_JOYSTICK_T;
  269. proxy.data = joymodule->getJoystickFromID(e.jaxis.which);
  270. if (!proxy.data)
  271. break;
  272. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  273. vargs.push_back(new Variant((double)(e.jaxis.axis+1)));
  274. float value = e.jaxis.value / 32768.0f;
  275. if (fabsf(value) < 0.001f) value = 0.0f;
  276. if (value < -0.99f) value = -1.0f;
  277. if (value > 0.99f) value = 1.0f;
  278. vargs.push_back(new Variant((double) value));
  279. msg = new Message("joystickaxis", vargs);
  280. }
  281. break;
  282. case SDL_JOYHATMOTION:
  283. if (!joystick::sdl::Joystick::getConstant(e.jhat.value, hat) || !joystick::Joystick::getConstant(hat, txt))
  284. break;
  285. proxy.flags = JOYSTICK_JOYSTICK_T;
  286. proxy.data = joymodule->getJoystickFromID(e.jhat.which);
  287. if (!proxy.data)
  288. break;
  289. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  290. vargs.push_back(new Variant((double)(e.jhat.hat+1)));
  291. vargs.push_back(new Variant(txt, strlen(txt)));
  292. msg = new Message("joystickhat", vargs);
  293. break;
  294. case SDL_CONTROLLERBUTTONDOWN:
  295. case SDL_CONTROLLERBUTTONUP:
  296. if (!joystick::sdl::Joystick::getConstant((SDL_GameControllerButton) e.cbutton.button, padbutton))
  297. break;
  298. if (!joystick::Joystick::getConstant(padbutton, txt))
  299. break;
  300. proxy.flags = JOYSTICK_JOYSTICK_T;
  301. proxy.data = joymodule->getJoystickFromID(e.cbutton.which);
  302. if (!proxy.data)
  303. break;
  304. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  305. vargs.push_back(new Variant(txt, strlen(txt)));
  306. msg = new Message(e.type == SDL_CONTROLLERBUTTONDOWN ?
  307. "gamepadpressed" : "gamepadreleased", vargs);
  308. break;
  309. case SDL_CONTROLLERAXISMOTION:
  310. if (joystick::sdl::Joystick::getConstant((SDL_GameControllerAxis) e.caxis.axis, padaxis))
  311. {
  312. if (!joystick::Joystick::getConstant(padaxis, txt))
  313. break;
  314. proxy.flags = JOYSTICK_JOYSTICK_T;
  315. proxy.data = joymodule->getJoystickFromID(e.caxis.which);
  316. if (!proxy.data)
  317. break;
  318. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  319. vargs.push_back(new Variant(txt, strlen(txt)));
  320. float value = e.jaxis.value / 32768.0f;
  321. if (fabsf(value) < 0.001f) value = 0.0f;
  322. if (value < -0.99f) value = -1.0f;
  323. if (value > 0.99f) value = 1.0f;
  324. vargs.push_back(new Variant((double) value));
  325. msg = new Message("gamepadaxis", vargs);
  326. }
  327. break;
  328. case SDL_JOYDEVICEADDED:
  329. // jdevice.which is the joystick device index.
  330. proxy.data = joymodule->addJoystick(e.jdevice.which);
  331. proxy.flags = JOYSTICK_JOYSTICK_T;
  332. if (proxy.data)
  333. {
  334. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  335. msg = new Message("joystickadded", vargs);
  336. }
  337. break;
  338. case SDL_JOYDEVICEREMOVED:
  339. // jdevice.which is the joystick instance ID now.
  340. proxy.data = joymodule->getJoystickFromID(e.jdevice.which);
  341. proxy.flags = JOYSTICK_JOYSTICK_T;
  342. if (proxy.data)
  343. {
  344. joymodule->removeJoystick((joystick::Joystick *) proxy.data);
  345. vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
  346. msg = new Message("joystickremoved", vargs);
  347. }
  348. break;
  349. default:
  350. break;
  351. }
  352. for (auto it = vargs.begin(); it != vargs.end(); ++it)
  353. {
  354. if ((*it) != nullptr)
  355. (*it)->release();
  356. }
  357. return msg;
  358. }
  359. Message *Event::convertWindowEvent(const SDL_Event &e) const
  360. {
  361. Message *msg = nullptr;
  362. std::vector<Variant *> vargs;
  363. vargs.reserve(4);
  364. window::Window *win = nullptr;
  365. if (e.type != SDL_WINDOWEVENT)
  366. return nullptr;
  367. switch (e.window.event)
  368. {
  369. case SDL_WINDOWEVENT_FOCUS_GAINED:
  370. case SDL_WINDOWEVENT_FOCUS_LOST:
  371. // Users won't expect the screensaver to activate if a game is in
  372. // focus. Also, joystick input may not delay the screensaver timer.
  373. if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
  374. SDL_DisableScreenSaver();
  375. else
  376. SDL_EnableScreenSaver();
  377. vargs.push_back(new Variant(e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED));
  378. msg = new Message("focus", vargs);
  379. break;
  380. case SDL_WINDOWEVENT_ENTER:
  381. case SDL_WINDOWEVENT_LEAVE:
  382. vargs.push_back(new Variant(e.window.event == SDL_WINDOWEVENT_ENTER));
  383. msg = new Message("mousefocus", vargs);
  384. break;
  385. case SDL_WINDOWEVENT_SHOWN:
  386. case SDL_WINDOWEVENT_HIDDEN:
  387. vargs.push_back(new Variant(e.window.event == SDL_WINDOWEVENT_SHOWN));
  388. msg = new Message("visible", vargs);
  389. break;
  390. case SDL_WINDOWEVENT_RESIZED:
  391. win = (window::Window *) Module::findInstance("love.window.");
  392. if (win)
  393. {
  394. int px_w = e.window.data1;
  395. int px_h = e.window.data2;
  396. // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility.
  397. #if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX)
  398. SDL_Window *sdlwin = SDL_GetWindowFromID(e.window.windowID);
  399. if (sdlwin)
  400. SDL_GL_GetDrawableSize(sdlwin, &px_w, &px_h);
  401. #endif
  402. win->onWindowResize(e.window.data1, e.window.data2);
  403. graphics::Graphics *gfx = (graphics::Graphics *) Module::findInstance("love.graphics.");
  404. if (gfx)
  405. gfx->setViewportSize(px_w, px_h);
  406. vargs.push_back(new Variant((double) px_w));
  407. vargs.push_back(new Variant((double) px_h));
  408. vargs.push_back(new Variant((double) e.window.data1));
  409. vargs.push_back(new Variant((double) e.window.data2));
  410. msg = new Message("resize", vargs);
  411. }
  412. break;
  413. #ifdef LOVE_ANDROID
  414. case SDL_WINDOWEVENT_MINIMIZED:
  415. {
  416. audio::Audio *audio = (audio::Audio *) Module::findInstance("love.audio.");
  417. if (audio)
  418. audio->pause();
  419. }
  420. break;
  421. case SDL_WINDOWEVENT_RESTORED:
  422. {
  423. audio::Audio *audio = (audio::Audio *) Module::findInstance("love.audio.");
  424. if (audio)
  425. audio->resume();
  426. }
  427. break;
  428. #endif
  429. }
  430. for (auto it = vargs.begin(); it != vargs.end(); ++it)
  431. {
  432. if ((*it) != nullptr)
  433. (*it)->release();
  434. }
  435. return msg;
  436. }
  437. std::map<SDL_Keycode, love::keyboard::Keyboard::Key> Event::createKeyMap()
  438. {
  439. using love::keyboard::Keyboard;
  440. std::map<SDL_Keycode, Keyboard::Key> k;
  441. k[SDLK_UNKNOWN] = Keyboard::KEY_UNKNOWN;
  442. k[SDLK_RETURN] = Keyboard::KEY_RETURN;
  443. k[SDLK_ESCAPE] = Keyboard::KEY_ESCAPE;
  444. k[SDLK_BACKSPACE] = Keyboard::KEY_BACKSPACE;
  445. k[SDLK_TAB] = Keyboard::KEY_TAB;
  446. k[SDLK_SPACE] = Keyboard::KEY_SPACE;
  447. k[SDLK_EXCLAIM] = Keyboard::KEY_EXCLAIM;
  448. k[SDLK_QUOTEDBL] = Keyboard::KEY_QUOTEDBL;
  449. k[SDLK_HASH] = Keyboard::KEY_HASH;
  450. k[SDLK_DOLLAR] = Keyboard::KEY_DOLLAR;
  451. k[SDLK_AMPERSAND] = Keyboard::KEY_AMPERSAND;
  452. k[SDLK_QUOTE] = Keyboard::KEY_QUOTE;
  453. k[SDLK_LEFTPAREN] = Keyboard::KEY_LEFTPAREN;
  454. k[SDLK_RIGHTPAREN] = Keyboard::KEY_RIGHTPAREN;
  455. k[SDLK_ASTERISK] = Keyboard::KEY_ASTERISK;
  456. k[SDLK_PLUS] = Keyboard::KEY_PLUS;
  457. k[SDLK_COMMA] = Keyboard::KEY_COMMA;
  458. k[SDLK_MINUS] = Keyboard::KEY_MINUS;
  459. k[SDLK_PERIOD] = Keyboard::KEY_PERIOD;
  460. k[SDLK_SLASH] = Keyboard::KEY_SLASH;
  461. k[SDLK_0] = Keyboard::KEY_0;
  462. k[SDLK_1] = Keyboard::KEY_1;
  463. k[SDLK_2] = Keyboard::KEY_2;
  464. k[SDLK_3] = Keyboard::KEY_3;
  465. k[SDLK_4] = Keyboard::KEY_4;
  466. k[SDLK_5] = Keyboard::KEY_5;
  467. k[SDLK_6] = Keyboard::KEY_6;
  468. k[SDLK_7] = Keyboard::KEY_7;
  469. k[SDLK_8] = Keyboard::KEY_8;
  470. k[SDLK_9] = Keyboard::KEY_9;
  471. k[SDLK_COLON] = Keyboard::KEY_COLON;
  472. k[SDLK_SEMICOLON] = Keyboard::KEY_SEMICOLON;
  473. k[SDLK_LESS] = Keyboard::KEY_LESS;
  474. k[SDLK_EQUALS] = Keyboard::KEY_EQUALS;
  475. k[SDLK_GREATER] = Keyboard::KEY_GREATER;
  476. k[SDLK_QUESTION] = Keyboard::KEY_QUESTION;
  477. k[SDLK_AT] = Keyboard::KEY_AT;
  478. k[SDLK_LEFTBRACKET] = Keyboard::KEY_LEFTBRACKET;
  479. k[SDLK_BACKSLASH] = Keyboard::KEY_BACKSLASH;
  480. k[SDLK_RIGHTBRACKET] = Keyboard::KEY_RIGHTBRACKET;
  481. k[SDLK_CARET] = Keyboard::KEY_CARET;
  482. k[SDLK_UNDERSCORE] = Keyboard::KEY_UNDERSCORE;
  483. k[SDLK_BACKQUOTE] = Keyboard::KEY_BACKQUOTE;
  484. k[SDLK_a] = Keyboard::KEY_A;
  485. k[SDLK_b] = Keyboard::KEY_B;
  486. k[SDLK_c] = Keyboard::KEY_C;
  487. k[SDLK_d] = Keyboard::KEY_D;
  488. k[SDLK_e] = Keyboard::KEY_E;
  489. k[SDLK_f] = Keyboard::KEY_F;
  490. k[SDLK_g] = Keyboard::KEY_G;
  491. k[SDLK_h] = Keyboard::KEY_H;
  492. k[SDLK_i] = Keyboard::KEY_I;
  493. k[SDLK_j] = Keyboard::KEY_J;
  494. k[SDLK_k] = Keyboard::KEY_K;
  495. k[SDLK_l] = Keyboard::KEY_L;
  496. k[SDLK_m] = Keyboard::KEY_M;
  497. k[SDLK_n] = Keyboard::KEY_N;
  498. k[SDLK_o] = Keyboard::KEY_O;
  499. k[SDLK_p] = Keyboard::KEY_P;
  500. k[SDLK_q] = Keyboard::KEY_Q;
  501. k[SDLK_r] = Keyboard::KEY_R;
  502. k[SDLK_s] = Keyboard::KEY_S;
  503. k[SDLK_t] = Keyboard::KEY_T;
  504. k[SDLK_u] = Keyboard::KEY_U;
  505. k[SDLK_v] = Keyboard::KEY_V;
  506. k[SDLK_w] = Keyboard::KEY_W;
  507. k[SDLK_x] = Keyboard::KEY_X;
  508. k[SDLK_y] = Keyboard::KEY_Y;
  509. k[SDLK_z] = Keyboard::KEY_Z;
  510. k[SDLK_CAPSLOCK] = Keyboard::KEY_CAPSLOCK;
  511. k[SDLK_F1] = Keyboard::KEY_F1;
  512. k[SDLK_F2] = Keyboard::KEY_F2;
  513. k[SDLK_F3] = Keyboard::KEY_F3;
  514. k[SDLK_F4] = Keyboard::KEY_F4;
  515. k[SDLK_F5] = Keyboard::KEY_F5;
  516. k[SDLK_F6] = Keyboard::KEY_F6;
  517. k[SDLK_F7] = Keyboard::KEY_F7;
  518. k[SDLK_F8] = Keyboard::KEY_F8;
  519. k[SDLK_F9] = Keyboard::KEY_F9;
  520. k[SDLK_F10] = Keyboard::KEY_F10;
  521. k[SDLK_F11] = Keyboard::KEY_F11;
  522. k[SDLK_F12] = Keyboard::KEY_F12;
  523. k[SDLK_PRINTSCREEN] = Keyboard::KEY_PRINTSCREEN;
  524. k[SDLK_SCROLLLOCK] = Keyboard::KEY_SCROLLLOCK;
  525. k[SDLK_PAUSE] = Keyboard::KEY_PAUSE;
  526. k[SDLK_INSERT] = Keyboard::KEY_INSERT;
  527. k[SDLK_HOME] = Keyboard::KEY_HOME;
  528. k[SDLK_PAGEUP] = Keyboard::KEY_PAGEUP;
  529. k[SDLK_DELETE] = Keyboard::KEY_DELETE;
  530. k[SDLK_END] = Keyboard::KEY_END;
  531. k[SDLK_PAGEDOWN] = Keyboard::KEY_PAGEDOWN;
  532. k[SDLK_RIGHT] = Keyboard::KEY_RIGHT;
  533. k[SDLK_LEFT] = Keyboard::KEY_LEFT;
  534. k[SDLK_DOWN] = Keyboard::KEY_DOWN;
  535. k[SDLK_UP] = Keyboard::KEY_UP;
  536. k[SDLK_NUMLOCKCLEAR] = Keyboard::KEY_NUMLOCKCLEAR;
  537. k[SDLK_KP_DIVIDE] = Keyboard::KEY_KP_DIVIDE;
  538. k[SDLK_KP_MULTIPLY] = Keyboard::KEY_KP_MULTIPLY;
  539. k[SDLK_KP_MINUS] = Keyboard::KEY_KP_MINUS;
  540. k[SDLK_KP_PLUS] = Keyboard::KEY_KP_PLUS;
  541. k[SDLK_KP_ENTER] = Keyboard::KEY_KP_ENTER;
  542. k[SDLK_KP_0] = Keyboard::KEY_KP_0;
  543. k[SDLK_KP_1] = Keyboard::KEY_KP_1;
  544. k[SDLK_KP_2] = Keyboard::KEY_KP_2;
  545. k[SDLK_KP_3] = Keyboard::KEY_KP_3;
  546. k[SDLK_KP_4] = Keyboard::KEY_KP_4;
  547. k[SDLK_KP_5] = Keyboard::KEY_KP_5;
  548. k[SDLK_KP_6] = Keyboard::KEY_KP_6;
  549. k[SDLK_KP_7] = Keyboard::KEY_KP_7;
  550. k[SDLK_KP_8] = Keyboard::KEY_KP_8;
  551. k[SDLK_KP_9] = Keyboard::KEY_KP_9;
  552. k[SDLK_KP_PERIOD] = Keyboard::KEY_KP_PERIOD;
  553. k[SDLK_KP_COMMA] = Keyboard::KEY_KP_COMMA;
  554. k[SDLK_KP_EQUALS] = Keyboard::KEY_KP_EQUALS;
  555. k[SDLK_APPLICATION] = Keyboard::KEY_APPLICATION;
  556. k[SDLK_POWER] = Keyboard::KEY_POWER;
  557. k[SDLK_F13] = Keyboard::KEY_F13;
  558. k[SDLK_F14] = Keyboard::KEY_F14;
  559. k[SDLK_F15] = Keyboard::KEY_F15;
  560. k[SDLK_F16] = Keyboard::KEY_F16;
  561. k[SDLK_F17] = Keyboard::KEY_F17;
  562. k[SDLK_F18] = Keyboard::KEY_F18;
  563. k[SDLK_F19] = Keyboard::KEY_F19;
  564. k[SDLK_F20] = Keyboard::KEY_F20;
  565. k[SDLK_F21] = Keyboard::KEY_F21;
  566. k[SDLK_F22] = Keyboard::KEY_F22;
  567. k[SDLK_F23] = Keyboard::KEY_F23;
  568. k[SDLK_F24] = Keyboard::KEY_F24;
  569. k[SDLK_EXECUTE] = Keyboard::KEY_EXECUTE;
  570. k[SDLK_HELP] = Keyboard::KEY_HELP;
  571. k[SDLK_MENU] = Keyboard::KEY_MENU;
  572. k[SDLK_AC_SEARCH] = Keyboard::KEY_SEARCH;
  573. k[SDLK_SELECT] = Keyboard::KEY_SELECT;
  574. k[SDLK_STOP] = Keyboard::KEY_STOP;
  575. k[SDLK_AGAIN] = Keyboard::KEY_AGAIN;
  576. k[SDLK_UNDO] = Keyboard::KEY_UNDO;
  577. k[SDLK_CUT] = Keyboard::KEY_CUT;
  578. k[SDLK_COPY] = Keyboard::KEY_COPY;
  579. k[SDLK_PASTE] = Keyboard::KEY_PASTE;
  580. k[SDLK_FIND] = Keyboard::KEY_FIND;
  581. k[SDLK_MUTE] = Keyboard::KEY_MUTE;
  582. k[SDLK_VOLUMEUP] = Keyboard::KEY_VOLUMEUP;
  583. k[SDLK_VOLUMEDOWN] = Keyboard::KEY_VOLUMEDOWN;
  584. k[SDLK_ALTERASE] = Keyboard::KEY_ALTERASE;
  585. k[SDLK_SYSREQ] = Keyboard::KEY_SYSREQ;
  586. k[SDLK_CANCEL] = Keyboard::KEY_CANCEL;
  587. k[SDLK_CLEAR] = Keyboard::KEY_CLEAR;
  588. k[SDLK_PRIOR] = Keyboard::KEY_PRIOR;
  589. k[SDLK_RETURN2] = Keyboard::KEY_RETURN2;
  590. k[SDLK_SEPARATOR] = Keyboard::KEY_SEPARATOR;
  591. k[SDLK_OUT] = Keyboard::KEY_OUT;
  592. k[SDLK_OPER] = Keyboard::KEY_OPER;
  593. k[SDLK_CLEARAGAIN] = Keyboard::KEY_CLEARAGAIN;
  594. k[SDLK_THOUSANDSSEPARATOR] = Keyboard::KEY_THOUSANDSSEPARATOR;
  595. k[SDLK_DECIMALSEPARATOR] = Keyboard::KEY_DECIMALSEPARATOR;
  596. k[SDLK_CURRENCYUNIT] = Keyboard::KEY_CURRENCYUNIT;
  597. k[SDLK_CURRENCYSUBUNIT] = Keyboard::KEY_CURRENCYSUBUNIT;
  598. k[SDLK_LCTRL] = Keyboard::KEY_LCTRL;
  599. k[SDLK_LSHIFT] = Keyboard::KEY_LSHIFT;
  600. k[SDLK_LALT] = Keyboard::KEY_LALT;
  601. k[SDLK_LGUI] = Keyboard::KEY_LGUI;
  602. k[SDLK_RCTRL] = Keyboard::KEY_RCTRL;
  603. k[SDLK_RSHIFT] = Keyboard::KEY_RSHIFT;
  604. k[SDLK_RALT] = Keyboard::KEY_RALT;
  605. k[SDLK_RGUI] = Keyboard::KEY_RGUI;
  606. k[SDLK_MODE] = Keyboard::KEY_MODE;
  607. k[SDLK_AUDIONEXT] = Keyboard::KEY_AUDIONEXT;
  608. k[SDLK_AUDIOPREV] = Keyboard::KEY_AUDIOPREV;
  609. k[SDLK_AUDIOSTOP] = Keyboard::KEY_AUDIOSTOP;
  610. k[SDLK_AUDIOPLAY] = Keyboard::KEY_AUDIOPLAY;
  611. k[SDLK_AUDIOMUTE] = Keyboard::KEY_AUDIOMUTE;
  612. k[SDLK_MEDIASELECT] = Keyboard::KEY_MEDIASELECT;
  613. k[SDLK_WWW] = Keyboard::KEY_WWW;
  614. k[SDLK_MAIL] = Keyboard::KEY_MAIL;
  615. k[SDLK_CALCULATOR] = Keyboard::KEY_CALCULATOR;
  616. k[SDLK_COMPUTER] = Keyboard::KEY_COMPUTER;
  617. k[SDLK_AC_SEARCH] = Keyboard::KEY_APP_SEARCH;
  618. k[SDLK_AC_HOME] = Keyboard::KEY_APP_HOME;
  619. k[SDLK_AC_BACK] = Keyboard::KEY_APP_BACK;
  620. k[SDLK_AC_FORWARD] = Keyboard::KEY_APP_FORWARD;
  621. k[SDLK_AC_STOP] = Keyboard::KEY_APP_STOP;
  622. k[SDLK_AC_REFRESH] = Keyboard::KEY_APP_REFRESH;
  623. k[SDLK_AC_BOOKMARKS] = Keyboard::KEY_APP_BOOKMARKS;
  624. k[SDLK_BRIGHTNESSDOWN] = Keyboard::KEY_BRIGHTNESSDOWN;
  625. k[SDLK_BRIGHTNESSUP] = Keyboard::KEY_BRIGHTNESSUP;
  626. k[SDLK_DISPLAYSWITCH] = Keyboard::KEY_DISPLAYSWITCH;
  627. k[SDLK_KBDILLUMTOGGLE] = Keyboard::KEY_KBDILLUMTOGGLE;
  628. k[SDLK_KBDILLUMDOWN] = Keyboard::KEY_KBDILLUMDOWN;
  629. k[SDLK_KBDILLUMUP] = Keyboard::KEY_KBDILLUMUP;
  630. k[SDLK_EJECT] = Keyboard::KEY_EJECT;
  631. k[SDLK_SLEEP] = Keyboard::KEY_SLEEP;
  632. #ifdef LOVE_ANDROID
  633. k[SDLK_AC_BACK] = Keyboard::KEY_ESCAPE;
  634. #endif
  635. return k;
  636. }
  637. std::map<SDL_Keycode, love::keyboard::Keyboard::Key> Event::keys = Event::createKeyMap();
  638. EnumMap<love::mouse::Mouse::Button, Uint8, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry Event::buttonEntries[] =
  639. {
  640. { love::mouse::Mouse::BUTTON_LEFT, SDL_BUTTON_LEFT},
  641. { love::mouse::Mouse::BUTTON_MIDDLE, SDL_BUTTON_MIDDLE},
  642. { love::mouse::Mouse::BUTTON_RIGHT, SDL_BUTTON_RIGHT},
  643. { love::mouse::Mouse::BUTTON_X1, SDL_BUTTON_X1},
  644. { love::mouse::Mouse::BUTTON_X2, SDL_BUTTON_X2},
  645. };
  646. EnumMap<love::mouse::Mouse::Button, Uint8, love::mouse::Mouse::BUTTON_MAX_ENUM> Event::buttons(Event::buttonEntries, sizeof(Event::buttonEntries));
  647. } // sdl
  648. } // event
  649. } // love