@@ -3690,7 +3690,10 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
3690
3690
KeepAliveID(g.ActiveId);
3691
3691
IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindowDockTree);
3692
3692
ImGuiWindow* moving_window = g.MovingWindow->RootWindowDockTree;
3693
- if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos))
3693
+
3694
+ // When a window stop being submitted while being dragged, it may will its viewport until next Begin()
3695
+ const bool window_disappared = (!moving_window->WasActive || moving_window->Viewport == NULL);
3696
+ if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos) && !window_disappared)
3694
3697
{
3695
3698
ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset;
3696
3699
if (moving_window->Pos.x != pos.x || moving_window->Pos.y != pos.y)
@@ -3707,17 +3710,20 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
3707
3710
}
3708
3711
else
3709
3712
{
3710
- // Try to merge the window back into the main viewport.
3711
- // This works because MouseViewport should be != MovingWindow->Viewport on release (as per code in UpdateViewports)
3712
- if (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)
3713
- UpdateTryMergeWindowIntoHostViewport(moving_window, g.MouseViewport);
3713
+ if (!window_disappared)
3714
+ {
3715
+ // Try to merge the window back into the main viewport.
3716
+ // This works because MouseViewport should be != MovingWindow->Viewport on release (as per code in UpdateViewports)
3717
+ if (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)
3718
+ UpdateTryMergeWindowIntoHostViewport(moving_window, g.MouseViewport);
3714
3719
3715
- // Restore the mouse viewport so that we don't hover the viewport _under_ the moved window during the frame we released the mouse button.
3716
- if (!IsDragDropPayloadBeingAccepted())
3717
- g.MouseViewport = moving_window->Viewport;
3720
+ // Restore the mouse viewport so that we don't hover the viewport _under_ the moved window during the frame we released the mouse button.
3721
+ if (!IsDragDropPayloadBeingAccepted())
3722
+ g.MouseViewport = moving_window->Viewport;
3718
3723
3719
- // Clear the NoInput window flag set by the Viewport system
3720
- moving_window->Viewport->Flags &= ~ImGuiViewportFlags_NoInputs; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL.
3724
+ // Clear the NoInput window flag set by the Viewport system
3725
+ moving_window->Viewport->Flags &= ~ImGuiViewportFlags_NoInputs; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL.
3726
+ }
3721
3727
3722
3728
g.MovingWindow = NULL;
3723
3729
ClearActiveID();
@@ -11855,7 +11861,8 @@ static void ImGui::UpdateViewportsNewFrame()
11855
11861
11856
11862
// Update mouse reference viewport
11857
11863
// (when moving a window we aim at its viewport, but this will be overwritten below if we go in drag and drop mode)
11858
- if (g.MovingWindow)
11864
+ // (MovingViewport->Viewport will be NULL in the rare situation where the window disappared while moving, set UpdateMouseMovingWindowNewFrame() for details)
11865
+ if (g.MovingWindow && g.MovingWindow->Viewport)
11859
11866
g.MouseViewport = g.MovingWindow->Viewport;
11860
11867
else
11861
11868
g.MouseViewport = g.MouseLastHoveredViewport;
0 commit comments