3 #include <linux/input.h>
6 #include "common/input.h"
8 static unsigned char g_keystate[SDLK_LAST];
10 static short pmsdl_map[KEY_CNT] = {
47 [KEY_SPACE] = SDLK_SPACE,
48 [KEY_BACKSPACE] = SDLK_BACKSPACE,
50 [KEY_DOT] = SDLK_PERIOD,
51 [KEY_ENTER] = SDLK_RETURN,
52 [KEY_LEFTSHIFT] = SDLK_LSHIFT,
53 [KEY_COMMA] = SDLK_COMMA,
54 // [KEY_BRIGHTNESSUP] =
55 // [KEY_BRIGHTNESSDOWN] =
58 [KEY_INSERT] = SDLK_INSERT,
59 [KEY_EQUAL] = SDLK_EQUALS,
60 [KEY_KPPLUS] = SDLK_KP_PLUS,
61 [KEY_BACKSLASH] = SDLK_BACKSLASH,
62 [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET,
63 [KEY_KPMINUS] = SDLK_KP_MINUS,
64 [KEY_QUESTION] = SDLK_QUESTION,
65 [KEY_LEFTBRACE] = SDLK_LEFTBRACKET,
66 [KEY_SLASH] = SDLK_SLASH,
68 [KEY_APOSTROPHE]= SDLK_QUOTE,
69 [KEY_ESC] = SDLK_ESCAPE,
70 [KEY_CAPSLOCK] = SDLK_CAPSLOCK,
71 [KEY_SEMICOLON] = SDLK_SEMICOLON,
84 [KEY_F13] = KEY_F13, /* apostrophe, differs from Fn-A? */
85 [KEY_F14] = KEY_F14, /* pipe/bar */
86 [KEY_F15] = KEY_F15, /* dash */
87 [KEY_F16] = SDLK_HASH, /* # (pound/hash) */
88 [KEY_F17] = SDLK_EXCLAIM, /* ! */
89 // [KEY_F18] = /* £ (pound) */
90 [KEY_F19] = SDLK_QUOTEDBL,/* " */
91 [KEY_F20] = SDLK_AT, /* @ */
92 [KEY_F21] = SDLK_SEMICOLON,/* : */
97 [KEY_DOWN] = SDLK_DOWN,
98 [KEY_LEFT] = SDLK_LEFT,
99 [KEY_RIGHT] = SDLK_RIGHT,
100 [KEY_HOME] = SDLK_HOME,
101 [KEY_END] = SDLK_END,
102 [KEY_PAGEUP] = SDLK_PAGEUP,
103 [KEY_PAGEDOWN] = SDLK_PAGEDOWN,
104 [KEY_LEFTALT] = SDLK_LALT,
105 [KEY_LEFTCTRL] = SDLK_LCTRL,
107 [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
108 [KEY_RIGHTCTRL] = SDLK_RCTRL,
111 #define DNKEY(x) [SDLK_##x] = #x
112 static const char *sdl_keynames[SDLK_LAST] = {
336 void pmsdl_input_bind(const char *kname, const char *sdlname)
340 kc = in_get_key_code(-1, kname);
342 err("can't resolve key '%s'", kname);
346 if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
349 for (i = 0; i < SDLK_LAST; i++) {
350 if (sdl_keynames[i] == NULL)
352 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
363 err("can't resolve SDL key '%s'", sdlname);
366 void pmsdl_input_init(void)
372 static int do_event(SDL_Event *event, int timeout)
380 kc = in_update_keycode(NULL, &is_down, timeout);
381 if (kc < 0 || kc > KEY_MAX)
389 g_keystate[key] = is_down;
392 return 1; // FIXME: ..but the event is lost
394 memset(event, 0, sizeof(event->key));
395 event->type = is_down ? SDL_KEYDOWN : SDL_KEYUP;
396 // event->key.which =
397 event->key.state = is_down ? SDL_PRESSED : SDL_RELEASED;
398 event->key.keysym.sym = key;
399 // event->key.keysym.mod
406 SDL_WaitEvent(SDL_Event *event)
410 return do_event(event, -1);
414 SDL_PollEvent(SDL_Event *event)
418 return do_event(event, 0);
421 DECLSPEC Uint8 * SDLCALL
422 SDL_GetKeyState(int *numkeys)
424 trace("%p", numkeys);
427 *numkeys = ARRAY_SIZE(g_keystate);
431 DECLSPEC char * SDLCALL
432 SDL_GetKeyName(SDLKey key)
436 if ((unsigned int)key < ARRAY_SIZE(sdl_keynames))
437 return (char *)sdl_keynames[key];
443 SDL_EnableUNICODE(int enable)
454 SDL_EnableKeyRepeat(int delay, int interval)
456 trace("%d, %d", delay, interval);
463 DECLSPEC void SDLCALL
464 SDL_GetKeyRepeat(int *delay, int *interval)
466 trace("%p, %p", delay, interval);
474 DECLSPEC SDLMod SDLCALL
475 SDL_GetModState(void)
477 static const short syms[] = { SDLK_LSHIFT, SDLK_RSHIFT, SDLK_LCTRL, SDLK_RCTRL, SDLK_LALT,
478 SDLK_RALT, SDLK_LMETA, SDLK_RMETA, SDLK_NUMLOCK, SDLK_CAPSLOCK, SDLK_MODE };
479 static const short mods[] = { KMOD_LSHIFT, KMOD_RSHIFT, KMOD_LCTRL, KMOD_RCTRL, KMOD_LALT,
480 KMOD_RALT, KMOD_LMETA, KMOD_RMETA, KMOD_NUM, KMOD_CAPS, KMOD_MODE };
481 SDLMod ret = KMOD_NONE;
486 for (i = 0; i < ARRAY_SIZE(syms); i++)
487 if (g_keystate[syms[i]])
495 SDL_NumJoysticks(void)
501 DECLSPEC SDL_Joystick * SDLCALL
502 SDL_JoystickOpen(int device_index)
504 trace("%d", device_index);