in_evdev: do all events in update_keycode
authornotaz <notasas@gmail.com>
Sun, 7 Nov 2010 21:55:57 +0000 (21:55 +0000)
committernotaz <notasas@gmail.com>
Sun, 7 Nov 2010 21:55:57 +0000 (21:55 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@901 be3aeb3a-fb24-0410-a615-afba39da0efa

common/input.c
linux/in_evdev.c

index 182e9fb..a6d331e 100644 (file)
@@ -355,9 +355,6 @@ int in_update_keycode(int *dev_id_out, int *is_down_out, int timeout_ms)
 
                drv = &DRV(in_devices[dev_id].drv_id);
                result = drv->update_keycode(in_devices[dev_id].drv_data, &is_down);
-
-               /* update_keycode() might return -1 when some not interesting
-                * event happened, like sync event for evdev. */
                if (result >= 0)
                        break;
 
@@ -370,7 +367,7 @@ int in_update_keycode(int *dev_id_out, int *is_down_out, int timeout_ms)
                }
        }
 
-       if (result == -1)
+       if (result < 0)
                return -1;
 finish:
        /* keep track of menu key state, to allow mixing
index edfa6ef..065676b 100644 (file)
@@ -392,57 +392,60 @@ static int in_evdev_update_keycode(void *data, int *is_down)
        struct input_event ev;
        int rd;
 
-       rd = read(dev->fd, &ev, sizeof(ev));
-       if (rd < (int) sizeof(ev)) {
-               if (errno != EAGAIN) {
-                       perror("in_evdev: error reading");
-                       sleep(1);
-               }
-               goto out;
-       }
-
-       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)
+       while (1)
        {
-               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
+               rd = read(dev->fd, &ev, sizeof(ev));
+               if (rd < (int) sizeof(ev)) {
+                       if (errno != EAGAIN) {
+                               perror("in_evdev: error reading");
+                               sleep(1);
+                       }
                        goto out;
+               }
 
-               if (down == *last)
+               if (ev.type == EV_KEY) {
+                       if (ev.value < 0 || ev.value > 1)
+                               continue;
+                       ret_kc = ev.code;
+                       ret_down = ev.value;
                        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;
+               }
+               else if (ev.type == EV_ABS)
+               {
+                       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
+                               continue;
+
+                       if (down == *last)
+                               continue;
+
+                       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;
                }
-               ret_kc = *last = down;
-               ret_down = 1;
-               goto out;
        }
 
 out: