add input, basic config
[sdl_omap.git] / src / video / omapdss / pmsdl_input.c
1 #include <strings.h>
2 #include <SDL/SDL.h>
3 #include <linux/input.h>
4
5 #include "pmsdl.h"
6 #include "common/input.h"
7
8 static unsigned char g_keystate[SDLK_LAST];
9
10 static short pmsdl_map[KEY_CNT] = {
11         [KEY_0]         = SDLK_0,
12         [KEY_1]         = SDLK_1,
13         [KEY_2]         = SDLK_2,
14         [KEY_3]         = SDLK_3,
15         [KEY_4]         = SDLK_4,
16         [KEY_5]         = SDLK_5,
17         [KEY_6]         = SDLK_6,
18         [KEY_7]         = SDLK_7,
19         [KEY_8]         = SDLK_8,
20         [KEY_9]         = SDLK_9,
21         [KEY_A]         = SDLK_a,
22         [KEY_B]         = SDLK_b,
23         [KEY_C]         = SDLK_c,
24         [KEY_D]         = SDLK_d,
25         [KEY_E]         = SDLK_e,
26         [KEY_F]         = SDLK_f,
27         [KEY_G]         = SDLK_g,
28         [KEY_H]         = SDLK_h,
29         [KEY_I]         = SDLK_i,
30         [KEY_J]         = SDLK_j,
31         [KEY_K]         = SDLK_k,
32         [KEY_L]         = SDLK_l,
33         [KEY_M]         = SDLK_m,
34         [KEY_N]         = SDLK_n,
35         [KEY_O]         = SDLK_o,
36         [KEY_P]         = SDLK_p,
37         [KEY_Q]         = SDLK_q,
38         [KEY_R]         = SDLK_r,
39         [KEY_S]         = SDLK_s,
40         [KEY_T]         = SDLK_t,
41         [KEY_U]         = SDLK_u,
42         [KEY_V]         = SDLK_v,
43         [KEY_W]         = SDLK_w,
44         [KEY_X]         = SDLK_x,
45         [KEY_Y]         = SDLK_y,
46         [KEY_Z]         = SDLK_z,
47         [KEY_SPACE]     = SDLK_SPACE,
48         [KEY_BACKSPACE] = SDLK_BACKSPACE,
49         [KEY_FN]        = SDLK_MODE,
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]    =
56 //      [KEY_GRAVE]     =
57         [KEY_TAB]       = SDLK_TAB,
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,
67 //      [KEY_YEN]       =
68         [KEY_APOSTROPHE]= SDLK_QUOTE,
69         [KEY_ESC]       = SDLK_ESCAPE,
70         [KEY_CAPSLOCK]  = SDLK_CAPSLOCK,
71         [KEY_SEMICOLON] = SDLK_SEMICOLON,
72         [KEY_F1]        = SDLK_F1,
73         [KEY_F2]        = SDLK_F2,
74         [KEY_F3]        = SDLK_F3,
75         [KEY_F4]        = SDLK_F4,
76         [KEY_F5]        = SDLK_F5,
77         [KEY_F6]        = SDLK_F6,
78         [KEY_F7]        = SDLK_F7,
79         [KEY_F8]        = SDLK_F8,
80         [KEY_F9]        = SDLK_F9,
81         [KEY_F10]       = KEY_F10,
82         [KEY_F11]       = KEY_F11,
83         [KEY_F12]       = KEY_F12,
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,/* : */
93 //      [KEY_F22]       =
94 //      [KEY_F23]       =
95
96         [KEY_UP]        = SDLK_UP,
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,
106 //      [KEY_MENU]      =
107         [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
108         [KEY_RIGHTCTRL] = SDLK_RCTRL,
109 };
110
111 #define DNKEY(x) [SDLK_##x] = #x
112 static const char *sdl_keynames[SDLK_LAST] = {
113         DNKEY(BACKSPACE),
114         DNKEY(TAB),
115         DNKEY(RETURN),
116         DNKEY(ESCAPE),
117         DNKEY(SPACE),
118         DNKEY(EXCLAIM),
119         DNKEY(QUOTEDBL),
120         DNKEY(HASH),
121         DNKEY(DOLLAR),
122         DNKEY(AMPERSAND),
123         DNKEY(QUOTE),
124         DNKEY(LEFTPAREN),
125         DNKEY(RIGHTPAREN),
126         DNKEY(ASTERISK),
127         DNKEY(PLUS),
128         DNKEY(COMMA),
129         DNKEY(MINUS),
130         DNKEY(PERIOD),
131         DNKEY(SLASH),
132         DNKEY(0),
133         DNKEY(1),
134         DNKEY(2),
135         DNKEY(3),
136         DNKEY(4),
137         DNKEY(5),
138         DNKEY(6),
139         DNKEY(7),
140         DNKEY(8),
141         DNKEY(9),
142         DNKEY(COLON),
143         DNKEY(SEMICOLON),
144         DNKEY(LESS),
145         DNKEY(EQUALS),
146         DNKEY(GREATER),
147         DNKEY(QUESTION),
148         DNKEY(AT),
149         DNKEY(LEFTBRACKET),
150         DNKEY(BACKSLASH),
151         DNKEY(RIGHTBRACKET),
152         DNKEY(CARET),
153         DNKEY(UNDERSCORE),
154         DNKEY(BACKQUOTE),
155         DNKEY(a),
156         DNKEY(b),
157         DNKEY(c),
158         DNKEY(d),
159         DNKEY(e),
160         DNKEY(f),
161         DNKEY(g),
162         DNKEY(h),
163         DNKEY(i),
164         DNKEY(j),
165         DNKEY(k),
166         DNKEY(l),
167         DNKEY(m),
168         DNKEY(n),
169         DNKEY(o),
170         DNKEY(p),
171         DNKEY(q),
172         DNKEY(r),
173         DNKEY(s),
174         DNKEY(t),
175         DNKEY(u),
176         DNKEY(v),
177         DNKEY(w),
178         DNKEY(x),
179         DNKEY(y),
180         DNKEY(z),
181         DNKEY(DELETE),
182         DNKEY(WORLD_0),
183         DNKEY(WORLD_1),
184         DNKEY(WORLD_2),
185         DNKEY(WORLD_3),
186         DNKEY(WORLD_4),
187         DNKEY(WORLD_5),
188         DNKEY(WORLD_6),
189         DNKEY(WORLD_7),
190         DNKEY(WORLD_8),
191         DNKEY(WORLD_9),
192         DNKEY(WORLD_10),
193         DNKEY(WORLD_11),
194         DNKEY(WORLD_12),
195         DNKEY(WORLD_13),
196         DNKEY(WORLD_14),
197         DNKEY(WORLD_15),
198         DNKEY(WORLD_16),
199         DNKEY(WORLD_17),
200         DNKEY(WORLD_18),
201         DNKEY(WORLD_19),
202         DNKEY(WORLD_20),
203         DNKEY(WORLD_21),
204         DNKEY(WORLD_22),
205         DNKEY(WORLD_23),
206         DNKEY(WORLD_24),
207         DNKEY(WORLD_25),
208         DNKEY(WORLD_26),
209         DNKEY(WORLD_27),
210         DNKEY(WORLD_28),
211         DNKEY(WORLD_29),
212         DNKEY(WORLD_30),
213         DNKEY(WORLD_31),
214         DNKEY(WORLD_32),
215         DNKEY(WORLD_33),
216         DNKEY(WORLD_34),
217         DNKEY(WORLD_35),
218         DNKEY(WORLD_36),
219         DNKEY(WORLD_37),
220         DNKEY(WORLD_38),
221         DNKEY(WORLD_39),
222         DNKEY(WORLD_40),
223         DNKEY(WORLD_41),
224         DNKEY(WORLD_42),
225         DNKEY(WORLD_43),
226         DNKEY(WORLD_44),
227         DNKEY(WORLD_45),
228         DNKEY(WORLD_46),
229         DNKEY(WORLD_47),
230         DNKEY(WORLD_48),
231         DNKEY(WORLD_49),
232         DNKEY(WORLD_50),
233         DNKEY(WORLD_51),
234         DNKEY(WORLD_52),
235         DNKEY(WORLD_53),
236         DNKEY(WORLD_54),
237         DNKEY(WORLD_55),
238         DNKEY(WORLD_56),
239         DNKEY(WORLD_57),
240         DNKEY(WORLD_58),
241         DNKEY(WORLD_59),
242         DNKEY(WORLD_60),
243         DNKEY(WORLD_61),
244         DNKEY(WORLD_62),
245         DNKEY(WORLD_63),
246         DNKEY(WORLD_64),
247         DNKEY(WORLD_65),
248         DNKEY(WORLD_66),
249         DNKEY(WORLD_67),
250         DNKEY(WORLD_68),
251         DNKEY(WORLD_69),
252         DNKEY(WORLD_70),
253         DNKEY(WORLD_71),
254         DNKEY(WORLD_72),
255         DNKEY(WORLD_73),
256         DNKEY(WORLD_74),
257         DNKEY(WORLD_75),
258         DNKEY(WORLD_76),
259         DNKEY(WORLD_77),
260         DNKEY(WORLD_78),
261         DNKEY(WORLD_79),
262         DNKEY(WORLD_80),
263         DNKEY(WORLD_81),
264         DNKEY(WORLD_82),
265         DNKEY(WORLD_83),
266         DNKEY(WORLD_84),
267         DNKEY(WORLD_85),
268         DNKEY(WORLD_86),
269         DNKEY(WORLD_87),
270         DNKEY(WORLD_88),
271         DNKEY(WORLD_89),
272         DNKEY(WORLD_90),
273         DNKEY(WORLD_91),
274         DNKEY(WORLD_92),
275         DNKEY(WORLD_93),
276         DNKEY(WORLD_94),
277         DNKEY(WORLD_95),
278         DNKEY(KP0),
279         DNKEY(KP1),
280         DNKEY(KP2),
281         DNKEY(KP3),
282         DNKEY(KP4),
283         DNKEY(KP5),
284         DNKEY(KP6),
285         DNKEY(KP7),
286         DNKEY(KP8),
287         DNKEY(KP9),
288         DNKEY(KP_PERIOD),
289         DNKEY(KP_DIVIDE),
290         DNKEY(KP_MULTIPLY),
291         DNKEY(KP_MINUS),
292         DNKEY(KP_PLUS),
293         DNKEY(KP_ENTER),
294         DNKEY(KP_EQUALS),
295         DNKEY(UP),
296         DNKEY(DOWN),
297         DNKEY(RIGHT),
298         DNKEY(LEFT),
299         DNKEY(INSERT),
300         DNKEY(HOME),
301         DNKEY(END),
302         DNKEY(PAGEUP),
303         DNKEY(PAGEDOWN),
304         DNKEY(F1),
305         DNKEY(F2),
306         DNKEY(F3),
307         DNKEY(F4),
308         DNKEY(F5),
309         DNKEY(F6),
310         DNKEY(F7),
311         DNKEY(F8),
312         DNKEY(F9),
313         DNKEY(F10),
314         DNKEY(F11),
315         DNKEY(F12),
316         DNKEY(F13),
317         DNKEY(F14),
318         DNKEY(F15),
319         DNKEY(NUMLOCK),
320         DNKEY(CAPSLOCK),
321         DNKEY(SCROLLOCK),
322         DNKEY(RSHIFT),
323         DNKEY(LSHIFT),
324         DNKEY(RCTRL),
325         DNKEY(LCTRL),
326         DNKEY(RALT),
327         DNKEY(LALT),
328         DNKEY(RMETA),
329         DNKEY(LMETA),
330         DNKEY(LSUPER),
331         DNKEY(RSUPER),
332         DNKEY(MODE),
333         DNKEY(COMPOSE),
334 };
335
336 void pmsdl_input_bind(const char *kname, const char *sdlname)
337 {
338         int i, kc;
339
340         kc = in_get_key_code(-1, kname);
341         if (kc < 0) {
342                 err("can't resolve key '%s'", kname);
343                 return;
344         }
345
346         if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
347                 goto bad_sdlkey;
348
349         for (i = 0; i < SDLK_LAST; i++) {
350                 if (sdl_keynames[i] == NULL)
351                         continue;
352                 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
353                         break;
354         }
355
356         if (i >= SDLK_LAST)
357                 goto bad_sdlkey;
358
359         pmsdl_map[kc] = i;
360         return;
361
362 bad_sdlkey:
363         err("can't resolve SDL key '%s'", sdlname);
364 }
365
366 void pmsdl_input_init(void)
367 {
368         in_init();
369         in_probe();
370 }
371
372 static int do_event(SDL_Event *event, int timeout)
373 {
374         int key, is_down;
375
376         while (1) {
377                 int kc;
378
379                 is_down = 0;
380                 kc = in_update_keycode(NULL, &is_down, timeout);
381                 if (kc < 0 || kc > KEY_MAX)
382                         return 0;
383
384                 key = pmsdl_map[kc];
385                 if (key != 0)
386                         break;
387         }
388
389         g_keystate[key] = is_down;
390
391         if (event == NULL)
392                 return 1; // FIXME: ..but the event is lost
393
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
400
401         return 1;
402 }
403
404 /* SDL */
405 DECLSPEC int SDLCALL
406 SDL_WaitEvent(SDL_Event *event)
407 {
408         trace("%p", event);
409
410         return do_event(event, -1);
411 }
412
413 DECLSPEC int SDLCALL
414 SDL_PollEvent(SDL_Event *event)
415 {
416         trace("%p", event);
417
418         return do_event(event, 0);
419 }
420
421 DECLSPEC Uint8 * SDLCALL
422 SDL_GetKeyState(int *numkeys)
423 {
424         trace("%p", numkeys);
425
426         if (numkeys != NULL)
427                 *numkeys = ARRAY_SIZE(g_keystate);
428         return g_keystate;
429 }
430
431 DECLSPEC char * SDLCALL
432 SDL_GetKeyName(SDLKey key)
433 {
434         trace("%d", key);
435
436         if ((unsigned int)key < ARRAY_SIZE(sdl_keynames))
437                 return (char *)sdl_keynames[key];
438         else
439                 return "";
440 }
441
442 DECLSPEC int SDLCALL
443 SDL_EnableUNICODE(int enable)
444 {
445         trace("%d", enable);
446
447         if (enable > 0)
448                 not_supported();
449
450         return 0;
451 }
452
453 DECLSPEC int SDLCALL
454 SDL_EnableKeyRepeat(int delay, int interval)
455 {
456         trace("%d, %d", delay, interval);
457
458         if (delay)
459                 not_supported();
460         return 0;
461 }
462
463 DECLSPEC void SDLCALL
464 SDL_GetKeyRepeat(int *delay, int *interval)
465 {
466         trace("%p, %p", delay, interval);
467
468         if (delay)
469                 *delay = 0;
470         if (interval)
471                 *interval = 0;
472 }
473
474 DECLSPEC SDLMod SDLCALL
475 SDL_GetModState(void)
476 {
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;
482         int i;
483
484         trace("");
485
486         for (i = 0; i < ARRAY_SIZE(syms); i++)
487                 if (g_keystate[syms[i]])
488                         ret |= mods[i];
489
490         return ret;
491 }
492
493 /* Joysticks */
494 DECLSPEC int SDLCALL
495 SDL_NumJoysticks(void)
496 {
497         trace("");
498         return 0;
499 }
500
501 DECLSPEC SDL_Joystick * SDLCALL
502 SDL_JoystickOpen(int device_index)
503 {
504         trace("%d", device_index);
505         return NULL;
506 }
507