# HG changeset patch # User Pavel Jank # Date 1019309997 0 # Node ID a05c8614feee5f0d2423625159410b8220f7d05c # Parent 093bf061ef1d2cef496a6086c0cd6804331878c2 (find_next_selectable): New function. (Down, Up, Right): Use it. (find_next_selectable): Prevent endless loops when only one item is enabled in the menu. diff -r 093bf061ef1d -r a05c8614feee lwlib/xlwmenu.c --- a/lwlib/xlwmenu.c Sat Apr 20 13:32:12 2002 +0000 +++ b/lwlib/xlwmenu.c Sat Apr 20 13:39:57 2002 +0000 @@ -129,6 +129,7 @@ /* FIXME: Should ESC close one level of menu structure or the complete menu? */ +/* FIXME: Should F10 enter to menu? Which one? File? */ #define offset(field) XtOffset(XlwMenuWidget, field) static XtResource @@ -2005,6 +2006,23 @@ } widget_value * +find_first_selectable (mw, item) + XlwMenuWidget mw; + widget_value *item; +{ + widget_value *current = item; + enum menu_separator separator; + + while (lw_separator_p (current->name, &separator, 0) || !current->enabled) + if (current->next) + current=current->next; + else + return NULL; + + return current; +} + +widget_value * find_next_selectable (mw, item) XlwMenuWidget mw; widget_value *item; @@ -2021,8 +2039,14 @@ current = mw->menu.old_stack [mw->menu.old_depth - 2]->contents; while (lw_separator_p (current->name, &separator, 0) || !current->enabled) - if (current->next) - current=current->next; + { + if (current->next) + current=current->next; + + if (current == item) + break; + } + } return current; @@ -2037,7 +2061,11 @@ widget_value *prev = item; while ((current=find_next_selectable (mw, current)) != item) + { + if (prev == current) + break; prev=current; + } return prev; } @@ -2055,8 +2083,8 @@ /* Inside top-level menu-bar? */ if (mw->menu.old_depth == 2) /* When in the menu-bar is pressed, display the corresponding - sub-menu and select the first menu item there. */ - set_new_state (mw, selected_item->contents, mw->menu.old_depth); + sub-menu and select the first selectable menu item there. */ + set_new_state (mw, find_first_selectable (mw, selected_item->contents), mw->menu.old_depth); else /* Highlight next possible (enabled and not separator) menu item. */ set_new_state (mw, find_next_selectable (mw, selected_item), mw->menu.old_depth - 1); @@ -2078,9 +2106,10 @@ if (mw->menu.old_depth == 2) { /* FIXME: this is tricky. in the menu-bar should select the - last selectable item in the list. So we select the first one and - find the previous selectable item. Is there a better way? */ - set_new_state (mw, selected_item->contents, mw->menu.old_depth); + last selectable item in the list. So we select the first + selectable one and find the previous selectable item. Is there + a better way? */ + set_new_state (mw, find_first_selectable (mw, selected_item->contents), mw->menu.old_depth); remap_menubar (mw); selected_item = mw->menu.old_stack [mw->menu.old_depth - 1]; set_new_state (mw, find_prev_selectable (mw, selected_item), mw->menu.old_depth - 1); @@ -2134,7 +2163,13 @@ first item (probably File). */ set_new_state (mw, find_next_selectable (mw, selected_item), mw->menu.old_depth - 1); else if (selected_item->contents) /* Is this menu item expandable? */ - set_new_state (mw, selected_item->contents, mw->menu.old_depth); + { + set_new_state (mw, selected_item->contents, mw->menu.old_depth); + remap_menubar (mw); + selected_item = mw->menu.old_stack [mw->menu.old_depth - 1]; + if (!selected_item->enabled && find_first_selectable (mw, selected_item)) + set_new_state (mw, find_first_selectable (mw, selected_item), mw->menu.old_depth - 1); + } else { pop_new_stack_if_no_contents (mw);