4 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
5 * See the COPYING file in the top-level directory.
10 #include <linux/input.h>
13 #include "common/input.h"
15 static unsigned char g_keystate[SDLK_LAST];
17 static short pmsdl_map[KEY_CNT] = {
54 [KEY_SPACE] = SDLK_SPACE,
55 [KEY_BACKSPACE] = SDLK_BACKSPACE,
57 [KEY_DOT] = SDLK_PERIOD,
58 [KEY_ENTER] = SDLK_RETURN,
59 [KEY_LEFTSHIFT] = SDLK_LSHIFT,
60 [KEY_COMMA] = SDLK_COMMA,
61 // [KEY_BRIGHTNESSUP] =
62 // [KEY_BRIGHTNESSDOWN] =
65 [KEY_INSERT] = SDLK_INSERT,
66 [KEY_EQUAL] = SDLK_EQUALS,
67 [KEY_KPPLUS] = SDLK_KP_PLUS,
68 [KEY_BACKSLASH] = SDLK_BACKSLASH,
69 [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET,
70 [KEY_KPMINUS] = SDLK_KP_MINUS,
71 [KEY_QUESTION] = SDLK_QUESTION,
72 [KEY_LEFTBRACE] = SDLK_LEFTBRACKET,
73 [KEY_SLASH] = SDLK_SLASH,
75 [KEY_APOSTROPHE]= SDLK_QUOTE,
76 [KEY_ESC] = SDLK_ESCAPE,
77 [KEY_CAPSLOCK] = SDLK_CAPSLOCK,
78 [KEY_SEMICOLON] = SDLK_SEMICOLON,
91 [KEY_F13] = KEY_F13, /* apostrophe, differs from Fn-A? */
92 [KEY_F14] = KEY_F14, /* pipe/bar */
93 [KEY_F15] = KEY_F15, /* dash */
94 [KEY_F16] = SDLK_HASH, /* # (pound/hash) */
95 [KEY_F17] = SDLK_EXCLAIM, /* ! */
96 // [KEY_F18] = /* £ (pound) */
97 [KEY_F19] = SDLK_QUOTEDBL,/* " */
98 [KEY_F20] = SDLK_AT, /* @ */
99 [KEY_F21] = SDLK_SEMICOLON,/* : */
104 [KEY_DOWN] = SDLK_DOWN,
105 [KEY_LEFT] = SDLK_LEFT,
106 [KEY_RIGHT] = SDLK_RIGHT,
107 [KEY_HOME] = SDLK_HOME,
108 [KEY_END] = SDLK_END,
109 [KEY_PAGEUP] = SDLK_PAGEUP,
110 [KEY_PAGEDOWN] = SDLK_PAGEDOWN,
111 [KEY_LEFTALT] = SDLK_LALT,
112 [KEY_LEFTCTRL] = SDLK_LCTRL,
114 [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
115 [KEY_RIGHTCTRL] = SDLK_RCTRL,
118 #define DNKEY(x) [SDLK_##x] = #x
119 static const char *sdl_keynames[SDLK_LAST] = {
343 void omapsdl_input_bind(const char *kname, const char *sdlname)
347 kc = in_get_key_code(-1, kname);
349 err("can't resolve key '%s'", kname);
353 if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
356 for (i = 0; i < SDLK_LAST; i++) {
357 if (sdl_keynames[i] == NULL)
359 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
370 err("can't resolve SDL key '%s'", sdlname);
373 void omapsdl_input_init(void)
379 int omapsdl_input_get_event(void *event_, int timeout)
381 SDL_Event *event = event_;
388 kc = in_update_keycode(NULL, &is_down, timeout);
389 if (kc < 0 || kc > KEY_MAX)
397 g_keystate[key] = is_down;
400 return 1; // FIXME: ..but the event is lost
402 memset(event, 0, sizeof(event->key));
403 event->type = is_down ? SDL_KEYDOWN : SDL_KEYUP;
404 // event->key.which =
405 event->key.state = is_down ? SDL_PRESSED : SDL_RELEASED;
406 event->key.keysym.sym = key;
407 // event->key.keysym.mod
416 SDL_WaitEvent(SDL_Event *event)
420 return omapsdl_input_get_event(event, -1);
424 SDL_PollEvent(SDL_Event *event)
428 return omapsdl_input_get_event(event, 0);
431 DECLSPEC Uint8 * SDLCALL
432 SDL_GetKeyState(int *numkeys)
434 trace("%p", numkeys);
437 *numkeys = ARRAY_SIZE(g_keystate);
441 DECLSPEC char * SDLCALL
442 SDL_GetKeyName(SDLKey key)
446 if ((unsigned int)key < ARRAY_SIZE(sdl_keynames))
447 return (char *)sdl_keynames[key];
453 SDL_EnableUNICODE(int enable)
464 SDL_EnableKeyRepeat(int delay, int interval)
466 trace("%d, %d", delay, interval);
473 DECLSPEC void SDLCALL
474 SDL_GetKeyRepeat(int *delay, int *interval)
476 trace("%p, %p", delay, interval);
484 DECLSPEC SDLMod SDLCALL
485 SDL_GetModState(void)
487 static const short syms[] = { SDLK_LSHIFT, SDLK_RSHIFT, SDLK_LCTRL, SDLK_RCTRL, SDLK_LALT,
488 SDLK_RALT, SDLK_LMETA, SDLK_RMETA, SDLK_NUMLOCK, SDLK_CAPSLOCK, SDLK_MODE };
489 static const short mods[] = { KMOD_LSHIFT, KMOD_RSHIFT, KMOD_LCTRL, KMOD_RCTRL, KMOD_LALT,
490 KMOD_RALT, KMOD_LMETA, KMOD_RMETA, KMOD_NUM, KMOD_CAPS, KMOD_MODE };
491 SDLMod ret = KMOD_NONE;
496 for (i = 0; i < ARRAY_SIZE(syms); i++)
497 if (g_keystate[syms[i]])
505 SDL_NumJoysticks(void)
511 DECLSPEC SDL_Joystick * SDLCALL
512 SDL_JoystickOpen(int device_index)
514 trace("%d", device_index);