summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_Menu.cxx21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index ed362a921..8d7e7a4c5 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -694,14 +694,17 @@ static void setitem(int m, int n) {
static int forward(int menu) { // go to next item in menu menu if possible
menustate &pp = *p;
- // Fl_Menu_Button can generate menu=-1. This line fixes it and selectes the first item.
+ // Fl_Menu_Button can generate menu=-1. This line fixes it and selects the first item.
if (menu==-1)
menu = 0;
menuwindow &m = *(pp.p[menu]);
int item = (menu == pp.menu_number) ? pp.item_number : m.selected;
- while (++item < m.numitems) {
- const Fl_Menu_Item* m1 = m.menu->next(item);
- if (m1->activevisible()) {setitem(m1, menu, item); return 1;}
+ while (m.numitems >= 2) {
+ while (++item < m.numitems) {
+ const Fl_Menu_Item* m1 = m.menu->next(item);
+ if (m1->activevisible()) {setitem(m1, menu, item); return 1;}
+ }
+ item = -1;
}
return 0;
}
@@ -713,10 +716,12 @@ static int backward(int menu) { // previous item in menu menu if possible
menustate &pp = *p;
menuwindow &m = *(pp.p[menu]);
int item = (menu == pp.menu_number) ? pp.item_number : m.selected;
- if (item < 0) item = m.numitems;
- while (--item >= 0) {
- const Fl_Menu_Item* m1 = m.menu->next(item);
- if (m1->activevisible()) {setitem(m1, menu, item); return 1;}
+ while (m.numitems >= 2) {
+ while (--item >= 0) {
+ const Fl_Menu_Item* m1 = m.menu->next(item);
+ if (m1->activevisible()) {setitem(m1, menu, item); return 1;}
+ }
+ item = m.numitems;
}
return 0;
}