diff --git a/imgui.cpp b/imgui.cpp index c34f721c92a8..b7e4a8e45852 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -5547,15 +5547,16 @@ static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settin static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags) { ImGuiContext& g = *GImGui; - const ImGuiWindowFlags old_flags = window->Flags; - const bool child_flag_changed = (new_flags & ImGuiWindowFlags_ChildWindow) != (old_flags & ImGuiWindowFlags_ChildWindow); - if ((just_created || child_flag_changed) && !(new_flags & ImGuiWindowFlags_ChildWindow)) + const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0; + const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild; + if ((just_created || child_flag_changed) && !new_is_explicit_child) { + IM_ASSERT(!g.WindowsFocusOrder.contains(window)); g.WindowsFocusOrder.push_back(window); window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1); } - else if (child_flag_changed && (new_flags & ImGuiWindowFlags_ChildWindow)) + else if (!just_created && child_flag_changed && new_is_explicit_child) { IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window); for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++) @@ -5563,6 +5564,7 @@ static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder); window->FocusOrder = -1; } + window->IsExplicitChild = new_is_explicit_child; } static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) diff --git a/imgui_internal.h b/imgui_internal.h index f64d3bf2263e..e889acf12b5a 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -2189,6 +2189,7 @@ struct IMGUI_API ImGuiWindow bool Appearing; // Set during the frame where the window is appearing (or re-appearing) bool Hidden; // Do not display (== HiddenFrames*** > 0) bool IsFallbackWindow; // Set on the "Debug##Default" window. + bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() bool HasCloseButton; // Set when the window has a close button (p_open != NULL) signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)