hook into SDL
[sdl_omap.git] / src / video / omapdss / osdl_input.c
CommitLineData
b78828bf 1/*
83b5751b 2 * (C) Gražvydas "notaz" Ignotas, 2010
b78828bf 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
3cb98c5e 8#include <strings.h>
83b5751b 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>
3cb98c5e 16#include <linux/input.h>
83b5751b 17#include <SDL/SDL.h>
3cb98c5e 18
b78828bf 19#include "omapsdl.h"
3cb98c5e 20
83b5751b 21static int osdl_evdev_devs[32];
22static int osdl_evdev_dev_count;
23
24static short osdl_evdev_map[KEY_CNT] = {
3cb98c5e 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
83b5751b 125static 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
3cb98c5e 210#define DNKEY(x) [SDLK_##x] = #x
83b5751b 211static const char * const sdl_keynames[SDLK_LAST] = {
3cb98c5e 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
b78828bf 435void omapsdl_input_bind(const char *kname, const char *sdlname)
3cb98c5e 436{
437 int i, kc;
438
83b5751b 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;
3cb98c5e 447 }
448
83b5751b 449 if (i >= ARRAY_SIZE(osdl_evdev_keys))
450 goto bad_ev_key;
451 kc = i;
452
3cb98c5e 453 if (sdlname == NULL || strncasecmp(sdlname, "SDLK_", 5) != 0)
454 goto bad_sdlkey;
455
83b5751b 456 for (i = 0; i < ARRAY_SIZE(sdl_keynames); i++) {
3cb98c5e 457 if (sdl_keynames[i] == NULL)
458 continue;
459 if (strcasecmp(sdl_keynames[i], sdlname + 5) == 0)
460 break;
461 }
462
83b5751b 463 if (i >= ARRAY_SIZE(sdl_keynames))
3cb98c5e 464 goto bad_sdlkey;
465
83b5751b 466 osdl_evdev_map[kc] = i;
467 return;
468
469bad_ev_key:
470 err("can't resolve evdev key '%s'", kname);
3cb98c5e 471 return;
472
473bad_sdlkey:
474 err("can't resolve SDL key '%s'", sdlname);
475}
476
83b5751b 477#define KEYBITS_BIT(keybits, x) (keybits[(x)/sizeof(keybits[0])/8] & \
478 (1 << ((x) & (sizeof(keybits[0])*8-1))))
479
b78828bf 480void omapsdl_input_init(void)
3cb98c5e 481{
83b5751b 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
536skip:
537 close(fd);
538 }
539
540 printf("found %d evdev devices.\n", osdl_evdev_dev_count);
3cb98c5e 541}
542
83b5751b 543int omapsdl_input_get_events(int timeout_ms,
544 int (*cb)(void *cb_arg, int sdl_kc, int is_pressed), void *cb_arg)
3cb98c5e 545{
83b5751b 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 }
3cb98c5e 556
83b5751b 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 }
3cb98c5e 563
83b5751b 564 while (1)
565 {
566 int fd, ret, sdl_kc;
3cb98c5e 567
83b5751b 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 }
3cb98c5e 606 }
0aab059f 607}
608
609/* SDL */
610#ifdef STANDALONE
611
612static unsigned char g_keystate[SDLK_LAST];
613
83b5751b 614struct key_event {
615 int sdl_kc;
616 int is_pressed;
617};
618
619static 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
0aab059f 628static int do_event(SDL_Event *event, int timeout)
629{
83b5751b 630 struct key_event ev;
631 int ret;
0aab059f 632
83b5751b 633 ret = omapsdl_input_get_events(timeout, do_key_cb, &ev);
634 if (ret < 0)
0aab059f 635 return 0;
636
83b5751b 637 g_keystate[ev.sdl_kc] = ev.is_pressed;
3cb98c5e 638
639 if (event == NULL)
640 return 1; // FIXME: ..but the event is lost
641
642 memset(event, 0, sizeof(event->key));
83b5751b 643 event->type = ev.is_pressed ? SDL_KEYDOWN : SDL_KEYUP;
3cb98c5e 644 // event->key.which =
83b5751b 645 event->key.state = ev.is_pressed ? SDL_PRESSED : SDL_RELEASED;
646 event->key.keysym.sym = ev.sdl_kc;
3cb98c5e 647 // event->key.keysym.mod
648
649 return 1;
650}
651
3cb98c5e 652DECLSPEC int SDLCALL
653SDL_WaitEvent(SDL_Event *event)
654{
655 trace("%p", event);
656
0aab059f 657 return do_event(event, -1);
3cb98c5e 658}
659
660DECLSPEC int SDLCALL
661SDL_PollEvent(SDL_Event *event)
662{
663 trace("%p", event);
664
0aab059f 665 return do_event(event, 0);
3cb98c5e 666}
667
668DECLSPEC Uint8 * SDLCALL
669SDL_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
678DECLSPEC char * SDLCALL
679SDL_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
689DECLSPEC int SDLCALL
690SDL_EnableUNICODE(int enable)
691{
692 trace("%d", enable);
693
694 if (enable > 0)
695 not_supported();
696
697 return 0;
698}
699
700DECLSPEC int SDLCALL
701SDL_EnableKeyRepeat(int delay, int interval)
702{
703 trace("%d, %d", delay, interval);
704
705 if (delay)
706 not_supported();
707 return 0;
708}
709
710DECLSPEC void SDLCALL
711SDL_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
721DECLSPEC SDLMod SDLCALL
722SDL_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 */
741DECLSPEC int SDLCALL
742SDL_NumJoysticks(void)
743{
744 trace("");
745 return 0;
746}
747
748DECLSPEC SDL_Joystick * SDLCALL
749SDL_JoystickOpen(int device_index)
750{
751 trace("%d", device_index);
752 return NULL;
753}
754
b78828bf 755#endif // STANDALONE