|
@@ -2369,7 +2369,6 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
|
|
|
ScrollbarSizes = ImVec2(0.0f, 0.0f);
|
|
|
ScrollbarX = ScrollbarY = false;
|
|
|
ViewportOwned = false;
|
|
|
- ViewportTryMerge = ViewportTrySplit = false;
|
|
|
Active = WasActive = false;
|
|
|
WriteAccessed = false;
|
|
|
Collapsed = false;
|
|
@@ -4762,10 +4761,6 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
|
|
|
if (size_target.x != FLT_MAX && (size_target.x != window->SizeFull.x || size_target.y != window->SizeFull.y))
|
|
|
{
|
|
|
window->SizeFull = size_target;
|
|
|
- if (window->ViewportOwned)
|
|
|
- window->ViewportTryMerge = true;
|
|
|
- else
|
|
|
- window->ViewportTrySplit = true;
|
|
|
MarkIniSettingsDirty(window);
|
|
|
}
|
|
|
if (pos_target.x != FLT_MAX)
|
|
@@ -5082,10 +5077,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
{
|
|
|
// Late create viewport, based on the assumption that with our calculations, the DPI will be known ahead (same as the DPI of the selection done in UpdateSelectWindowViewport)
|
|
|
//ImGuiViewport* old_viewport = window->Viewport;
|
|
|
- ImGuiViewportFlags viewport_flags = ImGuiViewportFlags_NoFocusOnAppearing;
|
|
|
- if ((window->Flags & ImGuiWindowFlags_NoMouseInputs) && (window->Flags & ImGuiWindowFlags_NoNavInputs))
|
|
|
- viewport_flags |= ImGuiViewportFlags_NoInputs;
|
|
|
- window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, viewport_flags);
|
|
|
+ window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_NoFocusOnAppearing);
|
|
|
|
|
|
// FIXME-DPI
|
|
|
//IM_ASSERT(old_viewport->DpiScale == window->Viewport->DpiScale); // FIXME-DPI: Something went wrong
|
|
@@ -5098,15 +5090,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
if (window->ViewportOwned)
|
|
|
{
|
|
|
if (window->Viewport->PlatformRequestMove)
|
|
|
- {
|
|
|
window->Pos = window->Viewport->Pos;
|
|
|
- window->ViewportTryMerge = true;
|
|
|
- }
|
|
|
if (window->Viewport->PlatformRequestResize)
|
|
|
- {
|
|
|
window->Size = window->SizeFull = window->Viewport->Size;
|
|
|
- window->ViewportTryMerge = true;
|
|
|
- }
|
|
|
|
|
|
// 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;
|
|
@@ -5127,7 +5113,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
{
|
|
|
// Fallback for "lost" window (e.g. a monitor disconnected): we move the window back over the main viewport
|
|
|
SetWindowPos(window, g.Viewports[0]->Pos + style.DisplayWindowPadding, ImGuiCond_Always);
|
|
|
- window->ViewportTryMerge = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -7385,11 +7370,22 @@ static void ImGui::UpdateViewports()
|
|
|
IM_ASSERT(g.MouseViewport != NULL);
|
|
|
}
|
|
|
|
|
|
+// FIXME: We should ideally refactor the system to call this everyframe (we currently don't)
|
|
|
ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const ImVec2& pos, const ImVec2& size, ImGuiViewportFlags flags)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
IM_ASSERT(id != 0);
|
|
|
|
|
|
+ if (window != NULL)
|
|
|
+ {
|
|
|
+ if (g.MovingWindow && g.MovingWindow->RootWindow == window)
|
|
|
+ flags |= ImGuiViewportFlags_NoInputs | ImGuiViewportFlags_NoFocusOnAppearing;
|
|
|
+ if ((window->Flags & ImGuiWindowFlags_NoMouseInputs) && (window->Flags & ImGuiWindowFlags_NoNavInputs))
|
|
|
+ flags |= ImGuiViewportFlags_NoInputs;
|
|
|
+ if (window->Flags & ImGuiWindowFlags_NoFocusOnAppearing)
|
|
|
+ flags |= ImGuiViewportFlags_NoFocusOnAppearing;
|
|
|
+ }
|
|
|
+
|
|
|
ImGuiViewportP* viewport = (ImGuiViewportP*)FindViewportByID(id);
|
|
|
if (viewport)
|
|
|
{
|
|
@@ -7407,9 +7403,6 @@ ImGuiViewportP* ImGui::AddUpdateViewport(ImGuiWindow* window, ImGuiID id, const
|
|
|
viewport->PlatformMonitor = FindPlatformMonitorForRect(viewport->GetRect());
|
|
|
g.Viewports.push_back(viewport);
|
|
|
|
|
|
- if (window && (window->Flags & ImGuiWindowFlags_NoFocusOnAppearing))
|
|
|
- flags |= ImGuiViewportFlags_NoFocusOnAppearing;
|
|
|
-
|
|
|
// We normally setup for all viewports in NewFrame() but here need to handle the mid-frame creation of a new viewport.
|
|
|
// We need to extend the fullscreen clip rect so the OverlayDrawList clip is correct for that the first frame
|
|
|
g.DrawListSharedData.ClipRectFullscreen.z = ImMax(g.DrawListSharedData.ClipRectFullscreen.z, viewport->Pos.x + viewport->Size.x);
|
|
@@ -7447,12 +7440,9 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // Merge into host viewports (after moving, resizing)
|
|
|
- if (window->ViewportOwned && window->ViewportTryMerge && g.ActiveId == 0)
|
|
|
- {
|
|
|
+ // Merge into host viewport
|
|
|
+ if (window->ViewportOwned && g.ActiveId == 0)
|
|
|
UpdateTryMergeWindowIntoHostViewport(window, g.Viewports[0]);
|
|
|
- window->ViewportTryMerge = false;
|
|
|
- }
|
|
|
window->ViewportOwned = false;
|
|
|
|
|
|
// Appearing popups reset their viewport so they can inherit again
|
|
@@ -7492,23 +7482,15 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
|
|
|
{
|
|
|
window->Viewport = g.MouseViewport;
|
|
|
}
|
|
|
- else if (g.MovingWindow && g.MovingWindow->RootWindow == window && IsMousePosValid())
|
|
|
- {
|
|
|
- // Transition to our own viewport when leaving our host boundaries + set the NoInputs flag (will be cleared in UpdateMouseMovingWindow() when releasing mouse)
|
|
|
- // If we are already in our own viewport, if need to set the NoInputs flag.
|
|
|
- // If we have no viewport (which happens when detaching a docked node) immediately create one.
|
|
|
- // We test for 'window->Viewport->Window == window' instead of 'window->ViewportOwned' because ViewportOwned is not valid during this function.
|
|
|
- bool has_viewport = (window->Viewport != NULL);
|
|
|
- bool own_viewport = has_viewport && (window->Viewport->Window == window);
|
|
|
- bool leave_host_viewport = has_viewport && !own_viewport && !window->Viewport->GetRect().Contains(window->Rect());
|
|
|
- bool move_from_own_viewport = has_viewport && own_viewport && !(window->Viewport->Flags & ImGuiViewportFlags_NoInputs);
|
|
|
- if (!has_viewport || leave_host_viewport || move_from_own_viewport)
|
|
|
- window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_NoFocusOnAppearing | ImGuiViewportFlags_NoInputs);
|
|
|
- }
|
|
|
else if (GetWindowAlwaysWantOwnViewport(window))
|
|
|
{
|
|
|
window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None);
|
|
|
}
|
|
|
+ else if (g.MovingWindow && g.MovingWindow->RootWindow == window && IsMousePosValid())
|
|
|
+ {
|
|
|
+ if (window->Viewport != NULL && window->Viewport->Window == window)
|
|
|
+ window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None);
|
|
|
+ }
|
|
|
|
|
|
// Mark window as allowed to protrude outside of its viewport and into the current monitor
|
|
|
// We need to take account of the possibility that mouse may become invalid.
|
|
@@ -7522,14 +7504,14 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
|
|
|
else
|
|
|
window->ViewportAllowPlatformMonitorExtend = window->Viewport->PlatformMonitor;
|
|
|
}
|
|
|
- if (window->ViewportTrySplit && window->ViewportAllowPlatformMonitorExtend < 0)
|
|
|
- window->ViewportAllowPlatformMonitorExtend = window->Viewport->PlatformMonitor;
|
|
|
- window->ViewportTrySplit = false;
|
|
|
|
|
|
// Fallback to default viewport
|
|
|
if (window->Viewport == NULL)
|
|
|
window->Viewport = main_viewport;
|
|
|
|
|
|
+ if (window->ViewportAllowPlatformMonitorExtend < 0)
|
|
|
+ window->ViewportAllowPlatformMonitorExtend = window->Viewport->PlatformMonitor;
|
|
|
+
|
|
|
// Update flags
|
|
|
window->ViewportOwned = (window == window->Viewport->Window);
|
|
|
|