X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvideo%2Fomapdss%2Fosdl_input.c;h=4908661d79e4d6ae081ff6f73546d271de5f1b05;hb=b983f171bf57138ebcfce244b276bc9d22e63452;hp=68c58e4c5c98c9dd3abf71124aef45ae7a6f1e2b;hpb=83b5751b446734b65e83ed4210b3c5cba3435866;p=sdl_omap.git diff --git a/src/video/omapdss/osdl_input.c b/src/video/omapdss/osdl_input.c index 68c58e4..4908661 100644 --- a/src/video/omapdss/osdl_input.c +++ b/src/video/omapdss/osdl_input.c @@ -14,98 +14,68 @@ #include #include #include +#ifdef STANDALONE #include +#else +#include "SDL.h" +#endif +#if SDL_INPUT_TSLIB +#include +#endif #include "omapsdl.h" +/* XXX: these should go to private data */ static int osdl_evdev_devs[32]; static int osdl_evdev_dev_count; +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_MODE, + [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, @@ -117,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, }; @@ -480,10 +450,30 @@ bad_sdlkey: void omapsdl_input_init(void) { long keybits[KEY_CNT / sizeof(long) / 8]; + ino_t touchscreen_ino = (ino_t)-1; + struct stat stat_buf; int i; - // the kernel might support and return less keys then we know about, - // so make sure the buffer is clear. +#if SDL_INPUT_TSLIB + /* start with touchscreen so that we can skip it later */ + osdl_tslib_dev = ts_open(SDL_getenv("TSLIB_TSDEVICE"), 1); + if (ts_config(osdl_tslib_dev) < 0) { + ts_close(osdl_tslib_dev); + osdl_tslib_dev = NULL; + } + if (osdl_tslib_dev != NULL) { + 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) + err_perror("fstat ts"); + else + touchscreen_ino = stat_buf.st_ino; + log("opened tslib touchscreen"); + } +#endif + + /* the kernel might support and return less keys then we know about, + * so make sure the buffer is clear. */ memset(keybits, 0, sizeof(keybits)); for (i = 0;; i++) @@ -500,10 +490,20 @@ void omapsdl_input_init(void) break; } + /* touchscreen check */ + if (touchscreen_ino != (dev_t)-1) { + if (fstat(fd, &stat_buf) == -1) + err_perror("fstat"); + else if (touchscreen_ino == stat_buf.st_ino) { + log("skip %s as ts", name); + goto skip; + } + } + /* 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; } @@ -512,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; } @@ -529,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; @@ -537,11 +537,31 @@ skip: close(fd); } - printf("found %d evdev devices.\n", osdl_evdev_dev_count); + log("found %d evdev device(s).", osdl_evdev_dev_count); +} + +void omapsdl_input_finish(void) +{ + int i; + +#if SDL_INPUT_TSLIB + if (osdl_tslib_dev != NULL) + ts_close(osdl_tslib_dev); +#endif + osdl_tslib_dev = NULL; + + for (i = 0; i < osdl_evdev_dev_count; i++) { + if (osdl_evdev_devs[i] != osdl_tslib_fd) + close(osdl_evdev_devs[i]); + } + osdl_evdev_dev_count = 0; + osdl_tslib_fd = 0; } int omapsdl_input_get_events(int timeout_ms, - int (*cb)(void *cb_arg, int sdl_kc, int is_pressed), void *cb_arg) + int (*key_cb)(void *cb_arg, int sdl_kc, int is_pressed), + int (*ts_cb)(void *cb_arg, int x, int y, unsigned int pressure), + void *cb_arg) { struct timeval tv, *timeout = NULL; struct input_event ev; @@ -568,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) @@ -579,11 +599,27 @@ int omapsdl_input_get_events(int timeout_ms, continue; fd = osdl_evdev_devs[i]; +#if SDL_INPUT_TSLIB + if (fd == osdl_tslib_fd && ts_cb != NULL) { + while (1) { + struct ts_sample tss; + ret = ts_read(osdl_tslib_dev, &tss, 1); + if (ret <= 0) + break; + ret = ts_cb(cb_arg, tss.x, tss.y, tss.pressure); + if (ret != 0) + return ret; + } + continue; + } + /* else read below will consume the event, even if it's from ts */ +#endif + while (1) { 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; @@ -598,7 +634,7 @@ int omapsdl_input_get_events(int timeout_ms, sdl_kc = osdl_evdev_map[ev.code]; if (sdl_kc == 0) continue; /* not mapped */ - ret = cb(cb_arg, sdl_kc, ev.value); + ret = key_cb(cb_arg, sdl_kc, ev.value); if (ret != 0) return ret; } @@ -630,7 +666,7 @@ static int do_event(SDL_Event *event, int timeout) struct key_event ev; int ret; - ret = omapsdl_input_get_events(timeout, do_key_cb, &ev); + ret = omapsdl_input_get_events(timeout, do_key_cb, NULL, &ev); if (ret < 0) return 0;