Focus: merge extra param for FocusTopMostWindowUnderOne() from docking branch to facilitate merge.
diff --git a/imgui.cpp b/imgui.cpp
index 4687f95..c892a00 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -4624,7 +4624,7 @@
// Closing the focused window restore focus to the first active root window in descending z-order
if (g.NavWindow && !g.NavWindow->WasActive)
- FocusTopMostWindowUnderOne(NULL, NULL);
+ FocusTopMostWindowUnderOne(NULL, NULL, NULL);
// 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.
@@ -6968,9 +6968,10 @@
BringWindowToDisplayFront(display_front_window);
}
-void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window)
+void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport)
{
ImGuiContext& g = *GImGui;
+ IM_UNUSED(filter_viewport); // Unused in master branch.
int start_idx = g.WindowsFocusOrder.Size - 1;
if (under_this_window != NULL)
{
@@ -6988,13 +6989,14 @@
// We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user.
ImGuiWindow* window = g.WindowsFocusOrder[i];
IM_ASSERT(window == window->RootWindow);
- if (window != ignore_window && window->WasActive)
- if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
- {
- ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
- FocusWindow(focus_window);
- return;
- }
+ if (window == ignore_window || !window->WasActive)
+ continue;
+ if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
+ {
+ ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
+ FocusWindow(focus_window);
+ return;
+ }
}
FocusWindow(NULL);
}
@@ -10261,7 +10263,7 @@
if (focus_window && !focus_window->WasActive && popup_window)
{
// Fallback
- FocusTopMostWindowUnderOne(popup_window, NULL);
+ FocusTopMostWindowUnderOne(popup_window, NULL, NULL);
}
else
{
diff --git a/imgui_internal.h b/imgui_internal.h
index 02dc3ed..a74572b 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -2752,7 +2752,7 @@
// Windows: Display Order and Focus Order
IMGUI_API void FocusWindow(ImGuiWindow* window);
- IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
+ IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window, ImGuiViewport* filter_viewport);
IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp
index ed38787..337e015 100644
--- a/imgui_widgets.cpp
+++ b/imgui_widgets.cpp
@@ -7084,7 +7084,7 @@
// FIXME: With this strategy we won't be able to restore a NULL focus.
ImGuiContext& g = *GImGui;
if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest)
- FocusTopMostWindowUnderOne(g.NavWindow, NULL);
+ FocusTopMostWindowUnderOne(g.NavWindow, NULL, NULL);
End();
}