sdlInput.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platform/platformInput.h"
  23. #include "console/console.h"
  24. #include "core/util/journal/process.h"
  25. #include "windowManager/platformWindowMgr.h"
  26. #include "sdlInput.h"
  27. #include "platform/platformInput.h"
  28. #include "SDL.h"
  29. #ifdef LOG_INPUT
  30. #include <time.h>
  31. #include <stdarg.h>
  32. #endif
  33. // Static class variables:
  34. InputManager* Input::smManager;
  35. bool Input::smActive;
  36. U8 Input::smModifierKeys;
  37. bool Input::smLastKeyboardActivated;
  38. bool Input::smLastMouseActivated;
  39. bool Input::smLastJoystickActivated;
  40. InputEvent Input::smInputEvent;
  41. #ifdef LOG_INPUT
  42. static HANDLE gInputLog;
  43. #endif
  44. static void fillAsciiTable() {}
  45. //------------------------------------------------------------------------------
  46. //
  47. // This function gets the standard ASCII code corresponding to our key code
  48. // and the existing modifier key state.
  49. //
  50. //------------------------------------------------------------------------------
  51. struct AsciiData
  52. {
  53. struct KeyData
  54. {
  55. U16 ascii;
  56. bool isDeadChar;
  57. };
  58. KeyData upper;
  59. KeyData lower;
  60. KeyData goofy;
  61. };
  62. #define NUM_KEYS ( KEY_OEM_102 + 1 )
  63. #define KEY_FIRST KEY_ESCAPE
  64. //------------------------------------------------------------------------------
  65. void Input::init()
  66. {
  67. Con::printf( "Input Init:" );
  68. destroy();
  69. smActive = false;
  70. smLastKeyboardActivated = true;
  71. smLastMouseActivated = true;
  72. smLastJoystickActivated = true;
  73. SDL_InitSubSystem( SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_EVENTS );
  74. // Init the current modifier keys
  75. setModifierKeys(0);
  76. fillAsciiTable();
  77. Con::printf( "" );
  78. // Set ourselves to participate in per-frame processing.
  79. Process::notify(Input::process, PROCESS_INPUT_ORDER);
  80. }
  81. //------------------------------------------------------------------------------
  82. ConsoleFunction( isJoystickDetected, bool, 1, 1, "isJoystickDetected()" )
  83. {
  84. argc; argv;
  85. return( SDL_NumJoysticks() > 0 );
  86. }
  87. //------------------------------------------------------------------------------
  88. ConsoleFunction( getJoystickAxes, const char*, 2, 2, "getJoystickAxes( instance )" )
  89. {
  90. argc;
  91. // TODO SDL
  92. return( "" );
  93. }
  94. //------------------------------------------------------------------------------
  95. U16 Input::getKeyCode( U16 asciiCode )
  96. {
  97. if( asciiCode > 255 )
  98. return 0;
  99. char c[2];
  100. c[0]= asciiCode;
  101. c[1] = NULL;
  102. return KeyMapSDL::getTorqueScanCodeFromSDL( SDL_GetScancodeFromName( c ) );
  103. }
  104. //------------------------------------------------------------------------------
  105. U16 Input::getAscii( U16 keyCode, KEY_STATE keyState )
  106. {
  107. if ( keyCode >= NUM_KEYS )
  108. return 0;
  109. U32 SDLKey = KeyMapSDL::getSDLScanCodeFromTorque( keyCode );
  110. SDLKey = SDL_GetKeyFromScancode( (SDL_Scancode)SDLKey );
  111. const char *text = SDL_GetKeyName( SDLKey );
  112. if(text[1] != 0)
  113. return 0;
  114. U8 ret = text[0];
  115. if( !dIsalpha(ret) )
  116. return ret;
  117. switch ( keyState )
  118. {
  119. case STATE_LOWER:
  120. return dTolower( ret );
  121. case STATE_UPPER:
  122. return dToupper( ret );
  123. case STATE_GOOFY:
  124. return 0; // TODO SDL
  125. default:
  126. return(0);
  127. }
  128. }
  129. //------------------------------------------------------------------------------
  130. void Input::destroy()
  131. {
  132. Process::remove(Input::process);
  133. SDL_QuitSubSystem( SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER );
  134. }
  135. //------------------------------------------------------------------------------
  136. bool Input::enable()
  137. {
  138. if ( smManager && !smManager->isEnabled() )
  139. return( smManager->enable() );
  140. return( false );
  141. }
  142. //------------------------------------------------------------------------------
  143. void Input::disable()
  144. {
  145. if ( smManager && smManager->isEnabled() )
  146. smManager->disable();
  147. }
  148. //------------------------------------------------------------------------------
  149. void Input::activate()
  150. {
  151. #ifdef UNICODE
  152. //winState.imeHandle = ImmGetContext( getWin32WindowHandle() );
  153. //ImmReleaseContext( getWin32WindowHandle(), winState.imeHandle );
  154. #endif
  155. if ( !Con::getBoolVariable( "$enableDirectInput" ) )
  156. return;
  157. if ( smManager && smManager->isEnabled() && !smActive )
  158. {
  159. Con::printf( "Activating Input..." );
  160. smActive = true;
  161. }
  162. }
  163. //------------------------------------------------------------------------------
  164. void Input::deactivate()
  165. {
  166. if ( smManager && smManager->isEnabled() && smActive )
  167. {
  168. smActive = false;
  169. Con::printf( "Input deactivated." );
  170. }
  171. }
  172. //------------------------------------------------------------------------------
  173. bool Input::isEnabled()
  174. {
  175. if ( smManager )
  176. return smManager->isEnabled();
  177. return false;
  178. }
  179. //------------------------------------------------------------------------------
  180. bool Input::isActive()
  181. {
  182. return smActive;
  183. }
  184. //------------------------------------------------------------------------------
  185. void Input::process()
  186. {
  187. if ( smManager && smManager->isEnabled() && smActive )
  188. smManager->process();
  189. }
  190. //------------------------------------------------------------------------------
  191. InputManager* Input::getManager()
  192. {
  193. return( smManager );
  194. }
  195. //-----------------------------------------------------------------------------
  196. // Clipboard functions
  197. const char* Platform::getClipboard()
  198. {
  199. //note - this function never returns NULL
  200. return SDL_HasClipboardText() ? SDL_GetClipboardText() : "";
  201. }
  202. //-----------------------------------------------------------------------------
  203. bool Platform::setClipboard(const char *text)
  204. {
  205. if (!text)
  206. return false;
  207. SDL_SetClipboardText(text);
  208. return true;
  209. }
  210. namespace
  211. {
  212. const int TableSize = 256;
  213. U32 SDL_T3D[256];
  214. U32 T3D_SDL[256];
  215. static bool _buildScanCode = true;
  216. }
  217. void mapScanCode(U32 sdl, U32 torque)
  218. {
  219. SDL_T3D[sdl] = torque;
  220. T3D_SDL[torque] = sdl;
  221. }
  222. void buildScanCodeArray()
  223. {
  224. _buildScanCode = false;
  225. for(int i = 0; i < TableSize; ++i)
  226. {
  227. SDL_T3D[i] = 0;
  228. T3D_SDL[i] = 0;
  229. }
  230. // SDL, Torque
  231. mapScanCode(SDL_SCANCODE_A, KEY_A);
  232. mapScanCode(SDL_SCANCODE_B, KEY_B);
  233. mapScanCode(SDL_SCANCODE_C, KEY_C);
  234. mapScanCode(SDL_SCANCODE_D, KEY_D);
  235. mapScanCode(SDL_SCANCODE_E, KEY_E);
  236. mapScanCode(SDL_SCANCODE_F, KEY_F);
  237. mapScanCode(SDL_SCANCODE_G, KEY_G);
  238. mapScanCode(SDL_SCANCODE_H, KEY_H);
  239. mapScanCode(SDL_SCANCODE_I, KEY_I);
  240. mapScanCode(SDL_SCANCODE_J, KEY_J);
  241. mapScanCode(SDL_SCANCODE_K, KEY_K);
  242. mapScanCode(SDL_SCANCODE_L, KEY_L);
  243. mapScanCode(SDL_SCANCODE_M, KEY_M);
  244. mapScanCode(SDL_SCANCODE_N, KEY_N);
  245. mapScanCode(SDL_SCANCODE_O, KEY_O);
  246. mapScanCode(SDL_SCANCODE_P, KEY_P);
  247. mapScanCode(SDL_SCANCODE_Q, KEY_Q);
  248. mapScanCode(SDL_SCANCODE_R, KEY_R);
  249. mapScanCode(SDL_SCANCODE_S, KEY_S);
  250. mapScanCode(SDL_SCANCODE_T, KEY_T);
  251. mapScanCode(SDL_SCANCODE_U, KEY_U);
  252. mapScanCode(SDL_SCANCODE_V, KEY_V);
  253. mapScanCode(SDL_SCANCODE_W, KEY_W);
  254. mapScanCode(SDL_SCANCODE_X, KEY_X);
  255. mapScanCode(SDL_SCANCODE_Y, KEY_Y);
  256. mapScanCode(SDL_SCANCODE_Z, KEY_Z);
  257. mapScanCode(SDL_SCANCODE_1, KEY_1);
  258. mapScanCode(SDL_SCANCODE_2, KEY_2);
  259. mapScanCode(SDL_SCANCODE_3, KEY_3);
  260. mapScanCode(SDL_SCANCODE_4, KEY_4);
  261. mapScanCode(SDL_SCANCODE_5, KEY_5);
  262. mapScanCode(SDL_SCANCODE_6, KEY_6);
  263. mapScanCode(SDL_SCANCODE_7, KEY_7);
  264. mapScanCode(SDL_SCANCODE_8, KEY_8);
  265. mapScanCode(SDL_SCANCODE_9, KEY_9);
  266. mapScanCode(SDL_SCANCODE_0, KEY_0);
  267. mapScanCode(SDL_SCANCODE_BACKSPACE, KEY_BACKSPACE);
  268. mapScanCode(SDL_SCANCODE_TAB, KEY_TAB);
  269. mapScanCode(SDL_SCANCODE_RETURN, KEY_RETURN);
  270. mapScanCode(SDL_SCANCODE_LCTRL, KEY_CONTROL);
  271. mapScanCode(SDL_SCANCODE_RCTRL, KEY_CONTROL);
  272. mapScanCode(SDL_SCANCODE_LALT, KEY_ALT);
  273. mapScanCode(SDL_SCANCODE_RALT, KEY_ALT);
  274. mapScanCode(SDL_SCANCODE_LSHIFT, KEY_SHIFT);
  275. mapScanCode(SDL_SCANCODE_RSHIFT, KEY_SHIFT);
  276. mapScanCode(SDL_SCANCODE_PAUSE, KEY_PAUSE);
  277. mapScanCode(SDL_SCANCODE_CAPSLOCK, KEY_CAPSLOCK);
  278. mapScanCode(SDL_SCANCODE_ESCAPE, KEY_ESCAPE);
  279. mapScanCode(SDL_SCANCODE_SPACE, KEY_SPACE);
  280. mapScanCode(SDL_SCANCODE_PAGEDOWN, KEY_PAGE_DOWN);
  281. mapScanCode(SDL_SCANCODE_PAGEUP, KEY_PAGE_UP);
  282. mapScanCode(SDL_SCANCODE_END, KEY_END);
  283. mapScanCode(SDL_SCANCODE_HOME, KEY_HOME);
  284. mapScanCode(SDL_SCANCODE_LEFT, KEY_LEFT);
  285. mapScanCode(SDL_SCANCODE_UP, KEY_UP);
  286. mapScanCode(SDL_SCANCODE_RIGHT, KEY_RIGHT);
  287. mapScanCode(SDL_SCANCODE_DOWN, KEY_DOWN);
  288. mapScanCode(SDL_SCANCODE_PRINTSCREEN, KEY_PRINT);
  289. mapScanCode(SDL_SCANCODE_INSERT, KEY_INSERT);
  290. mapScanCode(SDL_SCANCODE_DELETE, KEY_DELETE);
  291. mapScanCode(SDL_SCANCODE_HELP, KEY_HELP);
  292. mapScanCode(SDL_SCANCODE_GRAVE, KEY_TILDE);
  293. mapScanCode(SDL_SCANCODE_MINUS, KEY_MINUS);
  294. mapScanCode(SDL_SCANCODE_EQUALS, KEY_EQUALS);
  295. mapScanCode(SDL_SCANCODE_LEFTBRACKET, KEY_LBRACKET);
  296. mapScanCode(SDL_SCANCODE_RIGHTBRACKET, KEY_RBRACKET);
  297. mapScanCode(SDL_SCANCODE_BACKSLASH, KEY_BACKSLASH);
  298. mapScanCode(SDL_SCANCODE_SEMICOLON, KEY_SEMICOLON);
  299. mapScanCode(SDL_SCANCODE_APOSTROPHE, KEY_APOSTROPHE);
  300. mapScanCode(SDL_SCANCODE_COMMA, KEY_COMMA);
  301. mapScanCode(SDL_SCANCODE_PERIOD, KEY_PERIOD);
  302. mapScanCode(SDL_SCANCODE_SLASH, KEY_SLASH);
  303. mapScanCode(SDL_SCANCODE_KP_0, KEY_NUMPAD0);
  304. mapScanCode(SDL_SCANCODE_KP_1, KEY_NUMPAD1);
  305. mapScanCode(SDL_SCANCODE_KP_2, KEY_NUMPAD2);
  306. mapScanCode(SDL_SCANCODE_KP_3, KEY_NUMPAD3);
  307. mapScanCode(SDL_SCANCODE_KP_4, KEY_NUMPAD4);
  308. mapScanCode(SDL_SCANCODE_KP_5, KEY_NUMPAD5);
  309. mapScanCode(SDL_SCANCODE_KP_6, KEY_NUMPAD6);
  310. mapScanCode(SDL_SCANCODE_KP_7, KEY_NUMPAD7);
  311. mapScanCode(SDL_SCANCODE_KP_8, KEY_NUMPAD8);
  312. mapScanCode(SDL_SCANCODE_KP_9, KEY_NUMPAD9);
  313. mapScanCode(SDL_SCANCODE_KP_MULTIPLY, KEY_MULTIPLY);
  314. mapScanCode(SDL_SCANCODE_KP_PLUS, KEY_ADD);
  315. mapScanCode(SDL_SCANCODE_KP_EQUALS, KEY_SEPARATOR);
  316. mapScanCode(SDL_SCANCODE_KP_MINUS, KEY_SUBTRACT);
  317. mapScanCode(SDL_SCANCODE_KP_PERIOD, KEY_DECIMAL);
  318. mapScanCode(SDL_SCANCODE_KP_DIVIDE, KEY_DIVIDE);
  319. mapScanCode(SDL_SCANCODE_KP_ENTER, KEY_NUMPADENTER);
  320. mapScanCode(SDL_SCANCODE_F1, KEY_F1);
  321. mapScanCode(SDL_SCANCODE_F2, KEY_F2);
  322. mapScanCode(SDL_SCANCODE_F3, KEY_F3);
  323. mapScanCode(SDL_SCANCODE_F4, KEY_F4);
  324. mapScanCode(SDL_SCANCODE_F5, KEY_F5);
  325. mapScanCode(SDL_SCANCODE_F6, KEY_F6);
  326. mapScanCode(SDL_SCANCODE_F7, KEY_F7);
  327. mapScanCode(SDL_SCANCODE_F8, KEY_F8);
  328. mapScanCode(SDL_SCANCODE_F9, KEY_F9);
  329. mapScanCode(SDL_SCANCODE_F10, KEY_F10);
  330. mapScanCode(SDL_SCANCODE_F11, KEY_F11);
  331. mapScanCode(SDL_SCANCODE_F12, KEY_F12);
  332. mapScanCode(SDL_SCANCODE_F13, KEY_F13);
  333. mapScanCode(SDL_SCANCODE_F14, KEY_F14);
  334. mapScanCode(SDL_SCANCODE_F15, KEY_F15);
  335. mapScanCode(SDL_SCANCODE_F16, KEY_F16);
  336. mapScanCode(SDL_SCANCODE_F17, KEY_F17);
  337. mapScanCode(SDL_SCANCODE_F18, KEY_F18);
  338. mapScanCode(SDL_SCANCODE_F19, KEY_F19);
  339. mapScanCode(SDL_SCANCODE_F20, KEY_F20);
  340. mapScanCode(SDL_SCANCODE_F21, KEY_F21);
  341. mapScanCode(SDL_SCANCODE_F22, KEY_F22);
  342. mapScanCode(SDL_SCANCODE_F23, KEY_F23);
  343. mapScanCode(SDL_SCANCODE_F24, KEY_F24);
  344. //mapScanCode(SDL_SCANCODE_LOCKINGNUMLOCK, KEY_NUMLOCK);
  345. //mapScanCode(SDL_SCANCODE_LOCKINGSCROLLLOCK, KEY_SCROLLLOCK);
  346. mapScanCode(SDL_SCANCODE_LCTRL, KEY_LCONTROL);
  347. mapScanCode(SDL_SCANCODE_RCTRL, KEY_RCONTROL);
  348. mapScanCode(SDL_SCANCODE_LALT, KEY_LALT);
  349. mapScanCode(SDL_SCANCODE_RALT, KEY_RALT);
  350. mapScanCode(SDL_SCANCODE_LSHIFT, KEY_LSHIFT);
  351. mapScanCode(SDL_SCANCODE_RSHIFT, KEY_RSHIFT);
  352. //mapScanCode(____, KEY_WIN_LWINDOW);
  353. //mapScanCode(____, KEY_WIN_RWINDOW);
  354. //mapScanCode(____, KEY_WIN_APPS);
  355. //mapScanCode(____, KEY_OEM_102);
  356. //mapScanCode(____, KEY_MAC_OPT);
  357. //mapScanCode(____, KEY_MAC_LOPT);
  358. //mapScanCode(____, KEY_MAC_ROPT);
  359. //for(int i = 0; i < 48; ++i)
  360. // mapScanCode(____, KEY_BUTTON0 + i );
  361. //mapScanCode(____, KEY_ANYKEY);
  362. }
  363. U32 KeyMapSDL::getTorqueScanCodeFromSDL(U32 sdl)
  364. {
  365. if(_buildScanCode)
  366. buildScanCodeArray();
  367. return SDL_T3D[sdl];
  368. }
  369. U32 KeyMapSDL::getSDLScanCodeFromTorque(U32 torque)
  370. {
  371. if(_buildScanCode)
  372. buildScanCodeArray();
  373. return T3D_SDL[torque];
  374. }