gl: clear w, h on reinit
[libpicofe.git] / input.c
diff --git a/input.c b/input.c
index 783ed1e..4f91a55 100644 (file)
--- a/input.c
+++ b/input.c
@@ -43,6 +43,8 @@ static int in_have_async_devs = 0;
 static int in_probe_dev_id;
 static int menu_key_state = 0;
 static int menu_last_used_dev = 0;
+static int menu_key_prev = 0;
+static int menu_key_repeat = 0;
 
 #define DRV(id) in_drivers[id]
 
@@ -63,7 +65,7 @@ static int *in_alloc_binds(int drv_id, int key_count)
        defbinds = DRV(drv_id).defbinds;
        if (defbinds != NULL) {
                for (i = 0; ; i++) {
-                       if (defbinds[i].bit == 0 && defbinds[i].btype == 0
+                       if (defbinds[i].code == 0 && defbinds[i].btype == 0
                            && defbinds[i].bit == 0)
                                break;
 
@@ -432,55 +434,45 @@ int in_menu_wait_any(char *charcode, int timeout_ms)
 {
        int keys_old = menu_key_state;
        int ret;
+       int dev_id = 0;
 
-       while (1)
-       {
-               int code, is_down = 0, dev_id = 0;
+       menu_key_prev = menu_key_state;
 
-               code = in_update_keycode(&dev_id, &is_down, charcode, timeout_ms);
-               if (code < 0)
-                       break;
+       in_update_keycode(&dev_id, NULL, charcode, timeout_ms);
 
-               if (keys_old != menu_key_state) {
-                       menu_last_used_dev = dev_id;
-                       break;
-               }
-       }
+       if (keys_old != menu_key_state)
+               menu_last_used_dev = dev_id;
 
        ret = menu_key_state;
-       menu_key_state &= ~PBTN_CHAR;
+       if (ret == 0)
+               menu_key_prev = 0;
+
        return ret;
 }
 
 /* wait for menu input, do autorepeat */
 int in_menu_wait(int interesting, char *charcode, int autorep_delay_ms)
 {
-       static int inp_prev = 0;
-       static int repeats = 0;
-       int ret, release = 0, wait = 450;
+       int ret, wait = 450;
 
-       if (repeats)
+       if (menu_key_repeat)
                wait = autorep_delay_ms;
 
-       ret = in_menu_wait_any(charcode, wait);
-       if (ret == inp_prev)
-               repeats++;
-
-       while (!(ret & interesting)) {
-               ret = in_menu_wait_any(charcode, -1);
-               release = 1;
-       }
-
-       if (release || ret != inp_prev)
-               repeats = 0;
-
-       inp_prev = ret;
+       /* wait until either key repeat or a new key has been pressed */
+#ifdef SDL_REDRAW_EVT
+       interesting |= PBTN_RDRAW;
+#endif
+       do {
+               ret = in_menu_wait_any(charcode, wait);
+               if (ret == 0 || ret != menu_key_prev)
+                       menu_key_repeat = 0;
+               else
+                       menu_key_repeat++;
+               wait = -1;
+       } while (!(ret & interesting));
 
        /* we don't need diagonals in menus */
-       if ((ret & PBTN_UP)   && (ret & PBTN_LEFT))  ret &= ~PBTN_LEFT;
-       if ((ret & PBTN_UP)   && (ret & PBTN_RIGHT)) ret &= ~PBTN_RIGHT;
-       if ((ret & PBTN_DOWN) && (ret & PBTN_LEFT))  ret &= ~PBTN_LEFT;
-       if ((ret & PBTN_DOWN) && (ret & PBTN_RIGHT)) ret &= ~PBTN_RIGHT;
+       if (ret & (PBTN_UP|PBTN_DOWN))  ret &= ~(PBTN_LEFT|PBTN_RIGHT);
 
        return ret;
 }
@@ -548,13 +540,13 @@ static int in_set_blocking(int is_blocking)
                }
        }
 
-       menu_key_state = 0;
-
        /* flush events */
        do {
                ret = in_update_keycode(NULL, NULL, NULL, 0);
        } while (ret >= 0);
 
+       menu_key_state = 0;
+
        return 0;
 }