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 short pmsdl_map[KEY_CNT] = {
52 [KEY_SPACE] = SDLK_SPACE,
53 [KEY_BACKSPACE] = SDLK_BACKSPACE,
55 [KEY_DOT] = SDLK_PERIOD,
56 [KEY_ENTER] = SDLK_RETURN,
57 [KEY_LEFTSHIFT] = SDLK_LSHIFT,
58 [KEY_COMMA] = SDLK_COMMA,
59 // [KEY_BRIGHTNESSUP] =
60 // [KEY_BRIGHTNESSDOWN] =
63 [KEY_INSERT] = SDLK_INSERT,
64 [KEY_EQUAL] = SDLK_EQUALS,
65 [KEY_KPPLUS] = SDLK_KP_PLUS,
66 [KEY_BACKSLASH] = SDLK_BACKSLASH,
67 [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET,
68 [KEY_KPMINUS] = SDLK_KP_MINUS,
69 [KEY_QUESTION] = SDLK_QUESTION,
70 [KEY_LEFTBRACE] = SDLK_LEFTBRACKET,
71 [KEY_SLASH] = SDLK_SLASH,
73 [KEY_APOSTROPHE]= SDLK_QUOTE,
74 [KEY_ESC] = SDLK_ESCAPE,
75 [KEY_CAPSLOCK] = SDLK_CAPSLOCK,
76 [KEY_SEMICOLON] = SDLK_SEMICOLON,
89 [KEY_F13] = KEY_F13, /* apostrophe, differs from Fn-A? */
90 [KEY_F14] = KEY_F14, /* pipe/bar */
91 [KEY_F15] = KEY_F15, /* dash */
92 [KEY_F16] = SDLK_HASH, /* # (pound/hash) */
93 [KEY_F17] = SDLK_EXCLAIM, /* ! */
94 // [KEY_F18] = /* £ (pound) */
95 [KEY_F19] = SDLK_QUOTEDBL,/* " */
96 [KEY_F20] = SDLK_AT, /* @ */
97 [KEY_F21] = SDLK_SEMICOLON,/* : */
102 [KEY_DOWN] = SDLK_DOWN,
103 [KEY_LEFT] = SDLK_LEFT,
104 [KEY_RIGHT] = SDLK_RIGHT,
105 [KEY_HOME] = SDLK_HOME,
106 [KEY_END] = SDLK_END,
107 [KEY_PAGEUP] = SDLK_PAGEUP,
108 [KEY_PAGEDOWN] = SDLK_PAGEDOWN,
109 [KEY_LEFTALT] = SDLK_LALT,
110 [KEY_LEFTCTRL] = SDLK_LCTRL,
112 [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
113 [KEY_RIGHTCTRL] = SDLK_RCTRL,
116 #define DNKEY(x) [SDLK_##x] = #x
117 static const char *sdl_keynames[SDLK_LAST] = {
341 void omapsdl_input_bind(const char *kname, const char *sdlname)
345 kc = in_get_key_code(-1, kname);
347 err("can't resolve key '%s'", kname);
351 if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
354 for (i = 0; i < SDLK_LAST; i++) {
355 if (sdl_keynames[i] == NULL)
357 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
368 err("can't resolve SDL key '%s'", sdlname);
371 void omapsdl_input_init(void)
377 int omapsdl_input_get_event(int *is_down, int timeout)
385 kc = in_update_keycode(NULL, is_down, timeout);
386 if (kc < 0 || kc > KEY_MAX)
400 static unsigned char g_keystate[SDLK_LAST];
402 static int do_event(SDL_Event *event, int timeout)
406 key = omapsdl_input_get_event(&is_down, timeout);
410 g_keystate[key] = is_down;
413 return 1; // FIXME: ..but the event is lost
415 memset(event, 0, sizeof(event->key));
416 event->type = is_down ? SDL_KEYDOWN : SDL_KEYUP;
417 // event->key.which =
418 event->key.state = is_down ? SDL_PRESSED : SDL_RELEASED;
419 event->key.keysym.sym = key;
420 // event->key.keysym.mod
426 SDL_WaitEvent(SDL_Event *event)
430 return do_event(event, -1);
434 SDL_PollEvent(SDL_Event *event)
438 return do_event(event, 0);
441 DECLSPEC Uint8 * SDLCALL
442 SDL_GetKeyState(int *numkeys)
444 trace("%p", numkeys);
447 *numkeys = ARRAY_SIZE(g_keystate);
451 DECLSPEC char * SDLCALL
452 SDL_GetKeyName(SDLKey key)
456 if ((unsigned int)key < ARRAY_SIZE(sdl_keynames))
457 return (char *)sdl_keynames[key];
463 SDL_EnableUNICODE(int enable)
474 SDL_EnableKeyRepeat(int delay, int interval)
476 trace("%d, %d", delay, interval);
483 DECLSPEC void SDLCALL
484 SDL_GetKeyRepeat(int *delay, int *interval)
486 trace("%p, %p", delay, interval);
494 DECLSPEC SDLMod SDLCALL
495 SDL_GetModState(void)
497 static const short syms[] = { SDLK_LSHIFT, SDLK_RSHIFT, SDLK_LCTRL, SDLK_RCTRL, SDLK_LALT,
498 SDLK_RALT, SDLK_LMETA, SDLK_RMETA, SDLK_NUMLOCK, SDLK_CAPSLOCK, SDLK_MODE };
499 static const short mods[] = { KMOD_LSHIFT, KMOD_RSHIFT, KMOD_LCTRL, KMOD_RCTRL, KMOD_LALT,
500 KMOD_RALT, KMOD_LMETA, KMOD_RMETA, KMOD_NUM, KMOD_CAPS, KMOD_MODE };
501 SDLMod ret = KMOD_NONE;
506 for (i = 0; i < ARRAY_SIZE(syms); i++)
507 if (g_keystate[syms[i]])
515 SDL_NumJoysticks(void)
521 DECLSPEC SDL_Joystick * SDLCALL
522 SDL_JoystickOpen(int device_index)
524 trace("%d", device_index);