@ -1056,7 +1056,6 @@ static void RenderWindowDecorations(ImGuiWindow* window, const ImRec
static void RenderWindowTitleBarContents ( ImGuiWindow * window , const ImRect & title_bar_rect , const char * name , bool * p_open ) ;
static void RenderWindowTitleBarContents ( ImGuiWindow * window , const ImRect & title_bar_rect , const char * name , bool * p_open ) ;
static void RenderDimmedBackgroundBehindWindow ( ImGuiWindow * window , ImU32 col ) ;
static void RenderDimmedBackgroundBehindWindow ( ImGuiWindow * window , ImU32 col ) ;
static void RenderDimmedBackgrounds ( ) ;
static void RenderDimmedBackgrounds ( ) ;
static ImGuiWindow * FindBlockingModal ( ImGuiWindow * window ) ;
// Viewports
// Viewports
static void UpdateViewportsNewFrame ( ) ;
static void UpdateViewportsNewFrame ( ) ;
@ -3911,7 +3910,7 @@ bool ImGui::IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flag
// Inhibit hover unless the window is within the stack of our modal/popup
// Inhibit hover unless the window is within the stack of our modal/popup
if ( want_inhibit )
if ( want_inhibit )
if ( ! ImGui : : I sWindowWithinBeginStackOf ( window - > RootWindow , focused_root_window ) )
if ( ! IsWindowWithinBeginStackOf ( window - > RootWindow , focused_root_window ) )
return false ;
return false ;
}
}
return true ;
return true ;
@ -4296,10 +4295,10 @@ void ImGui::UpdateMouseMovingWindowEndFrame()
if ( g . HoveredIdDisabled )
if ( g . HoveredIdDisabled )
g . MovingWindow = NULL ;
g . MovingWindow = NULL ;
}
}
else if ( root_window = = NULL & & g . NavWindow ! = NULL & & GetTopMostPopupModal ( ) = = NULL )
else if ( root_window = = NULL & & g . NavWindow ! = NULL )
{
{
// Clicking on void disable focus
// Clicking on void disable focus
FocusWindow ( NULL ) ;
FocusWindow ( NULL , ImGuiFocusRequestFlags_UnlessBelowModal ) ;
}
}
}
}
@ -4624,7 +4623,7 @@ void ImGui::NewFrame()
// Closing the focused window restore focus to the first active root window in descending z-order
// Closing the focused window restore focus to the first active root window in descending z-order
if ( g . NavWindow & & ! g . NavWindow - > WasActive )
if ( g . NavWindow & & ! g . NavWindow - > WasActive )
FocusTopMostWindowUnderOne ( NULL , NULL , NULL ) ;
FocusTopMostWindowUnderOne ( NULL , NULL , NULL , ImGuiFocusRequestFlags_None ) ;
// No window should be open at the beginning of the frame.
// No window should be open at the beginning of the frame.
// But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.
// But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.
@ -6077,7 +6076,7 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
// - Window // .. returns Modal2
// - Window // .. returns Modal2
// - Window // .. returns Modal2
// - Window // .. returns Modal2
// - Modal2 // .. returns Modal2
// - Modal2 // .. returns Modal2
static ImGuiWindow * ImGui : : FindBlockingModal ( ImGuiWindow * window )
ImGuiWindow * ImGui : : FindBlockingModal ( ImGuiWindow * window )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
if ( g . OpenPopupStack . Size < = 0 )
if ( g . OpenPopupStack . Size < = 0 )
@ -6091,6 +6090,8 @@ static ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window)
continue ;
continue ;
if ( ! popup_window - > Active & & ! popup_window - > WasActive ) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows.
if ( ! popup_window - > Active & & ! popup_window - > WasActive ) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows.
continue ;
continue ;
if ( window = = NULL ) // FindBlockingModal(NULL) test for if FocusWindow(NULL) is naturally possible via a mouse click.
return popup_window ;
if ( IsWindowWithinBeginStackOf ( window , popup_window ) ) // Window is rendered over last modal, no render order change needed.
if ( IsWindowWithinBeginStackOf ( window , popup_window ) ) // Window is rendered over last modal, no render order change needed.
break ;
break ;
for ( ImGuiWindow * parent = popup_window - > ParentWindowInBeginStack - > RootWindow ; parent ! = NULL ; parent = parent - > ParentWindowInBeginStack - > RootWindow )
for ( ImGuiWindow * parent = popup_window - > ParentWindowInBeginStack - > RootWindow ; parent ! = NULL ; parent = parent - > ParentWindowInBeginStack - > RootWindow )
@ -6928,10 +6929,19 @@ int ImGui::FindWindowDisplayIndex(ImGuiWindow* window)
}
}
// Moving window to front of display and set focus (which happens to be back of our sorted list)
// Moving window to front of display and set focus (which happens to be back of our sorted list)
void ImGui : : FocusWindow ( ImGuiWindow * window )
void ImGui : : FocusWindow ( ImGuiWindow * window , ImGuiFocusRequestFlags flags )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
// Modal check?
if ( flags & ImGuiFocusRequestFlags_UnlessBelowModal )
if ( ImGuiWindow * blocking_modal = FindBlockingModal ( window ) )
{
IMGUI_DEBUG_LOG_FOCUS ( " [focus] FocusWindow( \" %s \" , UnlessBelowModal): prevented by \" %s \" . \n " , window ? window - > Name : " <NULL> " , blocking_modal - > Name ) ;
return ;
}
// Apply focus
if ( g . NavWindow ! = window )
if ( g . NavWindow ! = window )
{
{
SetNavWindow ( window ) ;
SetNavWindow ( window ) ;
@ -6968,7 +6978,7 @@ void ImGui::FocusWindow(ImGuiWindow* window)
BringWindowToDisplayFront ( display_front_window ) ;
BringWindowToDisplayFront ( display_front_window ) ;
}
}
void ImGui : : FocusTopMostWindowUnderOne ( ImGuiWindow * under_this_window , ImGuiWindow * ignore_window , ImGuiViewport * filter_viewport )
void ImGui : : FocusTopMostWindowUnderOne ( ImGuiWindow * under_this_window , ImGuiWindow * ignore_window , ImGuiViewport * filter_viewport , ImGuiFocusRequestFlags flags )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
IM_UNUSED ( filter_viewport ) ; // Unused in master branch.
IM_UNUSED ( filter_viewport ) ; // Unused in master branch.
@ -6994,11 +7004,11 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind
if ( ( window - > Flags & ( ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs ) ) ! = ( ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs ) )
if ( ( window - > Flags & ( ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs ) ) ! = ( ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs ) )
{
{
ImGuiWindow * focus_window = NavRestoreLastChildNavWindow ( window ) ;
ImGuiWindow * focus_window = NavRestoreLastChildNavWindow ( window ) ;
FocusWindow ( focus_window ) ;
FocusWindow ( focus_window , flags ) ;
return ;
return ;
}
}
}
}
FocusWindow ( NULL ) ;
FocusWindow ( NULL , flags ) ;
}
}
// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only.
// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only.
@ -10101,6 +10111,7 @@ bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags)
return IsPopupOpen ( id , popup_flags ) ;
return IsPopupOpen ( id , popup_flags ) ;
}
}
// FIXME: In principle we should converge toward replacing calls to GetTopMostPopupModal() + IsWindowWithinBeginStackOf() with calls to FindBlockingModal()
ImGuiWindow * ImGui : : GetTopMostPopupModal ( )
ImGuiWindow * ImGui : : GetTopMostPopupModal ( )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
@ -10263,7 +10274,7 @@ void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_
if ( focus_window & & ! focus_window - > WasActive & & popup_window )
if ( focus_window & & ! focus_window - > WasActive & & popup_window )
{
{
// Fallback
// Fallback
FocusTopMostWindowUnderOne ( popup_window , NULL , NULL ) ;
FocusTopMostWindowUnderOne ( popup_window , NULL , NULL , ImGuiFocusRequestFlags_None ) ;
}
}
else
else
{
{