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:
parent
cb7becc01d
commit
77b7e18ab7
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user