68c58e4c5c98c9dd3abf71124aef45ae7a6f1e2b
[sdl_omap.git] / src / video / omapdss / osdl_input.c
1 /*
2  * (C) Gražvydas "notaz" Ignotas, 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 <sys/types.h>
10 #include <sys/stat.h>
11 #include <fcntl.h>
12 #include <sys/ioctl.h>
13 #include <unistd.h>
14 #include <time.h>
15 #include <errno.h>
16 #include <linux/input.h>
17 #include <SDL/SDL.h>
18
19 #include "omapsdl.h"
20
21 static int osdl_evdev_devs[32];
22 static int osdl_evdev_dev_count;
23
24 static short osdl_evdev_map[KEY_CNT] = {
25         [KEY_0]         = SDLK_0,
26         [KEY_1]         = SDLK_1,
27         [KEY_2]         = SDLK_2,
28         [KEY_3]         = SDLK_3,
29         [KEY_4]         = SDLK_4,
30         [KEY_5]         = SDLK_5,
31         [KEY_6]         = SDLK_6,
32         [KEY_7]         = SDLK_7,
33         [KEY_8]         = SDLK_8,
34         [KEY_9]         = SDLK_9,
35         [KEY_A]         = SDLK_a,
36         [KEY_B]         = SDLK_b,
37         [KEY_C]         = SDLK_c,
38         [KEY_D]         = SDLK_d,
39         [KEY_E]         = SDLK_e,
40         [KEY_F]         = SDLK_f,
41         [KEY_G]         = SDLK_g,
42         [KEY_H]         = SDLK_h,
43         [KEY_I]         = SDLK_i,
44         [KEY_J]         = SDLK_j,
45         [KEY_K]         = SDLK_k,
46         [KEY_L]         = SDLK_l,
47         [KEY_M]         = SDLK_m,
48         [KEY_N]         = SDLK_n,
49         [KEY_O]         = SDLK_o,
50         [KEY_P]         = SDLK_p,
51         [KEY_Q]         = SDLK_q,
52         [KEY_R]         = SDLK_r,
53         [KEY_S]         = SDLK_s,
54         [KEY_T]         = SDLK_t,
55         [KEY_U]         = SDLK_u,
56         [KEY_V]         = SDLK_v,
57         [KEY_W]         = SDLK_w,
58         [KEY_X]         = SDLK_x,
59         [KEY_Y]         = SDLK_y,
60         [KEY_Z]         = SDLK_z,
61         [KEY_SPACE]     = SDLK_SPACE,
62         [KEY_BACKSPACE] = SDLK_BACKSPACE,
63         [KEY_FN]        = SDLK_MODE,
64         [KEY_DOT]       = SDLK_PERIOD,
65         [KEY_ENTER]     = SDLK_RETURN,
66         [KEY_LEFTSHIFT] = SDLK_LSHIFT,
67         [KEY_COMMA]     = SDLK_COMMA,
68 //      [KEY_BRIGHTNESSUP]      =
69 //      [KEY_BRIGHTNESSDOWN]    =
70 //      [KEY_GRAVE]     =
71         [KEY_TAB]       = SDLK_TAB,
72         [KEY_INSERT]    = SDLK_INSERT,
73         [KEY_EQUAL]     = SDLK_EQUALS,
74         [KEY_KPPLUS]    = SDLK_KP_PLUS,
75         [KEY_BACKSLASH] = SDLK_BACKSLASH,
76         [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET,
77         [KEY_KPMINUS]   = SDLK_KP_MINUS,
78         [KEY_QUESTION]  = SDLK_QUESTION,
79         [KEY_LEFTBRACE] = SDLK_LEFTBRACKET,
80         [KEY_SLASH]     = SDLK_SLASH,
81 //      [KEY_YEN]       =
82         [KEY_APOSTROPHE]= SDLK_QUOTE,
83         [KEY_ESC]       = SDLK_ESCAPE,
84         [KEY_CAPSLOCK]  = SDLK_CAPSLOCK,
85         [KEY_SEMICOLON] = SDLK_SEMICOLON,
86         [KEY_F1]        = SDLK_F1,
87         [KEY_F2]        = SDLK_F2,
88         [KEY_F3]        = SDLK_F3,
89         [KEY_F4]        = SDLK_F4,
90         [KEY_F5]        = SDLK_F5,
91         [KEY_F6]        = SDLK_F6,
92         [KEY_F7]        = SDLK_F7,
93         [KEY_F8]        = SDLK_F8,
94         [KEY_F9]        = SDLK_F9,
95         [KEY_F10]       = KEY_F10,
96         [KEY_F11]       = KEY_F11,
97         [KEY_F12]       = KEY_F12,
98         [KEY_F13]       = KEY_F13,      /* apostrophe, differs from Fn-A? */
99         [KEY_F14]       = KEY_F14,      /* pipe/bar */
100         [KEY_F15]       = KEY_F15,      /* dash */
101         [KEY_F16]       = SDLK_HASH,    /* # (pound/hash) */
102         [KEY_F17]       = SDLK_EXCLAIM, /* ! */
103 //      [KEY_F18]       =               /* £ (pound) */
104         [KEY_F19]       = SDLK_QUOTEDBL,/* " */
105         [KEY_F20]       = SDLK_AT,      /* @ */
106         [KEY_F21]       = SDLK_SEMICOLON,/* : */
107 //      [KEY_F22]       =
108 //      [KEY_F23]       =
109
110         [KEY_UP]        = SDLK_UP,
111         [KEY_DOWN]      = SDLK_DOWN,
112         [KEY_LEFT]      = SDLK_LEFT,
113         [KEY_RIGHT]     = SDLK_RIGHT,
114         [KEY_HOME]      = SDLK_HOME,
115         [KEY_END]       = SDLK_END,
116         [KEY_PAGEUP]    = SDLK_PAGEUP,
117         [KEY_PAGEDOWN]  = SDLK_PAGEDOWN,
118         [KEY_LEFTALT]   = SDLK_LALT,
119         [KEY_LEFTCTRL]  = SDLK_LCTRL,
120 //      [KEY_MENU]      =
121         [KEY_RIGHTSHIFT]= SDLK_RSHIFT,
122         [KEY_RIGHTCTRL] = SDLK_RCTRL,
123 };
124
125 static const char * const osdl_evdev_keys[KEY_CNT] = {
126         [KEY_RESERVED] = "Reserved",            [KEY_ESC] = "Esc",
127         [KEY_1] = "1",                          [KEY_2] = "2",
128         [KEY_3] = "3",                          [KEY_4] = "4",
129         [KEY_5] = "5",                          [KEY_6] = "6",
130         [KEY_7] = "7",                          [KEY_8] = "8",
131         [KEY_9] = "9",                          [KEY_0] = "0",
132         [KEY_MINUS] = "Minus",                  [KEY_EQUAL] = "Equal",
133         [KEY_BACKSPACE] = "Backspace",          [KEY_TAB] = "Tab",
134         [KEY_Q] = "Q",                          [KEY_W] = "W",
135         [KEY_E] = "E",                          [KEY_R] = "R",
136         [KEY_T] = "T",                          [KEY_Y] = "Y",
137         [KEY_U] = "U",                          [KEY_I] = "I",
138         [KEY_O] = "O",                          [KEY_P] = "P",
139         [KEY_LEFTBRACE] = "LeftBrace",          [KEY_RIGHTBRACE] = "RightBrace",
140         [KEY_ENTER] = "Enter",                  [KEY_LEFTCTRL] = "LeftControl",
141         [KEY_A] = "A",                          [KEY_S] = "S",
142         [KEY_D] = "D",                          [KEY_F] = "F",
143         [KEY_G] = "G",                          [KEY_H] = "H",
144         [KEY_J] = "J",                          [KEY_K] = "K",
145         [KEY_L] = "L",                          [KEY_SEMICOLON] = "Semicolon",
146         [KEY_APOSTROPHE] = "Apostrophe",        [KEY_GRAVE] = "Grave",
147         [KEY_LEFTSHIFT] = "LeftShift",          [KEY_BACKSLASH] = "BackSlash",
148         [KEY_Z] = "Z",                          [KEY_X] = "X",
149         [KEY_C] = "C",                          [KEY_V] = "V",
150         [KEY_B] = "B",                          [KEY_N] = "N",
151         [KEY_M] = "M",                          [KEY_COMMA] = "Comma",
152         [KEY_DOT] = "Dot",                      [KEY_SLASH] = "Slash",
153         [KEY_RIGHTSHIFT] = "RightShift",        [KEY_KPASTERISK] = "KPAsterisk",
154         [KEY_LEFTALT] = "LeftAlt",              [KEY_SPACE] = "Space",
155         [KEY_CAPSLOCK] = "CapsLock",            [KEY_F1] = "F1",
156         [KEY_F2] = "F2",                        [KEY_F3] = "F3",
157         [KEY_F4] = "F4",                        [KEY_F5] = "F5",
158         [KEY_F6] = "F6",                        [KEY_F7] = "F7",
159         [KEY_F8] = "F8",                        [KEY_F9] = "F9",
160         [KEY_F10] = "F10",                      [KEY_NUMLOCK] = "NumLock",
161         [KEY_SCROLLLOCK] = "ScrollLock",        [KEY_KP7] = "KP7",
162         [KEY_KP8] = "KP8",                      [KEY_KP9] = "KP9",
163         [KEY_KPMINUS] = "KPMinus",              [KEY_KP4] = "KP4",
164         [KEY_KP5] = "KP5",                      [KEY_KP6] = "KP6",
165         [KEY_KPPLUS] = "KPPlus",                [KEY_KP1] = "KP1",
166         [KEY_KP2] = "KP2",                      [KEY_KP3] = "KP3",
167         [KEY_KP0] = "KP0",                      [KEY_KPDOT] = "KPDot",
168         [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd",
169         [KEY_F11] = "F11",                      [KEY_F12] = "F12",
170         [KEY_KPJPCOMMA] = "KPJpComma",          [KEY_KPENTER] = "KPEnter",
171         [KEY_RIGHTCTRL] = "RightCtrl",          [KEY_KPSLASH] = "KPSlash",
172         [KEY_SYSRQ] = "SysRq",                  [KEY_RIGHTALT] = "RightAlt",
173         [KEY_LINEFEED] = "LineFeed",            [KEY_HOME] = "Home",
174         [KEY_UP] = "Up",                        [KEY_PAGEUP] = "PageUp",
175         [KEY_LEFT] = "Left",                    [KEY_RIGHT] = "Right",
176         [KEY_END] = "End",                      [KEY_DOWN] = "Down",
177         [KEY_PAGEDOWN] = "PageDown",            [KEY_INSERT] = "Insert",
178         [KEY_DELETE] = "Delete",                [KEY_MACRO] = "Macro",
179         [KEY_HELP] = "Help",                    [KEY_MENU] = "Menu",
180         [KEY_COFFEE] = "Coffee",                [KEY_DIRECTION] = "Direction",
181         [BTN_0] = "Btn0",                       [BTN_1] = "Btn1",
182         [BTN_2] = "Btn2",                       [BTN_3] = "Btn3",
183         [BTN_4] = "Btn4",                       [BTN_5] = "Btn5",
184         [BTN_6] = "Btn6",                       [BTN_7] = "Btn7",
185         [BTN_8] = "Btn8",                       [BTN_9] = "Btn9",
186         [BTN_LEFT] = "LeftBtn",                 [BTN_RIGHT] = "RightBtn",
187         [BTN_MIDDLE] = "MiddleBtn",             [BTN_SIDE] = "SideBtn",
188         [BTN_EXTRA] = "ExtraBtn",               [BTN_FORWARD] = "ForwardBtn",
189         [BTN_BACK] = "BackBtn",                 [BTN_TASK] = "TaskBtn",
190         [BTN_TRIGGER] = "Trigger",              [BTN_THUMB] = "ThumbBtn",
191         [BTN_THUMB2] = "ThumbBtn2",             [BTN_TOP] = "TopBtn",
192         [BTN_TOP2] = "TopBtn2",                 [BTN_PINKIE] = "PinkieBtn",
193         [BTN_BASE] = "BaseBtn",                 [BTN_BASE2] = "BaseBtn2",
194         [BTN_BASE3] = "BaseBtn3",               [BTN_BASE4] = "BaseBtn4",
195         [BTN_BASE5] = "BaseBtn5",               [BTN_BASE6] = "BaseBtn6",
196         [BTN_DEAD] = "BtnDead",                 [BTN_A] = "BtnA",
197         [BTN_B] = "BtnB",                       [BTN_C] = "BtnC",
198         [BTN_X] = "BtnX",                       [BTN_Y] = "BtnY",
199         [BTN_Z] = "BtnZ",                       [BTN_TL] = "BtnTL",
200         [BTN_TR] = "BtnTR",                     [BTN_TL2] = "BtnTL2",
201         [BTN_TR2] = "BtnTR2",                   [BTN_SELECT] = "BtnSelect",
202         [BTN_START] = "BtnStart",               [BTN_MODE] = "BtnMode",
203         [BTN_THUMBL] = "BtnThumbL",             [BTN_THUMBR] = "BtnThumbR",
204         [BTN_TOUCH] = "Touch",                  [BTN_STYLUS] = "Stylus",
205         [BTN_STYLUS2] = "Stylus2",              [BTN_TOOL_DOUBLETAP] = "Tool Doubletap",
206         [BTN_TOOL_TRIPLETAP] = "Tool Tripletap", [BTN_GEAR_DOWN] = "WheelBtn",
207         [BTN_GEAR_UP] = "Gear up",              [KEY_OK] = "Ok",
208 };
209
210 #define DNKEY(x) [SDLK_##x] = #x
211 static const char * const sdl_keynames[SDLK_LAST] = {
212         DNKEY(BACKSPACE),
213         DNKEY(TAB),
214         DNKEY(RETURN),
215         DNKEY(ESCAPE),
216         DNKEY(SPACE),
217         DNKEY(EXCLAIM),
218         DNKEY(QUOTEDBL),
219         DNKEY(HASH),
220         DNKEY(DOLLAR),
221         DNKEY(AMPERSAND),
222         DNKEY(QUOTE),
223         DNKEY(LEFTPAREN),
224         DNKEY(RIGHTPAREN),
225         DNKEY(ASTERISK),
226         DNKEY(PLUS),
227         DNKEY(COMMA),
228         DNKEY(MINUS),
229         DNKEY(PERIOD),
230         DNKEY(SLASH),
231         DNKEY(0),
232         DNKEY(1),
233         DNKEY(2),
234         DNKEY(3),
235         DNKEY(4),
236         DNKEY(5),
237         DNKEY(6),
238         DNKEY(7),
239         DNKEY(8),
240         DNKEY(9),
241         DNKEY(COLON),
242         DNKEY(SEMICOLON),
243         DNKEY(LESS),
244         DNKEY(EQUALS),
245         DNKEY(GREATER),
246         DNKEY(QUESTION),
247         DNKEY(AT),
248         DNKEY(LEFTBRACKET),
249         DNKEY(BACKSLASH),
250         DNKEY(RIGHTBRACKET),
251         DNKEY(CARET),
252         DNKEY(UNDERSCORE),
253         DNKEY(BACKQUOTE),
254         DNKEY(a),
255         DNKEY(b),
256         DNKEY(c),
257         DNKEY(d),
258         DNKEY(e),
259         DNKEY(f),
260         DNKEY(g),
261         DNKEY(h),
262         DNKEY(i),
263         DNKEY(j),
264         DNKEY(k),
265         DNKEY(l),
266         DNKEY(m),
267         DNKEY(n),
268         DNKEY(o),
269         DNKEY(p),
270         DNKEY(q),
271         DNKEY(r),
272         DNKEY(s),
273         DNKEY(t),
274         DNKEY(u),
275         DNKEY(v),
276         DNKEY(w),
277         DNKEY(x),
278         DNKEY(y),
279         DNKEY(z),
280         DNKEY(DELETE),
281         DNKEY(WORLD_0),
282         DNKEY(WORLD_1),
283         DNKEY(WORLD_2),
284         DNKEY(WORLD_3),
285         DNKEY(WORLD_4),
286         DNKEY(WORLD_5),
287         DNKEY(WORLD_6),
288         DNKEY(WORLD_7),
289         DNKEY(WORLD_8),
290         DNKEY(WORLD_9),
291         DNKEY(WORLD_10),
292         DNKEY(WORLD_11),
293         DNKEY(WORLD_12),
294         DNKEY(WORLD_13),
295         DNKEY(WORLD_14),
296         DNKEY(WORLD_15),
297         DNKEY(WORLD_16),
298         DNKEY(WORLD_17),
299         DNKEY(WORLD_18),
300         DNKEY(WORLD_19),
301         DNKEY(WORLD_20),
302         DNKEY(WORLD_21),
303         DNKEY(WORLD_22),
304         DNKEY(WORLD_23),
305         DNKEY(WORLD_24),
306         DNKEY(WORLD_25),
307         DNKEY(WORLD_26),
308         DNKEY(WORLD_27),
309         DNKEY(WORLD_28),
310         DNKEY(WORLD_29),
311         DNKEY(WORLD_30),
312         DNKEY(WORLD_31),
313         DNKEY(WORLD_32),
314         DNKEY(WORLD_33),
315         DNKEY(WORLD_34),
316         DNKEY(WORLD_35),
317         DNKEY(WORLD_36),
318         DNKEY(WORLD_37),
319         DNKEY(WORLD_38),
320         DNKEY(WORLD_39),
321         DNKEY(WORLD_40),
322         DNKEY(WORLD_41),
323         DNKEY(WORLD_42),
324         DNKEY(WORLD_43),
325         DNKEY(WORLD_44),
326         DNKEY(WORLD_45),
327         DNKEY(WORLD_46),
328         DNKEY(WORLD_47),
329         DNKEY(WORLD_48),
330         DNKEY(WORLD_49),
331         DNKEY(WORLD_50),
332         DNKEY(WORLD_51),
333         DNKEY(WORLD_52),
334         DNKEY(WORLD_53),
335         DNKEY(WORLD_54),
336         DNKEY(WORLD_55),
337         DNKEY(WORLD_56),
338         DNKEY(WORLD_57),
339         DNKEY(WORLD_58),
340         DNKEY(WORLD_59),
341         DNKEY(WORLD_60),
342         DNKEY(WORLD_61),
343         DNKEY(WORLD_62),
344         DNKEY(WORLD_63),
345         DNKEY(WORLD_64),
346         DNKEY(WORLD_65),
347         DNKEY(WORLD_66),
348         DNKEY(WORLD_67),
349         DNKEY(WORLD_68),
350         DNKEY(WORLD_69),
351         DNKEY(WORLD_70),
352         DNKEY(WORLD_71),
353         DNKEY(WORLD_72),
354         DNKEY(WORLD_73),
355         DNKEY(WORLD_74),
356         DNKEY(WORLD_75),
357         DNKEY(WORLD_76),
358         DNKEY(WORLD_77),
359         DNKEY(WORLD_78),
360         DNKEY(WORLD_79),
361         DNKEY(WORLD_80),
362         DNKEY(WORLD_81),
363         DNKEY(WORLD_82),
364         DNKEY(WORLD_83),
365         DNKEY(WORLD_84),
366         DNKEY(WORLD_85),
367         DNKEY(WORLD_86),
368         DNKEY(WORLD_87),
369         DNKEY(WORLD_88),
370         DNKEY(WORLD_89),
371         DNKEY(WORLD_90),
372         DNKEY(WORLD_91),
373         DNKEY(WORLD_92),
374         DNKEY(WORLD_93),
375         DNKEY(WORLD_94),
376         DNKEY(WORLD_95),
377         DNKEY(KP0),
378         DNKEY(KP1),
379         DNKEY(KP2),
380         DNKEY(KP3),
381         DNKEY(KP4),
382         DNKEY(KP5),
383         DNKEY(KP6),
384         DNKEY(KP7),
385         DNKEY(KP8),
386         DNKEY(KP9),
387         DNKEY(KP_PERIOD),
388         DNKEY(KP_DIVIDE),
389         DNKEY(KP_MULTIPLY),
390         DNKEY(KP_MINUS),
391         DNKEY(KP_PLUS),
392         DNKEY(KP_ENTER),
393         DNKEY(KP_EQUALS),
394         DNKEY(UP),
395         DNKEY(DOWN),
396         DNKEY(RIGHT),
397         DNKEY(LEFT),
398         DNKEY(INSERT),
399         DNKEY(HOME),
400         DNKEY(END),
401         DNKEY(PAGEUP),
402         DNKEY(PAGEDOWN),
403         DNKEY(F1),
404         DNKEY(F2),
405         DNKEY(F3),
406         DNKEY(F4),
407         DNKEY(F5),
408         DNKEY(F6),
409         DNKEY(F7),
410         DNKEY(F8),
411         DNKEY(F9),
412         DNKEY(F10),
413         DNKEY(F11),
414         DNKEY(F12),
415         DNKEY(F13),
416         DNKEY(F14),
417         DNKEY(F15),
418         DNKEY(NUMLOCK),
419         DNKEY(CAPSLOCK),
420         DNKEY(SCROLLOCK),
421         DNKEY(RSHIFT),
422         DNKEY(LSHIFT),
423         DNKEY(RCTRL),
424         DNKEY(LCTRL),
425         DNKEY(RALT),
426         DNKEY(LALT),
427         DNKEY(RMETA),
428         DNKEY(LMETA),
429         DNKEY(LSUPER),
430         DNKEY(RSUPER),
431         DNKEY(MODE),
432         DNKEY(COMPOSE),
433 };
434
435 void omapsdl_input_bind(const char *kname, const char *sdlname)
436 {
437         int i, kc;
438
439         if (kname == NULL || strncasecmp(kname, "ev_", 3) != 0)
440                 goto bad_ev_key;
441
442         for (i = 0; i < ARRAY_SIZE(osdl_evdev_keys); i++) {
443                 if (osdl_evdev_keys[i] == NULL)
444                         continue;
445                 if (strcasecmp(osdl_evdev_keys[i], kname + 3) == 0)
446                         break;
447         }
448
449         if (i >= ARRAY_SIZE(osdl_evdev_keys))
450                 goto bad_ev_key;
451         kc = i;
452
453         if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
454                 goto bad_sdlkey;
455
456         for (i = 0; i < ARRAY_SIZE(sdl_keynames); i++) {
457                 if (sdl_keynames[i] == NULL)
458                         continue;
459                 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
460                         break;
461         }
462
463         if (i >= ARRAY_SIZE(sdl_keynames))
464                 goto bad_sdlkey;
465
466         osdl_evdev_map[kc] = i;
467         return;
468
469 bad_ev_key:
470         err("can't resolve evdev key '%s'", kname);
471         return;
472
473 bad_sdlkey:
474         err("can't resolve SDL key '%s'", sdlname);
475 }
476
477 #define KEYBITS_BIT(keybits, x) (keybits[(x)/sizeof(keybits[0])/8] & \
478         (1 << ((x) & (sizeof(keybits[0])*8-1))))
479
480 void omapsdl_input_init(void)
481 {
482         long keybits[KEY_CNT / sizeof(long) / 8];
483         int i;
484
485         // the kernel might support and return less keys then we know about,
486         // so make sure the buffer is clear.
487         memset(keybits, 0, sizeof(keybits));
488
489         for (i = 0;; i++)
490         {
491                 int support = 0, count = 0;
492                 int u, ret, fd;
493                 char name[64];
494
495                 snprintf(name, sizeof(name), "/dev/input/event%d", i);
496                 fd = open(name, O_RDONLY|O_NONBLOCK);
497                 if (fd == -1) {
498                         if (errno == EACCES)
499                                 continue;       /* maybe we can access next one */
500                         break;
501                 }
502
503                 /* check supported events */
504                 ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support);
505                 if (ret == -1) {
506                         printf("in_evdev: ioctl failed on %s\n", name);
507                         goto skip;
508                 }
509
510                 if (!(support & (1 << EV_KEY)))
511                         goto skip;
512
513                 ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits);
514                 if (ret == -1) {
515                         printf("in_evdev: ioctl failed on %s\n", name);
516                         goto skip;
517                 }
518
519                 /* check for interesting keys */
520                 for (u = 0; u < KEY_CNT; u++) {
521                         if (KEYBITS_BIT(keybits, u)) {
522                                 if (u != KEY_POWER && u != KEY_SLEEP && u != BTN_TOUCH)
523                                         count++;
524                         }
525                 }
526
527                 if (count == 0)
528                         goto skip;
529
530                 osdl_evdev_devs[osdl_evdev_dev_count++] = fd;
531                 ioctl(fd, EVIOCGNAME(sizeof(name)), name);
532                 printf("in_evdev: found \"%s\" with %d events (type %08x)\n",
533                         name, count, support);
534                 continue;
535
536 skip:
537                 close(fd);
538         }
539
540         printf("found %d evdev devices.\n", osdl_evdev_dev_count);
541 }
542
543 int omapsdl_input_get_events(int timeout_ms,
544                 int (*cb)(void *cb_arg, int sdl_kc, int is_pressed), void *cb_arg)
545 {
546         struct timeval tv, *timeout = NULL;
547         struct input_event ev;
548         int i, fdmax = -1;
549         fd_set fdset;
550
551         if (timeout_ms >= 0) {
552                 tv.tv_sec = timeout_ms / 1000;
553                 tv.tv_usec = (timeout_ms % 1000) * 1000;
554                 timeout = &tv;
555         }
556
557         FD_ZERO(&fdset);
558         for (i = 0; i < osdl_evdev_dev_count; i++) {
559                 if (osdl_evdev_devs[i] > fdmax)
560                         fdmax = osdl_evdev_devs[i];
561                 FD_SET(osdl_evdev_devs[i], &fdset);
562         }
563
564         while (1)
565         {
566                 int fd, ret, sdl_kc;
567
568                 ret = select(fdmax + 1, &fdset, NULL, NULL, timeout);
569                 if (ret == -1)
570                 {
571                         perror("in_evdev: select failed");
572                         return -1;
573                 }
574                 else if (ret == 0)
575                         return -1; /* timeout */
576
577                 for (i = 0; i < osdl_evdev_dev_count; i++) {
578                         if (!FD_ISSET(osdl_evdev_devs[i], &fdset))
579                                 continue;
580
581                         fd = osdl_evdev_devs[i];
582                         while (1) {
583                                 ret = read(fd, &ev, sizeof(ev));
584                                 if (ret < (int)sizeof(ev)) {
585                                         if (errno != EAGAIN) {
586                                                 perror("in_evdev: read failed");
587                                                 return -1;
588                                         }
589                                         break;
590                                 }
591
592                                 if (ev.type != EV_KEY)
593                                         continue; /* not key event */
594                                 if ((unsigned int)ev.value > 1)
595                                         continue; /* not key up/down */
596                                 if ((unsigned int)ev.code >= ARRAY_SIZE(osdl_evdev_map))
597                                         continue; /* keycode from future */
598                                 sdl_kc = osdl_evdev_map[ev.code];
599                                 if (sdl_kc == 0)
600                                         continue; /* not mapped */
601                                 ret = cb(cb_arg, sdl_kc, ev.value);
602                                 if (ret != 0)
603                                         return ret;
604                         }
605                 }
606         }
607 }
608
609 /* SDL */
610 #ifdef STANDALONE
611
612 static unsigned char g_keystate[SDLK_LAST];
613
614 struct key_event {
615         int sdl_kc;
616         int is_pressed;
617 };
618
619 static int do_key_cb(void *cb_arg, int sdl_kc, int is_pressed)
620 {
621         struct key_event *ev = cb_arg;
622         ev->sdl_kc = sdl_kc;
623         ev->is_pressed = is_pressed;
624
625         return 1; /* done */
626 }
627
628 static int do_event(SDL_Event *event, int timeout)
629 {
630         struct key_event ev;
631         int ret;
632
633         ret = omapsdl_input_get_events(timeout, do_key_cb, &ev);
634         if (ret < 0)
635                 return 0;
636
637         g_keystate[ev.sdl_kc] = ev.is_pressed;
638
639         if (event == NULL)
640                 return 1; // FIXME: ..but the event is lost
641
642         memset(event, 0, sizeof(event->key));
643         event->type = ev.is_pressed ? SDL_KEYDOWN : SDL_KEYUP;
644         // event->key.which =
645         event->key.state = ev.is_pressed ? SDL_PRESSED : SDL_RELEASED;
646         event->key.keysym.sym = ev.sdl_kc;
647         // event->key.keysym.mod
648
649         return 1;
650 }
651
652 DECLSPEC int SDLCALL
653 SDL_WaitEvent(SDL_Event *event)
654 {
655         trace("%p", event);
656
657         return do_event(event, -1);
658 }
659
660 DECLSPEC int SDLCALL
661 SDL_PollEvent(SDL_Event *event)
662 {
663         trace("%p", event);
664
665         return do_event(event, 0);
666 }
667
668 DECLSPEC Uint8 * SDLCALL
669 SDL_GetKeyState(int *numkeys)
670 {
671         trace("%p", numkeys);
672
673         if (numkeys != NULL)
674                 *numkeys = ARRAY_SIZE(g_keystate);
675         return g_keystate;
676 }
677
678 DECLSPEC char * SDLCALL
679 SDL_GetKeyName(SDLKey key)
680 {
681         trace("%d", key);
682
683         if ((unsigned int)key < ARRAY_SIZE(sdl_keynames))
684                 return (char *)sdl_keynames[key];
685         else
686                 return "";
687 }
688
689 DECLSPEC int SDLCALL
690 SDL_EnableUNICODE(int enable)
691 {
692         trace("%d", enable);
693
694         if (enable > 0)
695                 not_supported();
696
697         return 0;
698 }
699
700 DECLSPEC int SDLCALL
701 SDL_EnableKeyRepeat(int delay, int interval)
702 {
703         trace("%d, %d", delay, interval);
704
705         if (delay)
706                 not_supported();
707         return 0;
708 }
709
710 DECLSPEC void SDLCALL
711 SDL_GetKeyRepeat(int *delay, int *interval)
712 {
713         trace("%p, %p", delay, interval);
714
715         if (delay)
716                 *delay = 0;
717         if (interval)
718                 *interval = 0;
719 }
720
721 DECLSPEC SDLMod SDLCALL
722 SDL_GetModState(void)
723 {
724         static const short syms[] = { SDLK_LSHIFT, SDLK_RSHIFT, SDLK_LCTRL, SDLK_RCTRL, SDLK_LALT,
725                                 SDLK_RALT, SDLK_LMETA, SDLK_RMETA, SDLK_NUMLOCK, SDLK_CAPSLOCK, SDLK_MODE };
726         static const short mods[] = { KMOD_LSHIFT, KMOD_RSHIFT, KMOD_LCTRL, KMOD_RCTRL, KMOD_LALT,
727                                 KMOD_RALT, KMOD_LMETA, KMOD_RMETA, KMOD_NUM, KMOD_CAPS, KMOD_MODE };
728         SDLMod ret = KMOD_NONE;
729         int i;
730
731         trace("");
732
733         for (i = 0; i < ARRAY_SIZE(syms); i++)
734                 if (g_keystate[syms[i]])
735                         ret |= mods[i];
736
737         return ret;
738 }
739
740 /* Joysticks */
741 DECLSPEC int SDLCALL
742 SDL_NumJoysticks(void)
743 {
744         trace("");
745         return 0;
746 }
747
748 DECLSPEC SDL_Joystick * SDLCALL
749 SDL_JoystickOpen(int device_index)
750 {
751         trace("%d", device_index);
752         return NULL;
753 }
754
755 #endif // STANDALONE