From 64971a8866f8019a191e1bef0a50e561aa90c647 Mon Sep 17 00:00:00 2001 From: cfillion Date: Mon, 11 Mar 2024 20:49:27 -0400 Subject: [PATCH] update viewport flags from window flags every frame Fixes WindowFlags_NoInputs only being taken in consideration when the viewport is intially created. --- imgui.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 4ade8139a966..1ad41839e5af 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -14952,7 +14952,6 @@ static void ImGui::UpdateViewportsEndFrame() g.Viewports[0]->ClearRequestFlags(); // Clear main viewport flags because UpdatePlatformWindows() won't do it and may not even be called } -// FIXME: We should ideally refactor the system to call this every frame (we currently don't) ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const ImVec2& pos, const ImVec2& size, ImGuiViewportFlags flags) { ImGuiContext& g = *GImGui; @@ -14969,7 +14968,12 @@ ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const flags |= ImGuiViewportFlags_NoFocusOnAppearing; } - ImGuiViewportP* viewport = (ImGuiViewportP*)FindViewportByID(id); + ImGuiViewportP* viewport; + if (window && window->Viewport && window->Viewport->ID == id) + viewport = window->Viewport; + else + viewport = (ImGuiViewportP*)FindViewportByID(id); + if (viewport) { // Always update for main viewport as we are already pulling correct platform pos/size (see #4900) @@ -15111,18 +15115,14 @@ static void ImGui::WindowSelectViewport(ImGuiWindow* window) { window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None); } - else if (g.MovingWindow && g.MovingWindow->RootWindowDockTree == window && IsMousePosValid()) - { - if (window->Viewport != NULL && window->Viewport->Window == window) - window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None); - } - else + else if (window->Viewport && window->Viewport->Window == window) { + window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None); + // Merge into host viewport? // We cannot test window->ViewportOwned as it set lower in the function. // Testing (g.ActiveId == 0 || g.ActiveIdAllowOverlap) to avoid merging during a short-term widget interaction. Main intent was to avoid during resize (see #4212) - bool try_to_merge_into_host_viewport = (window->Viewport && window == window->Viewport->Window && (g.ActiveId == 0 || g.ActiveIdAllowOverlap)); - if (try_to_merge_into_host_viewport) + if (!g.MovingWindow || g.MovingWindow->RootWindowDockTree != window || !IsMousePosValid() || g.ActiveId == 0 || g.ActiveIdAllowOverlap) UpdateTryMergeWindowIntoHostViewports(window); }