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.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40142 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ryan Leavengood 2011-01-07 16:39:48 +00:00
parent cb7becc01d
commit 77b7e18ab7
2 changed files with 15 additions and 15 deletions

View File

@ -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<BMenuWindow*>(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)

View File

@ -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