1
0
mirror of https://github.com/ocornut/imgui.git synced 2025-02-02 12:37:20 +01:00

Error Handling: Recovery from missing EndMenuBar() call. (#1651)

This commit is contained in:
ocornut 2025-01-30 14:30:14 +01:00
parent c0308da665
commit fa178f4235
3 changed files with 11 additions and 4 deletions

View File

@ -71,6 +71,7 @@ Other changes:
scrollbar when using thick border sizes. (#8267, #7887) scrollbar when using thick border sizes. (#8267, #7887)
- Windows: Fixed IsItemXXXX() functions not working on append-version of EndChild(). (#8350) - Windows: Fixed IsItemXXXX() functions not working on append-version of EndChild(). (#8350)
Also made some of the fields accessible after BeginChild() to match Begin() logic. Also made some of the fields accessible after BeginChild() to match Begin() logic.
- Error Handling: Recovery from missing EndMenuBar() call. (#1651)
- Tables, Menus: Fixed using BeginTable() in menu layer (any menu bar). (#8355) - Tables, Menus: Fixed using BeginTable() in menu layer (any menu bar). (#8355)
It previously overrode the current layer back to main layer, which caused an issue It previously overrode the current layer back to main layer, which caused an issue
with MainMenuBar attempted to release focus when leaving the menu layer. with MainMenuBar attempted to release focus when leaving the menu layer.

View File

@ -10301,6 +10301,11 @@ void ImGui::ErrorRecoveryTryToRecoverWindowState(const ImGuiErrorRecoveryStat
IM_ASSERT_USER_ERROR(0, "Missing EndMultiSelect()"); IM_ASSERT_USER_ERROR(0, "Missing EndMultiSelect()");
EndMultiSelect(); EndMultiSelect();
} }
if (window->DC.MenuBarAppending) //-V1044
{
IM_ASSERT_USER_ERROR(0, "Missing EndMenuBar()");
EndMenuBar();
}
while (window->DC.TreeDepth > state_in->SizeOfTreeStack) //-V1044 while (window->DC.TreeDepth > state_in->SizeOfTreeStack) //-V1044
{ {
IM_ASSERT_USER_ERROR(0, "Missing TreePop()"); IM_ASSERT_USER_ERROR(0, "Missing TreePop()");

View File

@ -8657,6 +8657,10 @@ void ImGui::EndMenuBar()
return; return;
ImGuiContext& g = *GImGui; ImGuiContext& g = *GImGui;
IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'"
IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar);
IM_ASSERT(window->DC.MenuBarAppending);
// Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings. // Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings.
if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu))
{ {
@ -8683,9 +8687,6 @@ void ImGui::EndMenuBar()
} }
} }
IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'"
IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar);
IM_ASSERT(window->DC.MenuBarAppending);
PopClipRect(); PopClipRect();
PopID(); PopID();
window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos.
@ -8764,11 +8765,11 @@ bool ImGui::BeginMainMenuBar()
void ImGui::EndMainMenuBar() void ImGui::EndMainMenuBar()
{ {
ImGuiContext& g = *GImGui;
EndMenuBar(); EndMenuBar();
// When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
// FIXME: With this strategy we won't be able to restore a NULL focus. // FIXME: With this strategy we won't be able to restore a NULL focus.
ImGuiContext& g = *GImGui;
if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest && g.ActiveId == 0) if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest && g.ActiveId == 0)
FocusTopMostWindowUnderOne(g.NavWindow, NULL, NULL, ImGuiFocusRequestFlags_UnlessBelowModal | ImGuiFocusRequestFlags_RestoreFocusedChild); FocusTopMostWindowUnderOne(g.NavWindow, NULL, NULL, ImGuiFocusRequestFlags_UnlessBelowModal | ImGuiFocusRequestFlags_RestoreFocusedChild);