From 696e3997dca6911e7c48044ef0fac24b8863680a Mon Sep 17 00:00:00 2001
From: cancel <cancel@cancel.fm>
Date: Mon, 6 Jan 2020 02:19:25 +0900
Subject: [PATCH] Add additional protection against bad menu cycling

---
 term_util.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/term_util.c b/term_util.c
index 1077f85..d6b2d44 100644
--- a/term_util.c
+++ b/term_util.c
@@ -507,26 +507,34 @@ bool qmenu_drive(Qmenu* qm, int key, Qmenu_action* out_action) {
   case KEY_UP: {
     ITEM* starting = current_item(qm->ncurses_menu);
     menu_driver(qm->ncurses_menu, REQ_UP_ITEM);
+    ITEM* cur = current_item(qm->ncurses_menu);
     for (;;) {
-      ITEM* cur = current_item(qm->ncurses_menu);
       if (!cur || cur == starting)
         break;
       if (!qmenu_itemextra(extras, cur)->is_spacer)
         break;
+      ITEM* prev = cur;
       menu_driver(qm->ncurses_menu, REQ_UP_ITEM);
+      cur = current_item(qm->ncurses_menu);
+      if (cur == prev)
+        break;
     }
     return false;
   }
   case KEY_DOWN: {
     ITEM* starting = current_item(qm->ncurses_menu);
     menu_driver(qm->ncurses_menu, REQ_DOWN_ITEM);
+    ITEM* cur = current_item(qm->ncurses_menu);
     for (;;) {
-      ITEM* cur = current_item(qm->ncurses_menu);
       if (!cur || cur == starting)
         break;
       if (!qmenu_itemextra(extras, cur)->is_spacer)
         break;
+      ITEM* prev = cur;
       menu_driver(qm->ncurses_menu, REQ_DOWN_ITEM);
+      cur = current_item(qm->ncurses_menu);
+      if (cur == prev)
+        break;
     }
     return false;
   }