|
@@ -1010,7 +1010,8 @@ static void UpdateManualResize(ImGuiWindow* window, const ImVec2& si
|
|
|
// Viewports
|
|
|
const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHash("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter.
|
|
|
static ImGuiViewportP* AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const ImVec2& platform_pos, const ImVec2& size, ImGuiViewportFlags flags);
|
|
|
-static void UpdateViewports();
|
|
|
+static void UpdateViewportsNewFrame();
|
|
|
+static void UpdateViewportsEndFrame();
|
|
|
static void UpdateSelectWindowViewport(ImGuiWindow* window);
|
|
|
static bool UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImGuiViewportP* host_viewport);
|
|
|
static void SetCurrentViewport(ImGuiWindow* window, ImGuiViewportP* viewport);
|
|
@@ -3352,7 +3353,7 @@ void ImGui::NewFrame()
|
|
|
g.WindowsActiveCount = 0;
|
|
|
g.ConfigFlagsForFrame = g.IO.ConfigFlags;
|
|
|
|
|
|
- UpdateViewports();
|
|
|
+ UpdateViewportsNewFrame();
|
|
|
|
|
|
// Setup current font, and draw list shared data
|
|
|
// FIXME-VIEWPORT: the concept of a single ClipRectFullscreen is not ideal!
|
|
@@ -3846,24 +3847,8 @@ void ImGui::EndFrame()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Update user-facing viewport list
|
|
|
- g.PlatformIO.MainViewport = g.Viewports[0];
|
|
|
- g.PlatformIO.Viewports.resize(0);
|
|
|
- for (int i = 0; i < g.Viewports.Size; i++)
|
|
|
- {
|
|
|
- ImGuiViewportP* viewport = g.Viewports[i];
|
|
|
- viewport->LastPos = viewport->Pos;
|
|
|
- if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0.0f || viewport->Size.y <= 0.0f)
|
|
|
- continue;
|
|
|
- if (viewport->Window && !IsWindowActiveAndVisible(viewport->Window)) // Will be destroyed in UpdatePlatformWindows()
|
|
|
- continue;
|
|
|
- if (i > 0)
|
|
|
- IM_ASSERT(viewport->Window != NULL);
|
|
|
-
|
|
|
- // Add to user-facing list
|
|
|
- g.PlatformIO.Viewports.push_back(viewport);
|
|
|
- }
|
|
|
- g.Viewports[0]->ClearRequestFlags(); // Clear main viewport flags because UpdatePlatformWindows() won't do it and may not even be called
|
|
|
+ // Update user-facing viewport list (g.Viewports -> g.PlatformIO.Viewports after filtering out some)
|
|
|
+ UpdateViewportsEndFrame();
|
|
|
|
|
|
// Sort the window list so that all child windows are after their parent
|
|
|
// We cannot do that on FocusWindow() because childs may not exist yet
|
|
@@ -5178,16 +5163,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
SetCurrentWindow(window);
|
|
|
}
|
|
|
|
|
|
- // Synchronize viewport --> window in case the platform window has been moved or resized from the OS/WM
|
|
|
if (window->ViewportOwned)
|
|
|
{
|
|
|
+ // Synchronize viewport -> window in case the platform window has been moved or resized from the OS/WM
|
|
|
if (window->Viewport->PlatformRequestMove)
|
|
|
window->Pos = window->Viewport->Pos;
|
|
|
if (window->Viewport->PlatformRequestResize)
|
|
|
window->Size = window->SizeFull = window->Viewport->Size;
|
|
|
|
|
|
+ // Update common viewport flags
|
|
|
+ ImGuiViewportFlags viewport_flags = (window->Viewport->Flags) & ~(ImGuiViewportFlags_TopMost | ImGuiViewportFlags_NoTaskBarIcon | ImGuiViewportFlags_NoDecoration);
|
|
|
+ if (flags & ImGuiWindowFlags_Tooltip)
|
|
|
+ viewport_flags |= ImGuiViewportFlags_TopMost;
|
|
|
+ if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsNoTaskBarIcon) != 0 || (flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0)
|
|
|
+ viewport_flags |= ImGuiViewportFlags_NoTaskBarIcon;
|
|
|
+ if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsDecoration) == 0 || (flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0)
|
|
|
+ viewport_flags |= ImGuiViewportFlags_NoDecoration;
|
|
|
+
|
|
|
// We also tell the back-end that clearing the platform window won't be necessary, as our window is filling the viewport and we have disabled BgAlpha
|
|
|
- window->Viewport->Flags |= ImGuiViewportFlags_NoRendererClear;
|
|
|
+ viewport_flags |= ImGuiViewportFlags_NoRendererClear;
|
|
|
+ window->Viewport->Flags = viewport_flags;
|
|
|
}
|
|
|
|
|
|
// Clamp position so window stays visible within its viewport or monitor
|
|
@@ -7387,8 +7382,7 @@ static ImGuiViewportP* FindViewportHoveredFromPlatformWindowStack(const ImVec2 m
|
|
|
return best_candidate;
|
|
|
}
|
|
|
|
|
|
-// Called in NewFrame()
|
|
|
-static void ImGui::UpdateViewports()
|
|
|
+static void ImGui::UpdateViewportsNewFrame()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
IM_ASSERT(g.PlatformIO.Viewports.Size <= g.Viewports.Size);
|
|
@@ -7540,6 +7534,27 @@ static void ImGui::UpdateViewports()
|
|
|
IM_ASSERT(g.MouseViewport != NULL);
|
|
|
}
|
|
|
|
|
|
+// Update user-facing viewport list (g.Viewports -> g.PlatformIO.Viewports after filtering out some)
|
|
|
+static void ImGui::UpdateViewportsEndFrame()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ g.PlatformIO.MainViewport = g.Viewports[0];
|
|
|
+ g.PlatformIO.Viewports.resize(0);
|
|
|
+ for (int i = 0; i < g.Viewports.Size; i++)
|
|
|
+ {
|
|
|
+ ImGuiViewportP* viewport = g.Viewports[i];
|
|
|
+ viewport->LastPos = viewport->Pos;
|
|
|
+ if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0.0f || viewport->Size.y <= 0.0f)
|
|
|
+ continue;
|
|
|
+ if (viewport->Window && !IsWindowActiveAndVisible(viewport->Window))
|
|
|
+ continue;
|
|
|
+ if (i > 0)
|
|
|
+ IM_ASSERT(viewport->Window != NULL);
|
|
|
+ g.PlatformIO.Viewports.push_back(viewport);
|
|
|
+ }
|
|
|
+ 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)
|
|
|
{
|
|
@@ -7734,19 +7749,6 @@ void ImGui::UpdatePlatformWindows()
|
|
|
if (viewport->LastFrameActive < g.FrameCount || viewport->Size.x <= 0 || viewport->Size.y <= 0)
|
|
|
continue;
|
|
|
|
|
|
- // Update common viewport flags for owned viewports
|
|
|
- if (ImGuiWindow* window = viewport->Window)
|
|
|
- {
|
|
|
- ImGuiViewportFlags flags = viewport->Flags & ~(ImGuiViewportFlags_TopMost | ImGuiViewportFlags_NoTaskBarIcon | ImGuiViewportFlags_NoDecoration);
|
|
|
- if (window->Flags & ImGuiWindowFlags_Tooltip)
|
|
|
- flags |= ImGuiViewportFlags_TopMost;
|
|
|
- if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsNoTaskBarIcon) != 0 || (window->Flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0)
|
|
|
- flags |= ImGuiViewportFlags_NoTaskBarIcon;
|
|
|
- if ((g.IO.ConfigFlags & ImGuiConfigFlags_ViewportsDecoration) == 0 || (window->Flags & (ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) != 0)
|
|
|
- flags |= ImGuiViewportFlags_NoDecoration;
|
|
|
- viewport->Flags = flags;
|
|
|
- }
|
|
|
-
|
|
|
// Create window
|
|
|
bool is_new_platform_window = (viewport->PlatformWindowCreated == false);
|
|
|
if (is_new_platform_window)
|