From f8f64f9a2e4473686b07a3441456281eaf11fa7a Mon Sep 17 00:00:00 2001 From: Ryan Leavengood Date: Thu, 6 Jan 2011 07:14:47 +0000 Subject: [PATCH] Make pop-up menu behavior more like BeOS (though this still is not ideal): If the menu opens right under the mouse cursor, do not select or invoke an item until the mouse is moved. Since this seems to break normal menu bars, I added the check for fSuper. As a (bad?) side effect BMenuField menus also need mouse movement before something is selected. If anything else is broken, let me know. I'm committing this because it does remove some bad behavior in pop up menus (unintentionally selecting items.) We may also want to force the openAnyway behavior as discussed on the mailing list in December. In general though the menu handling code really should be redesigned/refactored. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40132 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/Menu.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index c5f6ecdd13..9a074cc411 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -1563,9 +1563,20 @@ BMenu::_Track(int* action, long start) fSuper->fState = MENU_STATE_TRACKING_SUBMENU; BPoint location; + BPoint screenLocation; uint32 buttons = 0; + bool openedUnderMouse = false; if (LockLooper()) { GetMouse(&location, &buttons); + + // If the menu has opened underneath the mouse we will not invoke or return + // the selected item unless the mouse is moved. This only applies if there + // is no parent menu. + if (fSuper == NULL) { + screenLocation = ConvertToScreen(location); + openedUnderMouse = Window()->Frame().Contains(screenLocation); + } + UnlockLooper(); } @@ -1578,7 +1589,7 @@ BMenu::_Track(int* action, long start) break; BMenuWindow* window = static_cast(Window()); - BPoint screenLocation = ConvertToScreen(location); + screenLocation = ConvertToScreen(location); if (window->CheckForScrolling(screenLocation)) { UnlockLooper(); continue; @@ -1590,7 +1601,8 @@ BMenu::_Track(int* action, long start) // then if the menu is inside this menu, // then if it's over a super menu. bool overSub = _OverSubmenu(fSelected, screenLocation); - item = _HitTestItems(location, B_ORIGIN); + if (!openedUnderMouse) + item = _HitTestItems(location, B_ORIGIN); if (overSub) { navAreaRectAbove = BRect(); navAreaRectBelow = BRect(); @@ -1670,6 +1682,7 @@ BMenu::_Track(int* action, long start) releasedOnce = true; location = newLocation; buttons = newButtons; + openedUnderMouse = false; } if (releasedOnce)