X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=linux%2Fin_evdev.c;h=c2589a9bc2941f837a983881923e18fa563c18ff;hb=82abf46f3db8ade517881c03327bdbc0de848eb2;hp=02fd0e05988a5779a186644b5c8baa6d2623d5c5;hpb=54563d7189d88f8a56717f7e3150064aacb0de86;p=libpicofe.git diff --git a/linux/in_evdev.c b/linux/in_evdev.c index 02fd0e0..c2589a9 100644 --- a/linux/in_evdev.c +++ b/linux/in_evdev.c @@ -9,7 +9,6 @@ #include #include -#include "../common/common.h" #include "../common/input.h" #include "in_evdev.h" @@ -131,7 +130,7 @@ static void in_evdev_probe(void) char name[64]; snprintf(name, sizeof(name), "/dev/input/event%d", i); - fd = open(name, O_RDONLY); + fd = open(name, O_RDONLY|O_NONBLOCK); if (fd == -1) break; @@ -195,7 +194,7 @@ no_abs: ioctl(fd, EVIOCGNAME(sizeof(name)-6), name+6); printf("in_evdev: found \"%s\" with %d events (type %08x)\n", name+6, count, support); - in_register(name, IN_DRVID_EVDEV, dev); + in_register(name, IN_DRVID_EVDEV, fd, dev, 0); continue; skip: @@ -295,111 +294,109 @@ static void in_evdev_set_blocking(void *drv_data, int y) perror("in_evdev: F_SETFL fcntl failed"); } -int in_evdev_update_keycode(void **data, int dcount, int *which, int *is_down, int timeout_ms) +static int in_evdev_update_keycode(void *data, int *is_down) { - in_evdev_t **devs = (in_evdev_t **)data; - struct timeval tv, *timeout = NULL; - int i, fdmax = -1; - - if (timeout_ms >= 0) { - tv.tv_sec = timeout_ms / 1000; - tv.tv_usec = (timeout_ms % 1000) * 1000; - timeout = &tv; - } + in_evdev_t *dev = data; + struct input_event ev; + int rd; if (is_down != NULL) *is_down = 0; - for (i = 0; i < dcount; i++) - if (devs[i]->fd > fdmax) fdmax = devs[i]->fd; - - while (1) - { - struct input_event ev; - in_evdev_t *dev = NULL; - int ret, rd; - fd_set fdset; - - FD_ZERO(&fdset); - for (i = 0; i < dcount; i++) - FD_SET(devs[i]->fd, &fdset); - - ret = select(fdmax + 1, &fdset, NULL, NULL, timeout); - if (ret == -1) - { - perror("in_evdev: select failed"); - sleep(1); - return 0; - } - - if (ret == 0) - return 0; /* timeout */ - - for (i = 0; i < dcount; i++) - if (FD_ISSET(devs[i]->fd, &fdset)) - *which = i, dev = devs[i]; - - rd = read(dev->fd, &ev, sizeof(ev)); - if (rd < (int) sizeof(ev)) { + rd = read(dev->fd, &ev, sizeof(ev)); + if (rd < (int) sizeof(ev)) { + if (errno != EAGAIN) { perror("in_evdev: error reading"); sleep(1); - return 0; } + return -1; + } - if (ev.type == EV_KEY) { - if (ev.value < 0 || ev.value > 1) - continue; + if (ev.type == EV_KEY) { + if (ev.value < 0 || ev.value > 1) + return -1; + if (is_down != NULL) + *is_down = ev.value; + return ev.code; + } + else if (ev.type == EV_ABS) + { + int down = 0; + if (dev->abs_lzone != 0 && ev.code == ABS_X) { + if (ev.value < dev->abs_lzone) { + down = 1; + dev->abs_lastx = KEY_LEFT; + } + else if (ev.value > dev->abs_rzone) { + down = 1; + dev->abs_lastx = KEY_RIGHT; + } if (is_down != NULL) - *is_down = ev.value; - return ev.code; + *is_down = down; + return dev->abs_lastx; } - else if (ev.type == EV_ABS) - { - int down = 0; - if (dev->abs_lzone != 0 && ev.code == ABS_X) { - if (ev.value < dev->abs_lzone) { - down = 1; - dev->abs_lastx = KEY_LEFT; - } - else if (ev.value > dev->abs_rzone) { - down = 1; - dev->abs_lastx = KEY_RIGHT; - } - if (is_down != NULL) - *is_down = down; - return dev->abs_lastx; + if (dev->abs_tzone != 0 && ev.code == ABS_Y) { + if (ev.value < dev->abs_tzone) { + down = 1; + dev->abs_lasty = KEY_UP; } - if (dev->abs_tzone != 0 && ev.code == ABS_Y) { - if (ev.value < dev->abs_tzone) { - down = 1; - dev->abs_lasty = KEY_UP; - } - else if (ev.value > dev->abs_bzone) { - down = 1; - dev->abs_lasty = KEY_DOWN; - } - if (is_down != NULL) - *is_down = down; - return dev->abs_lasty; + else if (ev.value > dev->abs_bzone) { + down = 1; + dev->abs_lasty = KEY_DOWN; } + if (is_down != NULL) + *is_down = down; + return dev->abs_lasty; } } + + return -1; } +static const struct { + short key; + short pbtn; +} key_pbtn_map[] = +{ + { KEY_UP, PBTN_UP }, + { KEY_DOWN, PBTN_DOWN }, + { KEY_LEFT, PBTN_LEFT }, + { KEY_RIGHT, PBTN_RIGHT }, + { KEY_ENTER, PBTN_MOK }, + { BTN_A, PBTN_MOK }, + { BTN_TRIGGER, PBTN_MOK }, + { KEY_ESC, PBTN_MBACK }, + { BTN_B, PBTN_MBACK }, + { BTN_THUMB, PBTN_MBACK }, + { KEY_A, PBTN_MA2 }, + { KEY_S, PBTN_MA3 }, + { KEY_BACKSLASH, PBTN_MENU }, + { KEY_MENU, PBTN_MENU }, + { KEY_LEFTBRACE, PBTN_L }, + { KEY_RIGHTBRACE, PBTN_R }, +}; + +#define KEY_PBTN_MAP_SIZE (sizeof(key_pbtn_map) / sizeof(key_pbtn_map[0])) + static int in_evdev_menu_translate(int keycode) { - switch (keycode) { - case KEY_UP: return PBTN_UP; - case KEY_DOWN: return PBTN_DOWN; - case KEY_LEFT: return PBTN_LEFT; - case KEY_RIGHT: return PBTN_RIGHT; - case KEY_ENTER: - case BTN_TRIGGER: return PBTN_MOK; - case KEY_ESC: - case BTN_THUMB: return PBTN_MBACK; - case KEY_MENU: return PBTN_MENU; - default: return 0; + int i; + if (keycode < 0) + { + /* menu -> kc */ + keycode = -keycode; + for (i = 0; i < KEY_PBTN_MAP_SIZE; i++) + if (key_pbtn_map[i].pbtn == keycode) + return key_pbtn_map[i].key; + } + else + { + for (i = 0; i < KEY_PBTN_MAP_SIZE; i++) + if (key_pbtn_map[i].key == keycode) + return key_pbtn_map[i].pbtn; } + + return 0; } static int in_evdev_get_key_code(const char *key_name) @@ -408,8 +405,7 @@ static int in_evdev_get_key_code(const char *key_name) for (i = 0; i < KEY_MAX + 1; i++) { const char *k = in_evdev_keys[i]; - if (k != NULL && k[0] == key_name[0] && - strcasecmp(k, key_name) == 0) + if (k != NULL && strcasecmp(k, key_name) == 0) return i; } @@ -438,9 +434,15 @@ static const struct { { KEY_LEFT, 2 }, { KEY_RIGHT, 3 }, { KEY_S, 4 }, /* B */ + { BTN_B, 4 }, { KEY_D, 5 }, /* C */ + { BTN_A, 5 }, { KEY_A, 6 }, /* A */ + { BTN_Y, 6 }, { KEY_ENTER, 7 }, + { BTN_START, 7 }, + { BTN_TL, 27 }, /* save state */ + { BTN_TR, 28 }, /* load state */ }; #define DEF_BIND_COUNT (sizeof(in_evdev_def_binds) / sizeof(in_evdev_def_binds[0])) @@ -496,6 +498,7 @@ void in_evdev_init(void *vdrv) drv->get_def_binds = in_evdev_get_def_binds; drv->clean_binds = in_evdev_clean_binds; drv->set_blocking = in_evdev_set_blocking; + drv->update_keycode = in_evdev_update_keycode; drv->menu_translate = in_evdev_menu_translate; drv->get_key_code = in_evdev_get_key_code; drv->get_key_name = in_evdev_get_key_name;