diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 9a074cc411..c5f6ecdd13 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -1563,20 +1563,9 @@ 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(); } @@ -1589,7 +1578,7 @@ BMenu::_Track(int* action, long start) break; BMenuWindow* window = static_cast(Window()); - screenLocation = ConvertToScreen(location); + BPoint screenLocation = ConvertToScreen(location); if (window->CheckForScrolling(screenLocation)) { UnlockLooper(); continue; @@ -1601,8 +1590,7 @@ 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); - if (!openedUnderMouse) - item = _HitTestItems(location, B_ORIGIN); + item = _HitTestItems(location, B_ORIGIN); if (overSub) { navAreaRectAbove = BRect(); navAreaRectBelow = BRect(); @@ -1682,7 +1670,6 @@ BMenu::_Track(int* action, long start) releasedOnce = true; location = newLocation; buttons = newButtons; - openedUnderMouse = false; } if (releasedOnce) diff --git a/src/kits/interface/PopUpMenu.cpp b/src/kits/interface/PopUpMenu.cpp index b8bc6d2a77..527d0e23cc 100644 --- a/src/kits/interface/PopUpMenu.cpp +++ b/src/kits/interface/PopUpMenu.cpp @@ -317,6 +317,19 @@ BMenuItem * BPopUpMenu::_Go(BPoint where, bool autoInvoke, bool startOpened, BRect *_specialRect, bool async) { + // Force start opened. This is just better behavior. + startOpened = true; + + BRect clickToOpenRect; + + // If no click to open rect was provided make one around the opening + // point. + if (startOpened && _specialRect == NULL) { + clickToOpenRect.Set(where.x, where.y, where.x, where.y); + clickToOpenRect.InsetBy(-2, -2); + _specialRect = &clickToOpenRect; + } + if (fTrackThread >= B_OK) { // we already have an active menu, wait for it to go away before // spawning another