X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=sdl_omap.git;a=blobdiff_plain;f=src%2Fvideo%2Fomapdss%2Fosdl_input.c;h=e6fb1f765051e6b0d4193893f1c17d0d5480fc84;hp=fff2ca2ca485e3141f62b60734361c5e742cbbe6;hb=090bcb85b9cebd193299c9e93f4de8c5888094f4;hpb=5646dd9e85cb1a2703cdaa2a8f1a307fb66c6b88 diff --git a/src/video/omapdss/osdl_input.c b/src/video/omapdss/osdl_input.c index fff2ca2..e6fb1f7 100644 --- a/src/video/omapdss/osdl_input.c +++ b/src/video/omapdss/osdl_input.c @@ -1,5 +1,5 @@ /* - * (C) Gražvydas "notaz" Ignotas, 2010 + * (C) Gražvydas "notaz" Ignotas, 2010-2012 * * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. * See the COPYING file in the top-level directory. @@ -14,12 +14,16 @@ #include #include #include +#ifdef STANDALONE #include +#else +#include "SDL.h" +#endif #if SDL_INPUT_TSLIB #include #endif -#include "omapsdl.h" +#include "osdl.h" /* XXX: these should go to private data */ static int osdl_evdev_devs[32]; @@ -28,90 +32,50 @@ static int osdl_tslib_fd; static struct tsdev *osdl_tslib_dev; static short osdl_evdev_map[KEY_CNT] = { - [KEY_0] = SDLK_0, - [KEY_1] = SDLK_1, - [KEY_2] = SDLK_2, - [KEY_3] = SDLK_3, - [KEY_4] = SDLK_4, - [KEY_5] = SDLK_5, - [KEY_6] = SDLK_6, - [KEY_7] = SDLK_7, - [KEY_8] = SDLK_8, - [KEY_9] = SDLK_9, - [KEY_A] = SDLK_a, - [KEY_B] = SDLK_b, - [KEY_C] = SDLK_c, - [KEY_D] = SDLK_d, - [KEY_E] = SDLK_e, - [KEY_F] = SDLK_f, - [KEY_G] = SDLK_g, - [KEY_H] = SDLK_h, - [KEY_I] = SDLK_i, - [KEY_J] = SDLK_j, - [KEY_K] = SDLK_k, - [KEY_L] = SDLK_l, - [KEY_M] = SDLK_m, - [KEY_N] = SDLK_n, - [KEY_O] = SDLK_o, - [KEY_P] = SDLK_p, - [KEY_Q] = SDLK_q, - [KEY_R] = SDLK_r, - [KEY_S] = SDLK_s, - [KEY_T] = SDLK_t, - [KEY_U] = SDLK_u, - [KEY_V] = SDLK_v, - [KEY_W] = SDLK_w, - [KEY_X] = SDLK_x, - [KEY_Y] = SDLK_y, - [KEY_Z] = SDLK_z, - [KEY_SPACE] = SDLK_SPACE, - [KEY_BACKSPACE] = SDLK_BACKSPACE, - [KEY_FN] = SDLK_MODE, - [KEY_DOT] = SDLK_PERIOD, - [KEY_ENTER] = SDLK_RETURN, - [KEY_LEFTSHIFT] = SDLK_LSHIFT, - [KEY_COMMA] = SDLK_COMMA, -// [KEY_BRIGHTNESSUP] = -// [KEY_BRIGHTNESSDOWN] = -// [KEY_GRAVE] = - [KEY_TAB] = SDLK_TAB, - [KEY_INSERT] = SDLK_INSERT, - [KEY_EQUAL] = SDLK_EQUALS, - [KEY_KPPLUS] = SDLK_KP_PLUS, - [KEY_BACKSLASH] = SDLK_BACKSLASH, - [KEY_RIGHTBRACE]= SDLK_RIGHTBRACKET, - [KEY_KPMINUS] = SDLK_KP_MINUS, - [KEY_QUESTION] = SDLK_QUESTION, - [KEY_LEFTBRACE] = SDLK_LEFTBRACKET, - [KEY_SLASH] = SDLK_SLASH, -// [KEY_YEN] = - [KEY_APOSTROPHE]= SDLK_QUOTE, - [KEY_ESC] = SDLK_ESCAPE, - [KEY_CAPSLOCK] = SDLK_CAPSLOCK, - [KEY_SEMICOLON] = SDLK_SEMICOLON, - [KEY_F1] = SDLK_F1, - [KEY_F2] = SDLK_F2, - [KEY_F3] = SDLK_F3, - [KEY_F4] = SDLK_F4, - [KEY_F5] = SDLK_F5, - [KEY_F6] = SDLK_F6, - [KEY_F7] = SDLK_F7, - [KEY_F8] = SDLK_F8, - [KEY_F9] = SDLK_F9, - [KEY_F10] = KEY_F10, - [KEY_F11] = KEY_F11, - [KEY_F12] = KEY_F12, - [KEY_F13] = KEY_F13, /* apostrophe, differs from Fn-A? */ - [KEY_F14] = KEY_F14, /* pipe/bar */ - [KEY_F15] = KEY_F15, /* dash */ - [KEY_F16] = SDLK_HASH, /* # (pound/hash) */ - [KEY_F17] = SDLK_EXCLAIM, /* ! */ -// [KEY_F18] = /* £ (pound) */ - [KEY_F19] = SDLK_QUOTEDBL,/* " */ - [KEY_F20] = SDLK_AT, /* @ */ - [KEY_F21] = SDLK_SEMICOLON,/* : */ -// [KEY_F22] = -// [KEY_F23] = + /* normal fn */ + [KEY_0] = SDLK_0, [KEY_F10] = SDLK_F10, + [KEY_1] = SDLK_1, [KEY_F1] = SDLK_F1, + [KEY_2] = SDLK_2, [KEY_F2] = SDLK_F2, + [KEY_3] = SDLK_3, [KEY_F3] = SDLK_F3, + [KEY_4] = SDLK_4, [KEY_F4] = SDLK_F4, + [KEY_5] = SDLK_5, [KEY_F5] = SDLK_F5, + [KEY_6] = SDLK_6, [KEY_F6] = SDLK_F6, + [KEY_7] = SDLK_7, [KEY_F7] = SDLK_F7, + [KEY_8] = SDLK_8, [KEY_F8] = SDLK_F8, + [KEY_9] = SDLK_9, [KEY_F9] = SDLK_F9, + [KEY_A] = SDLK_a, [KEY_APOSTROPHE]= SDLK_QUOTE, /* ' */ + [KEY_B] = SDLK_b, [KEY_F14] = 124, /* | */ + [KEY_C] = SDLK_c, [KEY_BACKSLASH] = SDLK_BACKSLASH, /* \ */ + [KEY_D] = SDLK_d, [KEY_KPMINUS] = SDLK_MINUS, + [KEY_E] = SDLK_e, [KEY_LEFTBRACE] = SDLK_LEFTPAREN, + [KEY_F] = SDLK_f, [KEY_KPPLUS] = SDLK_PLUS, + [KEY_G] = SDLK_g, [KEY_EQUAL] = SDLK_EQUALS, + [KEY_H] = SDLK_h, [KEY_GRAVE] = SDLK_BACKQUOTE, /* ` */ + [KEY_I] = SDLK_i, /* [KEY_BRIGHTNESSUP] */ + [KEY_J] = SDLK_j, [KEY_F13] = SDLK_WORLD_4, /* ’ (not on def SDL) */ + [KEY_K] = SDLK_k, [KEY_F18] = SDLK_WORLD_3, /* £ (pound) */ + [KEY_L] = SDLK_l, [KEY_YEN] = SDLK_WORLD_5, + [KEY_M] = SDLK_m, [KEY_F23] = SDLK_EURO, + [KEY_N] = SDLK_n, [KEY_F22] = SDLK_DOLLAR, /* $ */ + [KEY_O] = SDLK_o, [KEY_F11] = SDLK_F11, + [KEY_P] = SDLK_p, [KEY_F12] = SDLK_F12, + [KEY_Q] = SDLK_q, [KEY_ESC] = SDLK_ESCAPE, + [KEY_R] = SDLK_r, [KEY_RIGHTBRACE]= SDLK_RIGHTPAREN, + [KEY_S] = SDLK_s, [KEY_F19] = SDLK_QUOTEDBL, /* " */ + [KEY_T] = SDLK_t, [KEY_F17] = SDLK_EXCLAIM, /* ! */ + [KEY_U] = SDLK_u, /* [KEY_BRIGHTNESSDOWN] */ + [KEY_V] = SDLK_v, [KEY_F16] = SDLK_HASH, /* # (pound/hash) */ + [KEY_W] = SDLK_w, [KEY_F20] = SDLK_AT, /* @ */ + [KEY_X] = SDLK_x, [KEY_QUESTION] = SDLK_QUESTION, /* ? */ + [KEY_Y] = SDLK_y, [KEY_F15] = SDLK_UNDERSCORE,/* _ */ + [KEY_Z] = SDLK_z, [KEY_SLASH] = SDLK_SLASH, /* / */ + [KEY_SPACE] = SDLK_SPACE, [KEY_TAB] = SDLK_TAB, + [KEY_BACKSPACE] = SDLK_BACKSPACE, [KEY_INSERT] = SDLK_INSERT, + [KEY_FN] = SDLK_WORLD_95, + [KEY_DOT] = SDLK_PERIOD, [KEY_F21] = SDLK_COLON, /* : */ + [KEY_ENTER] = SDLK_RETURN, + [KEY_LEFTSHIFT] = SDLK_LSHIFT, [KEY_CAPSLOCK] = SDLK_CAPSLOCK, + [KEY_COMMA] = SDLK_COMMA, [KEY_SEMICOLON] = SDLK_SEMICOLON, /* ; */ [KEY_UP] = SDLK_UP, [KEY_DOWN] = SDLK_DOWN, @@ -123,7 +87,7 @@ static short osdl_evdev_map[KEY_CNT] = { [KEY_PAGEDOWN] = SDLK_PAGEDOWN, [KEY_LEFTALT] = SDLK_LALT, [KEY_LEFTCTRL] = SDLK_LCTRL, -// [KEY_MENU] = + [KEY_MENU] = 147, /* match default SDL here */ [KEY_RIGHTSHIFT]= SDLK_RSHIFT, [KEY_RIGHTCTRL] = SDLK_RCTRL, }; @@ -501,10 +465,10 @@ void omapsdl_input_init(void) osdl_tslib_fd = ts_fd(osdl_tslib_dev); osdl_evdev_devs[osdl_evdev_dev_count++] = osdl_tslib_fd; if (fstat(osdl_tslib_fd, &stat_buf) == -1) - perror("fstat ts"); + err_perror("fstat ts"); else touchscreen_ino = stat_buf.st_ino; - printf("opened tslib touchscreen\n"); + log("opened tslib touchscreen"); } #endif @@ -529,9 +493,9 @@ void omapsdl_input_init(void) /* touchscreen check */ if (touchscreen_ino != (dev_t)-1) { if (fstat(fd, &stat_buf) == -1) - perror("fstat"); + err_perror("fstat"); else if (touchscreen_ino == stat_buf.st_ino) { - printf("skip %s as ts\n", name); + log("skip %s as ts", name); goto skip; } } @@ -539,7 +503,7 @@ void omapsdl_input_init(void) /* check supported events */ ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support); if (ret == -1) { - printf("in_evdev: ioctl failed on %s\n", name); + err_perror("in_evdev: ioctl failed on %s", name); goto skip; } @@ -548,7 +512,7 @@ void omapsdl_input_init(void) ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits); if (ret == -1) { - printf("in_evdev: ioctl failed on %s\n", name); + err_perror("in_evdev: ioctl failed on %s", name); goto skip; } @@ -565,7 +529,7 @@ void omapsdl_input_init(void) osdl_evdev_devs[osdl_evdev_dev_count++] = fd; ioctl(fd, EVIOCGNAME(sizeof(name)), name); - printf("in_evdev: found \"%s\" with %d events (type %08x)\n", + log("in_evdev: found \"%s\" with %d events (type %08x)", name, count, support); continue; @@ -573,7 +537,7 @@ skip: close(fd); } - printf("found %d evdev device(s).\n", osdl_evdev_dev_count); + log("found %d evdev device(s).", osdl_evdev_dev_count); } void omapsdl_input_finish(void) @@ -595,7 +559,7 @@ void omapsdl_input_finish(void) } int omapsdl_input_get_events(int timeout_ms, - int (*key_cb)(void *cb_arg, int sdl_kc, int is_pressed), + int (*key_cb)(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed), int (*ts_cb)(void *cb_arg, int x, int y, unsigned int pressure), void *cb_arg) { @@ -624,7 +588,7 @@ int omapsdl_input_get_events(int timeout_ms, ret = select(fdmax + 1, &fdset, NULL, NULL, timeout); if (ret == -1) { - perror("in_evdev: select failed"); + err_perror("in_evdev: select failed"); return -1; } else if (ret == 0) @@ -655,14 +619,14 @@ int omapsdl_input_get_events(int timeout_ms, ret = read(fd, &ev, sizeof(ev)); if (ret < (int)sizeof(ev)) { if (errno != EAGAIN) { - perror("in_evdev: read failed"); + err_perror("in_evdev: read failed"); return -1; } break; } - if (ev.type != EV_KEY) - continue; /* not key event */ + if (ev.type != EV_KEY || key_cb == NULL) + continue; /* not key event or not needed */ if ((unsigned int)ev.value > 1) continue; /* not key up/down */ if ((unsigned int)ev.code >= ARRAY_SIZE(osdl_evdev_map)) @@ -670,7 +634,8 @@ int omapsdl_input_get_events(int timeout_ms, sdl_kc = osdl_evdev_map[ev.code]; if (sdl_kc == 0) continue; /* not mapped */ - ret = key_cb(cb_arg, sdl_kc, ev.value); + /* scancode note: stock SDL doesn't do +8 in fbcon driver */ + ret = key_cb(cb_arg, sdl_kc, ev.code + 8, ev.value); if (ret != 0) return ret; } @@ -685,13 +650,15 @@ static unsigned char g_keystate[SDLK_LAST]; struct key_event { int sdl_kc; + int sdl_sc; int is_pressed; }; -static int do_key_cb(void *cb_arg, int sdl_kc, int is_pressed) +static int do_key_cb(void *cb_arg, int sdl_kc, int sdl_sc, int is_pressed) { struct key_event *ev = cb_arg; ev->sdl_kc = sdl_kc; + ev->sdl_sc = sdl_sc; ev->is_pressed = is_pressed; return 1; /* done */ @@ -716,6 +683,7 @@ static int do_event(SDL_Event *event, int timeout) // event->key.which = event->key.state = ev.is_pressed ? SDL_PRESSED : SDL_RELEASED; event->key.keysym.sym = ev.sdl_kc; + event->key.keysym.scancode = ev.sdl_sc; // event->key.keysym.mod return 1;