diff --git a/Libraries/LibGUI/Window.cpp b/Libraries/LibGUI/Window.cpp index 9ca5b352f2..50e44912bb 100644 --- a/Libraries/LibGUI/Window.cpp +++ b/Libraries/LibGUI/Window.cpp @@ -730,6 +730,7 @@ Vector Window::focusable_widgets(FocusSource source) const if (!m_main_widget) return {}; + HashTable seen_widgets; Vector collected_widgets; Function collect_focusable_widgets = [&](auto& widget) { @@ -746,8 +747,11 @@ Vector Window::focusable_widgets(FocusSource source) const break; } - if (widget_accepts_focus) - collected_widgets.append(&widget); + if (widget_accepts_focus) { + auto& effective_focus_widget = widget.focus_proxy() ? *widget.focus_proxy() : widget; + if (seen_widgets.set(&effective_focus_widget) == AK::HashSetResult::InsertedNewEntry) + collected_widgets.append(&effective_focus_widget); + } widget.for_each_child_widget([&](auto& child) { if (!child.is_visible()) return IterationDecision::Continue;