@ -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 ;