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 ///