+/* wait for menu input, do autorepeat */
+int in_menu_wait(int interesting)
+{
+ static int inp_prev = 0;
+ static int repeats = 0, wait = 20;
+ int ret = 0, release = 0, i;
+
+ if (repeats == 2) wait = 3;
+ else if (repeats == 4) wait = 2;
+ else if (repeats == 6) wait = 1;
+
+ for (i = 0; i < wait; i++) {
+ ret = in_menu_wait_any(30);
+ if (ret != inp_prev) break;
+ if (i == 0) repeats++;
+ }
+
+ while (!(ret & interesting)) {
+ ret = in_menu_wait_any(-1);
+ release = 1;
+ }
+
+ if (release || ret != inp_prev) {
+ repeats = 0;
+ wait = 20;
+ }
+ if (wait > 6 && (ret & (PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT)))
+ wait = 6;
+ inp_prev = ret;
+
+ // 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;
+
+ return ret;
+}
+