@ -3690,7 +3690,10 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
KeepAliveID ( g . ActiveId ) ;
KeepAliveID ( g . ActiveId ) ;
IM_ASSERT ( g . MovingWindow & & g . MovingWindow - > RootWindowDockTree ) ;
IM_ASSERT ( g . MovingWindow & & g . MovingWindow - > RootWindowDockTree ) ;
ImGuiWindow * moving_window = 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 ;
ImVec2 pos = g . IO . MousePos - g . ActiveIdClickOffset ;
if ( moving_window - > Pos . x ! = pos . x | | moving_window - > Pos . y ! = pos . y )
if ( moving_window - > Pos . x ! = pos . x | | moving_window - > Pos . y ! = pos . y )
@ -3706,6 +3709,8 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
FocusWindow ( g . MovingWindow ) ;
FocusWindow ( g . MovingWindow ) ;
}
}
else
else
{
if ( ! window_disappared )
{
{
// Try to merge the window back into the main viewport.
// 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)
// This works because MouseViewport should be != MovingWindow->Viewport on release (as per code in UpdateViewports)
@ -3718,6 +3723,7 @@ void ImGui::UpdateMouseMovingWindowNewFrame()
// Clear the NoInput window flag set by the Viewport system
// 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.
moving_window - > Viewport - > Flags & = ~ ImGuiViewportFlags_NoInputs ; // FIXME-VIEWPORT: Test engine managed to crash here because Viewport was NULL.
}
g . MovingWindow = NULL ;
g . MovingWindow = NULL ;
ClearActiveID ( ) ;
ClearActiveID ( ) ;
@ -11855,7 +11861,8 @@ static void ImGui::UpdateViewportsNewFrame()
// Update mouse reference viewport
// 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)
// (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 ;
g . MouseViewport = g . MovingWindow - > Viewport ;
else
else
g . MouseViewport = g . MouseLastHoveredViewport ;
g . MouseViewport = g . MouseLastHoveredViewport ;