Skip to content

Commit 3607c42

Browse files
committed
Viewports: Fix issue inferring viewport z-order when new popups gets created. (ocornut#3734) + Metrics updates.
Revert 6bc5266 Showing inferred order and missing flags in metrics.
1 parent 2a5eaf2 commit 3607c42

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

Diff for: imgui.cpp

+39-8
Original file line numberDiff line numberDiff line change
@@ -11839,7 +11839,7 @@ void ImGui::UpdatePlatformWindows()
1183911839
// This is useful for our platform z-order heuristic when io.MouseHoveredViewport is not available.
1184011840
if (viewport->LastFrontMostStampCount != g.ViewportFrontMostStampCount)
1184111841
viewport->LastFrontMostStampCount = ++g.ViewportFrontMostStampCount;
11842-
}
11842+
}
1184311843

1184411844
// Clear request flags
1184511845
viewport->ClearRequestFlags();
@@ -11860,8 +11860,14 @@ void ImGui::UpdatePlatformWindows()
1186011860
}
1186111861

1186211862
// 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+
}
1186511871
}
1186611872
}
1186711873

@@ -15852,6 +15858,13 @@ static void RenderViewportsThumbnails()
1585215858
ImGui::Dummy(bb_full.GetSize() * SCALE);
1585315859
}
1585415860

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+
1585515868
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
1585615869
static void MetricsHelpMarker(const char* desc)
1585715870
{
@@ -16059,6 +16072,18 @@ void ImGui::ShowMetricsWindow(bool* p_open)
1605916072
TreePop();
1606016073
}
1606116074

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+
1606216087
for (int i = 0; i < g.Viewports.Size; i++)
1606316088
DebugNodeViewport(g.Viewports[i]);
1606416089
TreePop();
@@ -16557,11 +16582,17 @@ void ImGui::DebugNodeViewport(ImGuiViewportP* viewport)
1655716582
viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y,
1655816583
viewport->PlatformMonitor, viewport->DpiScale * 100.0f);
1655916584
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" : "");
1656516596
for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++)
1656616597
for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++)
1656716598
DebugNodeDrawList(NULL, viewport, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList");

Diff for: imgui_internal.h

+2
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,7 @@ struct ImGuiContext
15311531
ImGuiViewportP* CurrentViewport; // We track changes of viewport (happening in Begin) so we can call Platform_OnChangedViewport()
15321532
ImGuiViewportP* MouseViewport;
15331533
ImGuiViewportP* MouseLastHoveredViewport; // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
1534+
ImGuiID PlatformLastFocusedViewportId;
15341535
int ViewportFrontMostStampCount; // Every time the front-most window changes, we stamp its viewport with an incrementing counter
15351536

15361537
// Gamepad/keyboard Navigation
@@ -1752,6 +1753,7 @@ struct ImGuiContext
17521753
CurrentDpiScale = 0.0f;
17531754
CurrentViewport = NULL;
17541755
MouseViewport = MouseLastHoveredViewport = NULL;
1756+
PlatformLastFocusedViewportId = 0;
17551757
ViewportFrontMostStampCount = 0;
17561758

17571759
NavWindow = NULL;

0 commit comments

Comments
 (0)