From b4aba1ff12e455cb5fb6f76dee93f405bfe5738e Mon Sep 17 00:00:00 2001 From: fluxgen Date: Thu, 3 Jul 2003 12:23:28 +0000 Subject: minor fix in keyboard navigation --- src/FbTk/Menu.cc | 69 ++++++++++++++++++++++++++++++++++++++++++++------------ src/FbTk/Menu.hh | 4 +++- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc index c953be9..75ead42 100644 --- a/src/FbTk/Menu.cc +++ b/src/FbTk/Menu.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Menu.cc,v 1.25 2003/07/02 05:26:14 fluxgen Exp $ +// $Id: Menu.cc,v 1.26 2003/07/03 12:23:28 fluxgen Exp $ //use GNU extensions #ifndef _GNU_SOURCE @@ -1259,6 +1259,33 @@ void Menu::leaveNotifyEvent(XCrossingEvent &ce) { } } +void Menu::enterSubmenu() { + if (which_press < 0 || which_press >= menuitems.size()) + return; + + Menu *submenu = menuitems[which_press]->submenu(); + if (submenu == 0) + return; + + submenu->grabInputFocus(); + submenu->which_press = -1; // so we land on 0 after nextItem() + submenu->nextItem(); +} + +void Menu::enterParent() { + if (which_press < 0 || which_press >= menuitems.size() || parent() == 0) + return; + + Menu *submenu = menuitems[which_press]->submenu(); + if (submenu) + submenu->menu.window.hide(); + + drawItem(which_press, false, true, true); + which_press = -1; // dont select any in this + // return focus to parent but keep this window open + parent()->grabInputFocus(); +} + void Menu::keyPressEvent(XKeyEvent &event) { KeySym ks; char keychar[1]; @@ -1276,27 +1303,39 @@ void Menu::keyPressEvent(XKeyEvent &event) { case XK_Down: nextItem(); break; - case XK_Left: - if (which_press >= 0 && which_press < menuitems.size() && - m_parent != 0) { - if (menuitems[which_press]->submenu()) - menuitems[which_press]->submenu()->menu.window.hide(); - drawItem(which_press, false, true, true); - m_parent->grabInputFocus(); + case XK_Left: // enter submenu or leave this menu and enter parent + // if we have a submenu we should determine if + // we should open it or close this and enter parent depending on which + // side the parent is. + // if parent on the left -> enter parent + // if parent on the right -> enter submenu of this item + if (which_press >= 0 && which_press < menuitems.size()) { + Menu *submenu = menuitems[which_press]->submenu(); + if (parent() && parent()->x() < x()) // parent on the left + enterParent(); + else if (submenu) // else parent on the right and submenu on the left + enterSubmenu(); } break; - case XK_Right: - if (which_press >= 0 && which_press < menuitems.size() && - menuitems[which_press]->submenu()) { - menuitems[which_press]->submenu()->grabInputFocus(); - menuitems[which_press]->submenu()->which_press = -1; - menuitems[which_press]->submenu()->nextItem(); + case XK_Right: // enter submenu or leave this menu and enter parent + // if we have a submenu we should determine if + // we should open it or close this and enter parent depending on which + // side the parent is. + // if parent on the left -> enter submenu of this item + // parent on the right -> leave this menu and enter parent + if (which_press >= 0 && which_press < menuitems.size()) { + Menu *submenu = menuitems[which_press]->submenu(); + if (parent() && parent()->x() > x()) // parent on the right + enterParent(); + else if (submenu) // else parent on the left and submenu on the right + enterSubmenu(); } break; - case XK_Escape: + case XK_Escape: // close menu hide(); break; case XK_Return: + // send fake button 1 click if (which_press >= 0 && which_press < menuitems.size()) { menuitems[which_press]->click(1, event.time); itemSelected(1, which_press); diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh index 1803241..82a253d 100644 --- a/src/FbTk/Menu.hh +++ b/src/FbTk/Menu.hh @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Menu.hh,v 1.16 2003/07/02 05:26:45 fluxgen Exp $ +// $Id: Menu.hh,v 1.17 2003/07/03 12:23:28 fluxgen Exp $ #ifndef FBTK_MENU_HH #define FBTK_MENU_HH @@ -89,6 +89,8 @@ public: void nextItem(); /// select previous item void prevItem(); + void enterSubmenu(); + void enterParent(); void disableTitle(); void enableTitle(); -- cgit v0.11.2