mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Viewports: Fixed a crash while a window owning its viewport disappear while being dragged.
t would manifest when e.g. reconfiguring dock nodes while dragging.
This commit is contained in:
		
							
								
								
									
										29
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -3690,7 +3690,10 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
 | 
			
		||||
        KeepAliveID(g.ActiveId);
 | 
			
		||||
        IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindowDockTree);
 | 
			
		||||
        ImGuiWindow* moving_window = g.MovingWindow->RootWindowDockTree;
 | 
			
		||||
        if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos))
 | 
			
		||||
 | 
			
		||||
        // When a window stop being submitted while being dragged, it may will its viewport until next Begin()
 | 
			
		||||
        const bool window_disappared = (!moving_window->WasActive || moving_window->Viewport == NULL);
 | 
			
		||||
        if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos) && !window_disappared)
 | 
			
		||||
        {
 | 
			
		||||
            ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset;
 | 
			
		||||
            if (moving_window->Pos.x != pos.x || moving_window->Pos.y != pos.y)
 | 
			
		||||
@@ -3707,17 +3710,20 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            // Try to merge the window back into the main viewport.
 | 
			
		||||
            // This works because MouseViewport should be != MovingWindow->Viewport on release (as per code in UpdateViewports)
 | 
			
		||||
            if (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)
 | 
			
		||||
                UpdateTryMergeWindowIntoHostViewport(moving_window, g.MouseViewport);
 | 
			
		||||
            if (!window_disappared)
 | 
			
		||||
            {
 | 
			
		||||
                // Try to merge the window back into the main viewport.
 | 
			
		||||
                // This works because MouseViewport should be != MovingWindow->Viewport on release (as per code in UpdateViewports)
 | 
			
		||||
                if (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)
 | 
			
		||||
                    UpdateTryMergeWindowIntoHostViewport(moving_window, g.MouseViewport);
 | 
			
		||||
 | 
			
		||||
            // Restore the mouse viewport so that we don't hover the viewport _under_ the moved window during the frame we released the mouse button.
 | 
			
		||||
            if (!IsDragDropPayloadBeingAccepted())
 | 
			
		||||
                g.MouseViewport = moving_window->Viewport;
 | 
			
		||||
                // Restore the mouse viewport so that we don't hover the viewport _under_ the moved window during the frame we released the mouse button.
 | 
			
		||||
                if (!IsDragDropPayloadBeingAccepted())
 | 
			
		||||
                    g.MouseViewport = moving_window->Viewport;
 | 
			
		||||
 | 
			
		||||
            // Clear the NoInput window flag set by the Viewport system
 | 
			
		||||
            moving_window->Viewport->Flags &= ~ImGuiViewportFlags_NoInputs; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL.
 | 
			
		||||
                // Clear the NoInput window flag set by the Viewport system
 | 
			
		||||
                moving_window->Viewport->Flags &= ~ImGuiViewportFlags_NoInputs; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL.
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            g.MovingWindow = NULL;
 | 
			
		||||
            ClearActiveID();
 | 
			
		||||
@@ -11855,7 +11861,8 @@ static void ImGui::UpdateViewportsNewFrame()
 | 
			
		||||
 | 
			
		||||
    // Update mouse reference viewport
 | 
			
		||||
    // (when moving a window we aim at its viewport, but this will be overwritten below if we go in drag and drop mode)
 | 
			
		||||
    if (g.MovingWindow)
 | 
			
		||||
    // (MovingViewport->Viewport will be NULL in the rare situation where the window disappared while moving, set UpdateMouseMovingWindowNewFrame() for details)
 | 
			
		||||
    if (g.MovingWindow && g.MovingWindow->Viewport)
 | 
			
		||||
        g.MouseViewport = g.MovingWindow->Viewport;
 | 
			
		||||
    else
 | 
			
		||||
        g.MouseViewport = g.MouseLastHoveredViewport;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user