diff --git a/src/kits/interface/PopUpMenu.cpp b/src/kits/interface/PopUpMenu.cpp index 527d0e23cc..c9e5cf43d5 100644 --- a/src/kits/interface/PopUpMenu.cpp +++ b/src/kits/interface/PopUpMenu.cpp @@ -317,18 +317,6 @@ 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 @@ -430,10 +418,19 @@ BPopUpMenu::_StartTrack(BPoint where, bool autoInvoke, bool startOpened, BRect * // called by BMenu::Track() fUseWhere = true; + // Determine when mouse-down-up will be taken as a 'press', rather than a 'click' + bigtime_t clickMaxTime = 0; + get_click_speed(&clickMaxTime); + clickMaxTime += system_time(); + // Show the menu's window Show(); snooze(50000); BMenuItem *result = Track(startOpened, _specialRect); + + // If it was a click, keep the menu open and tracking + if (system_time() <= clickMaxTime) + result = Track(true, _specialRect); if (result != NULL && autoInvoke) result->Invoke();