- 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)
- return i;
+ if (ev.type == EV_KEY) {
+ if (ev.value < 0 || ev.value > 1)
+ goto out;
+ ret_kc = ev.code;
+ ret_down = ev.value;
+ goto out;
+ }
+ else if (ev.type == EV_ABS && dev->abs_to_digital)
+ {
+ int lzone = dev->abs_lzone, down = 0, *last;
+
+ // map absolute to up/down/left/right
+ if (lzone != 0 && ev.code == ABS_X) {
+ if (ev.value < dev->abs_min_x + lzone)
+ down = KEY_LEFT;
+ else if (ev.value > dev->abs_max_x - lzone)
+ down = KEY_RIGHT;
+ last = &dev->abs_lastx;
+ }
+ else if (lzone != 0 && ev.code == ABS_Y) {
+ if (ev.value < dev->abs_min_y + lzone)
+ down = KEY_UP;
+ else if (ev.value > dev->abs_max_y - lzone)
+ down = KEY_DOWN;
+ last = &dev->abs_lasty;
+ }
+ else
+ goto out;
+
+ if (down == *last)
+ goto out;
+
+ if (down == 0 || *last != 0) {
+ /* key up or direction change, return up event for old key */
+ ret_kc = *last;
+ ret_down = 0;
+ *last = 0;
+ goto out;
+ }
+ ret_kc = *last = down;
+ ret_down = 1;
+ goto out;