all repos — fluxbox @ ca9e2e0d15bc9958959c4636018a3c7384c81157

custom fork of the fluxbox windowmanager

allow navigating multi-column menus with left and right arrows
Mark Tiefenbruck mark@fluxbox.org
commit

ca9e2e0d15bc9958959c4636018a3c7384c81157

parent

07da360b2be4a96e82de80d25b0506d58ea8124e

2 files changed, 23 insertions(+), 4 deletions(-)

jump to
M src/FbTk/Menu.ccsrc/FbTk/Menu.cc

@@ -328,9 +328,11 @@ } else if (reverse || new_index == -1)

new_index = vec[i]->getIndex(); } - if (new_index == -1) - return; + if (new_index != -1) + setActiveIndex(new_index); +} +void Menu::setActiveIndex(int new_index) { // clear the items and close any open submenus int old_active_index = m_active_index; m_active_index = new_index;

@@ -1065,11 +1067,26 @@ cycleItems(false);

break; case XK_Left: // enter parent if we have one resetTypeAhead(); - internal_hide(); + if (menu.sublevels > 1 && m_active_index >= menu.persub) { + int new_index = m_active_index - menu.persub; + while (new_index >= 0 && !isItemEnabled(new_index)) + new_index -= menu.persub; + if (new_index >= 0) + setActiveIndex(new_index); + } else + internal_hide(); break; case XK_Right: // enter submenu if we have one resetTypeAhead(); - enterSubmenu(); + if (menu.sublevels > 1 && validIndex(m_active_index) && + validIndex(m_active_index + menu.persub)) { + int new_index = m_active_index + menu.persub; + while (validIndex(new_index) && !isItemEnabled(new_index)) + new_index += menu.persub; + if (validIndex(new_index)) + setActiveIndex(new_index); + } else + enterSubmenu(); break; case XK_Escape: // close menu m_type_ahead.reset();
M src/FbTk/Menu.hhsrc/FbTk/Menu.hh

@@ -83,6 +83,8 @@ /// lower this window

virtual void lower(); /// cycle through menuitems void cycleItems(bool reverse); + /// set and highlight new active index + void setActiveIndex(int new_index); void enterSubmenu(); void disableTitle();