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