diff --git a/imgui.cpp b/imgui.cpp index bbe78dc54ad4..ae614f95d259 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -10242,7 +10242,6 @@ void ImGui::ErrorLogCallbackToDebugLog(void*, const char* fmt, ...) // Must be called during or before EndFrame(). // This is generally flawed as we are not necessarily End/Popping things in the right order. // FIXME: Can't recover from inside BeginTabItem/EndTabItem yet. -// FIXME: Can't recover from interleaved BeginTabBar/Begin void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data) { // PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations" @@ -10273,7 +10272,7 @@ void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, voi void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data) { ImGuiContext& g = *GImGui; - while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow)) + while (g.CurrentTable != NULL && g.CurrentTable->InnerWindow == g.CurrentWindow) { if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'\n", g.CurrentTable->OuterWindow->Name); EndTable(); @@ -10282,7 +10281,7 @@ void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, vo ImGuiWindow* window = g.CurrentWindow; ImGuiStackSizes* stack_sizes = &g.CurrentWindowStack.back().StackSizesOnBegin; IM_ASSERT(window != NULL); - while (g.CurrentTabBar != NULL) //-V1044 + while (g.CurrentTabBar != NULL && g.CurrentTabBar->Window == window) //-V1044 { if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'\n", window->Name); EndTabBar(); diff --git a/imgui_internal.h b/imgui_internal.h index 664648427989..013e29b25fed 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -2762,9 +2762,10 @@ struct ImGuiTabItem ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; } }; -// Storage for a tab bar (sizeof() 152 bytes) +// Storage for a tab bar (sizeof() 160 bytes) struct IMGUI_API ImGuiTabBar { + ImGuiWindow* Window; ImVector Tabs; ImGuiTabBarFlags Flags; ImGuiID ID; // Zero for tab-bars used by docking diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 91328d211fed..59a912dbdb82 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -9146,6 +9146,7 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG // Add to stack g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar)); g.CurrentTabBar = tab_bar; + tab_bar->Window = window; // Append with multiple BeginTabBar()/EndTabBar() pairs. tab_bar->BackupCursorPos = window->DC.CursorPos;