X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=linux%2Fin_evdev.c;h=3d0522c25ec7d095189f9d62a2059172850669d2;hb=2c60056042e94007286e3e0e1789f4c9a78b7731;hp=02fd0e05988a5779a186644b5c8baa6d2623d5c5;hpb=54563d7189d88f8a56717f7e3150064aacb0de86;p=libpicofe.git diff --git a/linux/in_evdev.c b/linux/in_evdev.c index 02fd0e0..3d0522c 100644 --- a/linux/in_evdev.c +++ b/linux/in_evdev.c @@ -131,7 +131,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 +195,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,95 +295,63 @@ 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 int in_evdev_menu_translate(int keycode) @@ -394,10 +362,19 @@ static int in_evdev_menu_translate(int keycode) case KEY_LEFT: return PBTN_LEFT; case KEY_RIGHT: return PBTN_RIGHT; case KEY_ENTER: - case BTN_TRIGGER: return PBTN_MOK; + case BTN_A: + case BTN_TRIGGER: + return PBTN_MOK; case KEY_ESC: - case BTN_THUMB: return PBTN_MBACK; - case KEY_MENU: return PBTN_MENU; + case BTN_B: + case BTN_THUMB: + return PBTN_MBACK; + case KEY_MENU: + return PBTN_MENU; + case KEY_LEFTBRACE: + return PBTN_L; + case KEY_RIGHTBRACE: + return PBTN_R; default: return 0; } } @@ -408,8 +385,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 +414,13 @@ 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 }, }; #define DEF_BIND_COUNT (sizeof(in_evdev_def_binds) / sizeof(in_evdev_def_binds[0])) @@ -496,6 +476,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;