@@ -11839,7 +11839,7 @@ void ImGui::UpdatePlatformWindows()
11839
11839
// This is useful for our platform z-order heuristic when io.MouseHoveredViewport is not available.
11840
11840
if (viewport->LastFrontMostStampCount != g.ViewportFrontMostStampCount)
11841
11841
viewport->LastFrontMostStampCount = ++g.ViewportFrontMostStampCount;
11842
- }
11842
+ }
11843
11843
11844
11844
// Clear request flags
11845
11845
viewport->ClearRequestFlags();
@@ -11860,8 +11860,14 @@ void ImGui::UpdatePlatformWindows()
11860
11860
}
11861
11861
11862
11862
// Store a tag so we can infer z-order easily from all our windows
11863
- if (focused_viewport && focused_viewport->LastFrontMostStampCount != g.ViewportFrontMostStampCount)
11864
- focused_viewport->LastFrontMostStampCount = ++g.ViewportFrontMostStampCount;
11863
+ // We compare PlatformLastFocusedViewportId so newly created viewports with _NoFocusOnAppearing flag
11864
+ // will keep the front most stamp instead of losing it back to their parent viewport.
11865
+ if (focused_viewport && g.PlatformLastFocusedViewportId != focused_viewport->ID)
11866
+ {
11867
+ if (focused_viewport->LastFrontMostStampCount != g.ViewportFrontMostStampCount)
11868
+ focused_viewport->LastFrontMostStampCount = ++g.ViewportFrontMostStampCount;
11869
+ g.PlatformLastFocusedViewportId = focused_viewport->ID;
11870
+ }
11865
11871
}
11866
11872
}
11867
11873
@@ -15852,6 +15858,13 @@ static void RenderViewportsThumbnails()
15852
15858
ImGui::Dummy(bb_full.GetSize() * SCALE);
15853
15859
}
15854
15860
15861
+ static int IMGUI_CDECL ViewportComparerByFrontMostStampCount(const void* lhs, const void* rhs)
15862
+ {
15863
+ const ImGuiViewportP* a = *(const ImGuiViewportP* const *)lhs;
15864
+ const ImGuiViewportP* b = *(const ImGuiViewportP* const *)rhs;
15865
+ return b->LastFrontMostStampCount - a->LastFrontMostStampCount;
15866
+ }
15867
+
15855
15868
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
15856
15869
static void MetricsHelpMarker(const char* desc)
15857
15870
{
@@ -16059,6 +16072,18 @@ void ImGui::ShowMetricsWindow(bool* p_open)
16059
16072
TreePop();
16060
16073
}
16061
16074
16075
+ if (TreeNode("Inferred order (front-to-back)"))
16076
+ {
16077
+ static ImVector<ImGuiViewportP*> viewports;
16078
+ viewports.resize(g.Viewports.Size);
16079
+ memcpy(viewports.Data, g.Viewports.Data, g.Viewports.size_in_bytes());
16080
+ if (viewports.Size > 1)
16081
+ ImQsort(viewports.Data, viewports.Size, sizeof(ImGuiViewport*), ViewportComparerByFrontMostStampCount);
16082
+ for (int i = 0; i < viewports.Size; i++)
16083
+ BulletText("Viewport #%d, ID: 0x%08X, FrontMostStampCount = %08d, Window: \"%s\"", viewports[i]->Idx, viewports[i]->ID, viewports[i]->LastFrontMostStampCount, viewports[i]->Window ? viewports[i]->Window->Name : "N/A");
16084
+ TreePop();
16085
+ }
16086
+
16062
16087
for (int i = 0; i < g.Viewports.Size; i++)
16063
16088
DebugNodeViewport(g.Viewports[i]);
16064
16089
TreePop();
@@ -16557,11 +16582,17 @@ void ImGui::DebugNodeViewport(ImGuiViewportP* viewport)
16557
16582
viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y,
16558
16583
viewport->PlatformMonitor, viewport->DpiScale * 100.0f);
16559
16584
if (viewport->Idx > 0) { SameLine(); if (SmallButton("Reset Pos")) { viewport->Pos = ImVec2(200, 200); viewport->UpdateWorkRect(); if (viewport->Window) viewport->Window->Pos = viewport->Pos; } }
16560
- BulletText("Flags: 0x%04X =%s%s%s%s%s%s%s", viewport->Flags,
16561
- (flags & ImGuiViewportFlags_CanHostOtherWindows) ? " CanHostOtherWindows" : "", (flags & ImGuiViewportFlags_NoDecoration) ? " NoDecoration" : "",
16562
- (flags & ImGuiViewportFlags_NoFocusOnAppearing) ? " NoFocusOnAppearing" : "", (flags & ImGuiViewportFlags_NoInputs) ? " NoInputs" : "",
16563
- (flags & ImGuiViewportFlags_NoRendererClear) ? " NoRendererClear" : "", (flags & ImGuiViewportFlags_Minimized) ? " Minimized" : "",
16564
- (flags & ImGuiViewportFlags_NoAutoMerge) ? " NoAutoMerge" : "");
16585
+ BulletText("Flags: 0x%04X =%s%s%s%s%s%s%s%s%s%s", viewport->Flags,
16586
+ (flags & ImGuiViewportFlags_NoDecoration) ? " NoDecoration" : "",
16587
+ (flags & ImGuiViewportFlags_NoTaskBarIcon) ? " NoTaskBarIcon" : "",
16588
+ (flags & ImGuiViewportFlags_NoFocusOnAppearing) ? " NoFocusOnAppearing" : "",
16589
+ (flags & ImGuiViewportFlags_NoFocusOnClick) ? " NoFocusOnClick" : "",
16590
+ (flags & ImGuiViewportFlags_NoInputs) ? " NoInputs" : "",
16591
+ (flags & ImGuiViewportFlags_NoRendererClear) ? " NoRendererClear" : "",
16592
+ (flags & ImGuiViewportFlags_TopMost) ? " TopMost" : "",
16593
+ (flags & ImGuiViewportFlags_Minimized) ? " Minimized" : "",
16594
+ (flags & ImGuiViewportFlags_NoAutoMerge) ? " NoAutoMerge" : "",
16595
+ (flags & ImGuiViewportFlags_CanHostOtherWindows) ? " CanHostOtherWindows" : "");
16565
16596
for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++)
16566
16597
for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++)
16567
16598
DebugNodeDrawList(NULL, viewport, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList");
0 commit comments