SDL_keyboard.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_keyboard.c,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. /* General keyboard handling code for SDL */
  23. #include <stdio.h>
  24. #include <ctype.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include "SDL_error.h"
  28. #include "SDL_events.h"
  29. #include "SDL_timer.h"
  30. #include "SDL_events_c.h"
  31. #include "SDL_sysevents.h"
  32. /* Global keystate information */
  33. static Uint8  SDL_KeyState[SDLK_LAST];
  34. static SDLMod SDL_ModState;
  35. int SDL_TranslateUNICODE = 0;
  36. static char *keynames[SDLK_LAST]; /* Array of keycode names */
  37. /*
  38.  * jk 991215 - added
  39.  */
  40. struct {
  41. int firsttime;    /* if we check against the delay or repeat value */
  42. int delay;        /* the delay before we start repeating */
  43. int interval;     /* the delay between key repeat events */
  44. Uint32 timestamp; /* the time the first keydown event occurred */
  45. SDL_Event evt;    /* the event we are supposed to repeat */
  46. } SDL_KeyRepeat;
  47. /* Public functions */
  48. int SDL_KeyboardInit(void)
  49. {
  50. SDL_VideoDevice *video = current_video;
  51. SDL_VideoDevice *this  = current_video;
  52. Uint16 i;
  53. /* Set default mode of UNICODE translation */
  54. SDL_EnableUNICODE(DEFAULT_UNICODE_TRANSLATION);
  55. /* Initialize the tables */
  56. SDL_ModState = KMOD_NONE;
  57. for ( i=0; i<SDL_TABLESIZE(keynames); ++i )
  58. keynames[i] = NULL;
  59. for ( i=0; i<SDL_TABLESIZE(SDL_KeyState); ++i )
  60. SDL_KeyState[i] = SDL_RELEASED;
  61. video->InitOSKeymap(this);
  62. SDL_EnableKeyRepeat(0, 0);
  63. /* Fill in the blanks in keynames */
  64. keynames[SDLK_BACKSPACE] = "backspace";
  65. keynames[SDLK_TAB] = "tab";
  66. keynames[SDLK_CLEAR] = "clear";
  67. keynames[SDLK_RETURN] = "return";
  68. keynames[SDLK_PAUSE] = "pause";
  69. keynames[SDLK_ESCAPE] = "escape";
  70. keynames[SDLK_SPACE] = "space";
  71. keynames[SDLK_EXCLAIM]  = "!";
  72. keynames[SDLK_QUOTEDBL]  = """;
  73. keynames[SDLK_HASH]  = "#";
  74. keynames[SDLK_DOLLAR]  = "$";
  75. keynames[SDLK_AMPERSAND]  = "&";
  76. keynames[SDLK_QUOTE] = "'";
  77. keynames[SDLK_LEFTPAREN] = "(";
  78. keynames[SDLK_RIGHTPAREN] = ")";
  79. keynames[SDLK_ASTERISK] = "*";
  80. keynames[SDLK_PLUS] = "+";
  81. keynames[SDLK_COMMA] = ",";
  82. keynames[SDLK_MINUS] = "-";
  83. keynames[SDLK_PERIOD] = ".";
  84. keynames[SDLK_SLASH] = "/";
  85. keynames[SDLK_0] = "0";
  86. keynames[SDLK_1] = "1";
  87. keynames[SDLK_2] = "2";
  88. keynames[SDLK_3] = "3";
  89. keynames[SDLK_4] = "4";
  90. keynames[SDLK_5] = "5";
  91. keynames[SDLK_6] = "6";
  92. keynames[SDLK_7] = "7";
  93. keynames[SDLK_8] = "8";
  94. keynames[SDLK_9] = "9";
  95. keynames[SDLK_COLON] = ":";
  96. keynames[SDLK_SEMICOLON] = ";";
  97. keynames[SDLK_LESS] = "<";
  98. keynames[SDLK_EQUALS] = "=";
  99. keynames[SDLK_GREATER] = ">";
  100. keynames[SDLK_QUESTION] = "?";
  101. keynames[SDLK_AT] = "@";
  102. keynames[SDLK_LEFTBRACKET] = "[";
  103. keynames[SDLK_BACKSLASH] = "\";
  104. keynames[SDLK_RIGHTBRACKET] = "]";
  105. keynames[SDLK_CARET] = "^";
  106. keynames[SDLK_UNDERSCORE] = "_";
  107. keynames[SDLK_BACKQUOTE] = "`";
  108. keynames[SDLK_a] = "a";
  109. keynames[SDLK_b] = "b";
  110. keynames[SDLK_c] = "c";
  111. keynames[SDLK_d] = "d";
  112. keynames[SDLK_e] = "e";
  113. keynames[SDLK_f] = "f";
  114. keynames[SDLK_g] = "g";
  115. keynames[SDLK_h] = "h";
  116. keynames[SDLK_i] = "i";
  117. keynames[SDLK_j] = "j";
  118. keynames[SDLK_k] = "k";
  119. keynames[SDLK_l] = "l";
  120. keynames[SDLK_m] = "m";
  121. keynames[SDLK_n] = "n";
  122. keynames[SDLK_o] = "o";
  123. keynames[SDLK_p] = "p";
  124. keynames[SDLK_q] = "q";
  125. keynames[SDLK_r] = "r";
  126. keynames[SDLK_s] = "s";
  127. keynames[SDLK_t] = "t";
  128. keynames[SDLK_u] = "u";
  129. keynames[SDLK_v] = "v";
  130. keynames[SDLK_w] = "w";
  131. keynames[SDLK_x] = "x";
  132. keynames[SDLK_y] = "y";
  133. keynames[SDLK_z] = "z";
  134. keynames[SDLK_DELETE] = "delete";
  135. keynames[SDLK_WORLD_0] = "world 0";
  136. keynames[SDLK_WORLD_1] = "world 1";
  137. keynames[SDLK_WORLD_2] = "world 2";
  138. keynames[SDLK_WORLD_3] = "world 3";
  139. keynames[SDLK_WORLD_4] = "world 4";
  140. keynames[SDLK_WORLD_5] = "world 5";
  141. keynames[SDLK_WORLD_6] = "world 6";
  142. keynames[SDLK_WORLD_7] = "world 7";
  143. keynames[SDLK_WORLD_8] = "world 8";
  144. keynames[SDLK_WORLD_9] = "world 9";
  145. keynames[SDLK_WORLD_10] = "world 10";
  146. keynames[SDLK_WORLD_11] = "world 11";
  147. keynames[SDLK_WORLD_12] = "world 12";
  148. keynames[SDLK_WORLD_13] = "world 13";
  149. keynames[SDLK_WORLD_14] = "world 14";
  150. keynames[SDLK_WORLD_15] = "world 15";
  151. keynames[SDLK_WORLD_16] = "world 16";
  152. keynames[SDLK_WORLD_17] = "world 17";
  153. keynames[SDLK_WORLD_18] = "world 18";
  154. keynames[SDLK_WORLD_19] = "world 19";
  155. keynames[SDLK_WORLD_20] = "world 20";
  156. keynames[SDLK_WORLD_21] = "world 21";
  157. keynames[SDLK_WORLD_22] = "world 22";
  158. keynames[SDLK_WORLD_23] = "world 23";
  159. keynames[SDLK_WORLD_24] = "world 24";
  160. keynames[SDLK_WORLD_25] = "world 25";
  161. keynames[SDLK_WORLD_26] = "world 26";
  162. keynames[SDLK_WORLD_27] = "world 27";
  163. keynames[SDLK_WORLD_28] = "world 28";
  164. keynames[SDLK_WORLD_29] = "world 29";
  165. keynames[SDLK_WORLD_30] = "world 30";
  166. keynames[SDLK_WORLD_31] = "world 31";
  167. keynames[SDLK_WORLD_32] = "world 32";
  168. keynames[SDLK_WORLD_33] = "world 33";
  169. keynames[SDLK_WORLD_34] = "world 34";
  170. keynames[SDLK_WORLD_35] = "world 35";
  171. keynames[SDLK_WORLD_36] = "world 36";
  172. keynames[SDLK_WORLD_37] = "world 37";
  173. keynames[SDLK_WORLD_38] = "world 38";
  174. keynames[SDLK_WORLD_39] = "world 39";
  175. keynames[SDLK_WORLD_40] = "world 40";
  176. keynames[SDLK_WORLD_41] = "world 41";
  177. keynames[SDLK_WORLD_42] = "world 42";
  178. keynames[SDLK_WORLD_43] = "world 43";
  179. keynames[SDLK_WORLD_44] = "world 44";
  180. keynames[SDLK_WORLD_45] = "world 45";
  181. keynames[SDLK_WORLD_46] = "world 46";
  182. keynames[SDLK_WORLD_47] = "world 47";
  183. keynames[SDLK_WORLD_48] = "world 48";
  184. keynames[SDLK_WORLD_49] = "world 49";
  185. keynames[SDLK_WORLD_50] = "world 50";
  186. keynames[SDLK_WORLD_51] = "world 51";
  187. keynames[SDLK_WORLD_52] = "world 52";
  188. keynames[SDLK_WORLD_53] = "world 53";
  189. keynames[SDLK_WORLD_54] = "world 54";
  190. keynames[SDLK_WORLD_55] = "world 55";
  191. keynames[SDLK_WORLD_56] = "world 56";
  192. keynames[SDLK_WORLD_57] = "world 57";
  193. keynames[SDLK_WORLD_58] = "world 58";
  194. keynames[SDLK_WORLD_59] = "world 59";
  195. keynames[SDLK_WORLD_60] = "world 60";
  196. keynames[SDLK_WORLD_61] = "world 61";
  197. keynames[SDLK_WORLD_62] = "world 62";
  198. keynames[SDLK_WORLD_63] = "world 63";
  199. keynames[SDLK_WORLD_64] = "world 64";
  200. keynames[SDLK_WORLD_65] = "world 65";
  201. keynames[SDLK_WORLD_66] = "world 66";
  202. keynames[SDLK_WORLD_67] = "world 67";
  203. keynames[SDLK_WORLD_68] = "world 68";
  204. keynames[SDLK_WORLD_69] = "world 69";
  205. keynames[SDLK_WORLD_70] = "world 70";
  206. keynames[SDLK_WORLD_71] = "world 71";
  207. keynames[SDLK_WORLD_72] = "world 72";
  208. keynames[SDLK_WORLD_73] = "world 73";
  209. keynames[SDLK_WORLD_74] = "world 74";
  210. keynames[SDLK_WORLD_75] = "world 75";
  211. keynames[SDLK_WORLD_76] = "world 76";
  212. keynames[SDLK_WORLD_77] = "world 77";
  213. keynames[SDLK_WORLD_78] = "world 78";
  214. keynames[SDLK_WORLD_79] = "world 79";
  215. keynames[SDLK_WORLD_80] = "world 80";
  216. keynames[SDLK_WORLD_81] = "world 81";
  217. keynames[SDLK_WORLD_82] = "world 82";
  218. keynames[SDLK_WORLD_83] = "world 83";
  219. keynames[SDLK_WORLD_84] = "world 84";
  220. keynames[SDLK_WORLD_85] = "world 85";
  221. keynames[SDLK_WORLD_86] = "world 86";
  222. keynames[SDLK_WORLD_87] = "world 87";
  223. keynames[SDLK_WORLD_88] = "world 88";
  224. keynames[SDLK_WORLD_89] = "world 89";
  225. keynames[SDLK_WORLD_90] = "world 90";
  226. keynames[SDLK_WORLD_91] = "world 91";
  227. keynames[SDLK_WORLD_92] = "world 92";
  228. keynames[SDLK_WORLD_93] = "world 93";
  229. keynames[SDLK_WORLD_94] = "world 94";
  230. keynames[SDLK_WORLD_95] = "world 95";
  231. keynames[SDLK_KP0] = "[0]";
  232. keynames[SDLK_KP1] = "[1]";
  233. keynames[SDLK_KP2] = "[2]";
  234. keynames[SDLK_KP3] = "[3]";
  235. keynames[SDLK_KP4] = "[4]";
  236. keynames[SDLK_KP5] = "[5]";
  237. keynames[SDLK_KP6] = "[6]";
  238. keynames[SDLK_KP7] = "[7]";
  239. keynames[SDLK_KP8] = "[8]";
  240. keynames[SDLK_KP9] = "[9]";
  241. keynames[SDLK_KP_PERIOD] = "[.]";
  242. keynames[SDLK_KP_DIVIDE] = "[/]";
  243. keynames[SDLK_KP_MULTIPLY] = "[*]";
  244. keynames[SDLK_KP_MINUS] = "[-]";
  245. keynames[SDLK_KP_PLUS] = "[+]";
  246. keynames[SDLK_KP_ENTER] = "enter";
  247. keynames[SDLK_KP_EQUALS] = "equals";
  248. keynames[SDLK_UP] = "up";
  249. keynames[SDLK_DOWN] = "down";
  250. keynames[SDLK_RIGHT] = "right";
  251. keynames[SDLK_LEFT] = "left";
  252. keynames[SDLK_DOWN] = "down";
  253. keynames[SDLK_INSERT] = "insert";
  254. keynames[SDLK_HOME] = "home";
  255. keynames[SDLK_END] = "end";
  256. keynames[SDLK_PAGEUP] = "page up";
  257. keynames[SDLK_PAGEDOWN] = "page down";
  258. keynames[SDLK_F1] = "f1";
  259. keynames[SDLK_F2] = "f2";
  260. keynames[SDLK_F3] = "f3";
  261. keynames[SDLK_F4] = "f4";
  262. keynames[SDLK_F5] = "f5";
  263. keynames[SDLK_F6] = "f6";
  264. keynames[SDLK_F7] = "f7";
  265. keynames[SDLK_F8] = "f8";
  266. keynames[SDLK_F9] = "f9";
  267. keynames[SDLK_F10] = "f10";
  268. keynames[SDLK_F11] = "f11";
  269. keynames[SDLK_F12] = "f12";
  270. keynames[SDLK_F13] = "f13";
  271. keynames[SDLK_F14] = "f14";
  272. keynames[SDLK_F15] = "f15";
  273. keynames[SDLK_NUMLOCK] = "numlock";
  274. keynames[SDLK_CAPSLOCK] = "caps lock";
  275. keynames[SDLK_SCROLLOCK] = "scroll lock";
  276. keynames[SDLK_RSHIFT] = "right shift";
  277. keynames[SDLK_LSHIFT] = "left shift";
  278. keynames[SDLK_RCTRL] = "right ctrl";
  279. keynames[SDLK_LCTRL] = "left ctrl";
  280. keynames[SDLK_RALT] = "right alt";
  281. keynames[SDLK_LALT] = "left alt";
  282. keynames[SDLK_RMETA] = "right meta";
  283. keynames[SDLK_LMETA] = "left meta";
  284. keynames[SDLK_LSUPER] = "left super"; /* "Windows" keys */
  285. keynames[SDLK_RSUPER] = "right super";
  286. keynames[SDLK_MODE] = "alt gr";
  287. keynames[SDLK_COMPOSE] = "compose";
  288. keynames[SDLK_HELP] = "help";
  289. keynames[SDLK_PRINT] = "print screen";
  290. keynames[SDLK_SYSREQ] = "sys req";
  291. keynames[SDLK_BREAK] = "break";
  292. keynames[SDLK_MENU] = "menu";
  293. keynames[SDLK_POWER] = "power";
  294. keynames[SDLK_EURO] = "euro";
  295. keynames[SDLK_UNDO] = "undo";
  296. /* Done.  Whew. */
  297. return(0);
  298. }
  299. /* We lost the keyboard, so post key up messages for all pressed keys */
  300. void SDL_ResetKeyboard(void)
  301. {
  302. SDL_keysym keysym;
  303. SDLKey key;
  304. memset(&keysym, 0, (sizeof keysym));
  305. for ( key=SDLK_FIRST; key<SDLK_LAST; ++key ) {
  306. if ( SDL_KeyState[key] == SDL_PRESSED ) {
  307. keysym.sym = key;
  308. SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
  309. }
  310. }
  311. SDL_KeyRepeat.timestamp = 0;
  312. }
  313. int SDL_EnableUNICODE(int enable)
  314. {
  315. int old_mode;
  316. old_mode = SDL_TranslateUNICODE;
  317. if ( enable >= 0 ) {
  318. SDL_TranslateUNICODE = enable;
  319. }
  320. return(old_mode);
  321. }
  322. Uint8 * SDL_GetKeyState (int *numkeys)
  323. {
  324. if ( numkeys != (int *)0 )
  325. *numkeys = SDLK_LAST;
  326. return(SDL_KeyState);
  327. }
  328. SDLMod SDL_GetModState (void)
  329. {
  330. return(SDL_ModState);
  331. }
  332. void SDL_SetModState (SDLMod modstate)
  333. {
  334. SDL_ModState = modstate;
  335. }
  336. char *SDL_GetKeyName(SDLKey key)
  337. {
  338. char *keyname;
  339. keyname = NULL;
  340. if ( key < SDLK_LAST ) {
  341. keyname = keynames[key];
  342. }
  343. if ( keyname == NULL ) {
  344. keyname = "unknown key";
  345. }
  346. return(keyname);
  347. }
  348. /* These are global for SDL_eventloop.c */
  349. int SDL_PrivateKeyboard(Uint8 state, SDL_keysym *keysym)
  350. {
  351. SDL_Event event;
  352. int posted, repeatable;
  353. Uint16 modstate;
  354. memset(&event, 0, sizeof(event));
  355. #if 0
  356. printf("The '%s' key has been %sn", SDL_GetKeyName(keysym->sym), 
  357. state == SDL_PRESSED ? "pressed" : "released");
  358. #endif
  359. /* Set up the keysym */
  360. modstate = (Uint16)SDL_ModState;
  361. repeatable = 0;
  362. if ( state == SDL_PRESSED ) {
  363. keysym->mod = (SDLMod)modstate;
  364. switch (keysym->sym) {
  365. case SDLK_NUMLOCK:
  366. modstate ^= KMOD_NUM;
  367. if ( ! (modstate&KMOD_NUM) )
  368. state = SDL_RELEASED;
  369. keysym->mod = (SDLMod)modstate;
  370. break;
  371. case SDLK_CAPSLOCK:
  372. modstate ^= KMOD_CAPS;
  373. if ( ! (modstate&KMOD_CAPS) )
  374. state = SDL_RELEASED;
  375. keysym->mod = (SDLMod)modstate;
  376. break;
  377. case SDLK_LCTRL:
  378. modstate |= KMOD_LCTRL;
  379. break;
  380. case SDLK_RCTRL:
  381. modstate |= KMOD_RCTRL;
  382. break;
  383. case SDLK_LSHIFT:
  384. modstate |= KMOD_LSHIFT;
  385. break;
  386. case SDLK_RSHIFT:
  387. modstate |= KMOD_RSHIFT;
  388. break;
  389. case SDLK_LALT:
  390. modstate |= KMOD_LALT;
  391. break;
  392. case SDLK_RALT:
  393. modstate |= KMOD_RALT;
  394. break;
  395. case SDLK_LMETA:
  396. modstate |= KMOD_LMETA;
  397. break;
  398. case SDLK_RMETA:
  399. modstate |= KMOD_RMETA;
  400. break;
  401. case SDLK_MODE:
  402. modstate |= KMOD_MODE;
  403. break;
  404. default:
  405. repeatable = 1;
  406. break;
  407. }
  408. } else {
  409. switch (keysym->sym) {
  410. case SDLK_NUMLOCK:
  411. case SDLK_CAPSLOCK:
  412. /* Only send keydown events */
  413. return(0);
  414. case SDLK_LCTRL:
  415. modstate &= ~KMOD_LCTRL;
  416. break;
  417. case SDLK_RCTRL:
  418. modstate &= ~KMOD_RCTRL;
  419. break;
  420. case SDLK_LSHIFT:
  421. modstate &= ~KMOD_LSHIFT;
  422. break;
  423. case SDLK_RSHIFT:
  424. modstate &= ~KMOD_RSHIFT;
  425. break;
  426. case SDLK_LALT:
  427. modstate &= ~KMOD_LALT;
  428. break;
  429. case SDLK_RALT:
  430. modstate &= ~KMOD_RALT;
  431. break;
  432. case SDLK_LMETA:
  433. modstate &= ~KMOD_LMETA;
  434. break;
  435. case SDLK_RMETA:
  436. modstate &= ~KMOD_RMETA;
  437. break;
  438. case SDLK_MODE:
  439. modstate &= ~KMOD_MODE;
  440. break;
  441. default:
  442. break;
  443. }
  444. keysym->mod = (SDLMod)modstate;
  445. }
  446. /* Figure out what type of event this is */
  447. switch (state) {
  448. case SDL_PRESSED:
  449. event.type = SDL_KEYDOWN;
  450. break;
  451. case SDL_RELEASED:
  452. event.type = SDL_KEYUP;
  453. /*
  454.  * jk 991215 - Added
  455.  */
  456. if ( SDL_KeyRepeat.timestamp ) {
  457. SDL_KeyRepeat.timestamp = 0;
  458. }
  459. break;
  460. default:
  461. /* Invalid state -- bail */
  462. return(0);
  463. }
  464. /* Drop events that don't change state */
  465. if ( SDL_KeyState[keysym->sym] == state ) {
  466. return(0);
  467. }
  468. /* Update internal keyboard state */
  469. SDL_ModState = (SDLMod)modstate;
  470. SDL_KeyState[keysym->sym] = state;
  471. /* Post the event, if desired */
  472. posted = 0;
  473. if ( SDL_ProcessEvents[event.type] == SDL_ENABLE ) {
  474. event.key.state = state;
  475. event.key.keysym = *keysym;
  476. /*
  477.  * jk 991215 - Added
  478.  */
  479. if (repeatable && (SDL_KeyRepeat.delay != 0)) {
  480. SDL_KeyRepeat.evt = event;
  481. SDL_KeyRepeat.firsttime = 1;
  482. SDL_KeyRepeat.timestamp=SDL_GetTicks();
  483. }
  484. if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
  485. posted = 1;
  486. SDL_PushEvent(&event);
  487. }
  488. }
  489. return(posted);
  490. }
  491. /*
  492.  * jk 991215 - Added
  493.  */
  494. void SDL_CheckKeyRepeat(void)
  495. {
  496. if ( SDL_KeyRepeat.timestamp ) {
  497. Uint32 now, interval;
  498. now = SDL_GetTicks();
  499. interval = (now - SDL_KeyRepeat.timestamp);
  500. if ( SDL_KeyRepeat.firsttime ) {
  501. if ( interval > (Uint32)SDL_KeyRepeat.delay ) {
  502. SDL_KeyRepeat.timestamp = now;
  503. SDL_KeyRepeat.firsttime = 0;
  504. }
  505. } else {
  506. if ( interval > (Uint32)SDL_KeyRepeat.interval ) {
  507. SDL_KeyRepeat.timestamp = now;
  508. if ( (SDL_EventOK == NULL) || SDL_EventOK(&SDL_KeyRepeat.evt) ) {
  509. SDL_PushEvent(&SDL_KeyRepeat.evt);
  510. }
  511. }
  512. }
  513. }
  514. }
  515. int SDL_EnableKeyRepeat(int delay, int interval)
  516. {
  517. if ( (delay < 0) || (interval < 0) ) {
  518. SDL_SetError("keyboard repeat value less than zero");
  519. return(-1);
  520. }
  521. SDL_KeyRepeat.firsttime = 0;
  522. SDL_KeyRepeat.delay = delay;
  523. SDL_KeyRepeat.interval = interval;
  524. SDL_KeyRepeat.timestamp = 0;
  525. return(0);
  526. }