Author: leavengood Date: 2011-01-07 17:39:48 +0100 (Fri, 07 Jan 2011) New Revision: 40142 Changeset: http://dev.haiku-os.org/changeset/40142 Ticket: http://dev.haiku-os.org/ticket/7022 Modified: haiku/trunk/src/kits/interface/Menu.cpp haiku/trunk/src/kits/interface/PopUpMenu.cpp Log: Revert my hack from r40132 and just go ahead and fix our pop-up menu behavior by forcing openAnyway and creating a clickToOpen rect if there is not one. Should fix #7022 and maybe others. Partially based on the patch from #7022 and Travis Reed's patch from the mailing list discussion in December. Modified: haiku/trunk/src/kits/interface/Menu.cpp =================================================================== --- haiku/trunk/src/kits/interface/Menu.cpp 2011-01-07 16:37:17 UTC (rev 40141) +++ haiku/trunk/src/kits/interface/Menu.cpp 2011-01-07 16:39:48 UTC (rev 40142) @@ -1563,20 +1563,9 @@ 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 @@ break; BMenuWindow* window = static_cast<BMenuWindow*>(Window()); - screenLocation = ConvertToScreen(location); + BPoint screenLocation = ConvertToScreen(location); if (window->CheckForScrolling(screenLocation)) { UnlockLooper(); continue; @@ -1601,8 +1590,7 @@ // 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 @@ releasedOnce = true; location = newLocation; buttons = newButtons; - openedUnderMouse = false; } if (releasedOnce) Modified: haiku/trunk/src/kits/interface/PopUpMenu.cpp =================================================================== --- haiku/trunk/src/kits/interface/PopUpMenu.cpp 2011-01-07 16:37:17 UTC (rev 40141) +++ haiku/trunk/src/kits/interface/PopUpMenu.cpp 2011-01-07 16:39:48 UTC (rev 40142) @@ -317,6 +317,19 @@ 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