[haiku-commits] r40142 - haiku/trunk/src/kits/interface

  • From: leavengood@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 7 Jan 2011 17:39:48 +0100 (CET)

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


Other related posts: