Viewport: Fixed a situation when the implicit Debug window can hold on a zombie viewport which platform window is not properly destroyed. (#1542)

This commit is contained in:
omar 2018-07-22 16:23:35 +02:00
parent 23b67e6ff5
commit 74077491ce

View File

@ -3955,29 +3955,29 @@ void ImGui::UpdatePlatformWindows()
{ {
ImGuiViewportP* viewport = g.Viewports[i]; ImGuiViewportP* viewport = g.Viewports[i];
viewport->LastPos = viewport->Pos; viewport->LastPos = viewport->Pos;
if (viewport->LastFrameActive < g.FrameCount)
// Destroy platform window if the viewport hasn't been submitted or if it is hosting a hidden window (the implicit Debug window will be registered its viewport then be disabled)
bool destroy_platform_window = false;
destroy_platform_window |= (viewport->LastFrameActive < g.FrameCount - 1);
destroy_platform_window |= (viewport->Window && !IsWindowActiveAndVisible(viewport->Window));
if (destroy_platform_window)
{ {
if (viewport->LastFrameActive < g.FrameCount - 1) if (viewport->CreatedPlatformWindow && g.PlatformIO.Renderer_DestroyWindow)
{
if (g.PlatformIO.Renderer_DestroyWindow)
g.PlatformIO.Renderer_DestroyWindow(viewport); g.PlatformIO.Renderer_DestroyWindow(viewport);
if (g.PlatformIO.Platform_DestroyWindow) if (viewport->CreatedPlatformWindow && g.PlatformIO.Platform_DestroyWindow)
g.PlatformIO.Platform_DestroyWindow(viewport); g.PlatformIO.Platform_DestroyWindow(viewport);
viewport->CreatedPlatformWindow = false; viewport->CreatedPlatformWindow = false;
IM_ASSERT(viewport->RendererUserData == NULL); IM_ASSERT(viewport->RendererUserData == NULL);
IM_ASSERT(viewport->PlatformUserData == NULL && viewport->PlatformHandle == NULL); IM_ASSERT(viewport->PlatformUserData == NULL && viewport->PlatformHandle == NULL);
}
continue; continue;
} }
if (viewport->LastFrameActive < g.FrameCount)
continue;
// New windows that appears directly in a new viewport won't always have a size on their frame // New windows that appears directly in a new viewport won't always have a size on their frame
if (viewport->Size.x <= 0 || viewport->Size.y <= 0) if (viewport->Size.x <= 0 || viewport->Size.y <= 0)
continue; continue;
// Ignore viewport that are hosting a hidden window (also check the Active flag, as the implicit Debug window will be registering its viewport then immediately disabled)
if (viewport->Window && !IsWindowActiveAndVisible(viewport->Window))
continue;
// Update viewport flags // Update viewport flags
if (viewport->Window != NULL) if (viewport->Window != NULL)
{ {