From 4feff89ccc433b21d880c29cb8c198808389b83c Mon Sep 17 00:00:00 2001 From: Tig Date: Wed, 10 Apr 2024 10:53:44 -0400 Subject: [PATCH] Revert "Reapply "Reapply "Rewrote FindDeepestView to be clearer and more performant""" This reverts commit d8043cdbc4c339c60993765371b7c7aa6a19a17d. --- Terminal.Gui/View/Layout/ViewLayout.cs | 78 +++++++++++--------------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/Terminal.Gui/View/Layout/ViewLayout.cs b/Terminal.Gui/View/Layout/ViewLayout.cs index 03bc864efa..0090b353dc 100644 --- a/Terminal.Gui/View/Layout/ViewLayout.cs +++ b/Terminal.Gui/View/Layout/ViewLayout.cs @@ -605,63 +605,53 @@ public LayoutStyle LayoutStyle // CONCURRENCY: This method is not thread-safe. Undefined behavior and likely program crashes are exposed by unsynchronized access to InternalSubviews. internal static View? FindDeepestView (View? start, int x, int y) { - while (start is { Visible: true } && start.Contains (x, y)) + if (start is null || !start.Visible || !start.Contains (x, y)) { - Adornment? found = null; + return null; + } - if (start.Margin.Contains (x, y)) - { - found = start.Margin; - } - else if (start.Border.Contains (x, y)) - { - found = start.Border; - } - else if (start.Padding.Contains (x, y)) - { - found = start.Padding; - } + Adornment? found = null; - Point viewportOffset = start.GetViewportOffsetFromFrame (); + if (start.Margin.Contains (x, y)) + { + found = start.Margin; + } + else if (start.Border.Contains (x, y)) + { + found = start.Border; + } + else if (start.Padding.Contains (x, y)) + { + found = start.Padding; + } - if (found is { }) - { - start = found; - viewportOffset = found.Parent.Frame.Location; - } + Point viewportOffset = start.GetViewportOffsetFromFrame (); - if (start.InternalSubviews is { Count: > 0 }) - { - int startOffsetX = x - (start.Frame.X + viewportOffset.X); - int startOffsetY = y - (start.Frame.Y + viewportOffset.Y); + if (found is { }) + { + start = found; + viewportOffset = found.Parent.Frame.Location; + } - for (int i = start.InternalSubviews.Count - 1; i >= 0; i--) - { - View nextStart = start.InternalSubviews [i]; + if (start.InternalSubviews is { Count: > 0 }) + { + int startOffsetX = x - (start.Frame.X + viewportOffset.X); + int startOffsetY = y - (start.Frame.Y + viewportOffset.Y); - if (nextStart.Visible && nextStart.Contains (startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y)) - { - start = nextStart; - x = startOffsetX + start.Viewport.X; - y = startOffsetY + start.Viewport.Y; - break; - } + for (int i = start.InternalSubviews.Count - 1; i >= 0; i--) + { + View nextStart = start.InternalSubviews [i]; - if (i == 0) - { - return start; // If no visible subview is found, return the current start view - } + if (nextStart.Visible && nextStart.Contains (startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y)) + { + // TODO: Remove recursion + return FindDeepestView (nextStart, startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y) ?? nextStart; } } - else - { - return start; - } } - return null; + return start; } - #nullable restore ///