Browse Source

Menus, Popups: Experimental fix for issue where clicking on an open BeginMenu() item called from a window which is neither a popup neither a menu used to incorrectly close and reopen the menu. (#5775)

This works by moving the ClosePopupsOverWindow() in FocusWindow() in the if() block which luckily solves our problem.
In our test suite I couldn't find situation where this had side-effect others than BeginMenu() using the 'menuset_is_open' trick.
It's difficult to tell if other side-effects are possible: a window being already focused should mean it doesn't have popups overit.
Effectively this means that clicking e.g. on the BeginMenu() item to close a menu in a menu-bar now relies on BeginMenu() logic for the closure rather than FocusWindow() triggerd by button behavior.
ocornut 2 years ago
parent
commit
08752b372e
2 changed files with 6 additions and 3 deletions
  1. 3 0
      docs/CHANGELOG.txt
  2. 3 3
      imgui.cpp

+ 3 - 0
docs/CHANGELOG.txt

@@ -145,6 +145,9 @@ Other Changes:
 - Menus: Fixed gaps in closing logic which would make child-menu erroneously close when crossing
   the gap between a menu item inside a window and a child-menu in a secondary viewport. (#5614)
 - Menus: Fixed using IsItemHovered()/IsItemClicked() on BeginMenu(). (#5775)
+- Menus, Popups: Experimental fix for issue where clicking on an open BeginMenu() item called from
+  a window which is neither a popup neither a menu used to incorrectly close and reopen the menu.
+  (the fix may have side-effect so labelld as experimental as we may need to revert) (#5775)
 - Menus, Nav: Fixed keyboard/gamepad navigation occasionally erroneously landing on menu-item
   in parent window when the parent is not a popup. (#5730)
 - Menus, Nav: Fixed not being able to close a menu with Left arrow when parent is not a popup. (#5730)

+ 3 - 3
imgui.cpp

@@ -7025,10 +7025,10 @@ void ImGui::FocusWindow(ImGuiWindow* window)
         g.NavLayer = ImGuiNavLayer_Main;
         g.NavFocusScopeId = 0;
         g.NavIdIsAlive = false;
-    }
 
-    // Close popups if any
-    ClosePopupsOverWindow(window, false);
+        // Close popups if any
+        ClosePopupsOverWindow(window, false);
+    }
 
     // Move the root window to the top of the pile
     IM_ASSERT(window == NULL || window->RootWindow != NULL);