find_*_valid_focus: Check all tested neighbors to prevent loops.

This commit is contained in:
Pāvels Nadtočajevs 2025-08-13 23:59:01 +03:00
parent ca452113d4
commit f260c5db8a
No known key found for this signature in database
GPG key ID: 8413210218EF35D2

View file

@ -2391,10 +2391,12 @@ Control *Control::find_next_valid_focus() const {
}
Control *from = const_cast<Control *>(this);
HashSet<Control *> checked;
bool ac_enabled = get_tree() && get_tree()->is_accessibility_enabled();
// Index of the current `Control` subtree within the containing `Window`.
int window_next = -1;
checked.insert(from);
while (true) {
// Find next child.
@ -2456,9 +2458,10 @@ Control *Control::find_next_valid_focus() const {
return next_child;
}
if (next_child == from || next_child == this) {
if (checked.has(next_child)) {
return nullptr; // Stuck in a loop with no next control.
}
checked.insert(next_child);
from = next_child; // Try to find the next control with focus mode FOCUS_ALL.
}
@ -2495,10 +2498,12 @@ Control *Control::find_prev_valid_focus() const {
}
Control *from = const_cast<Control *>(this);
HashSet<Control *> checked;
bool ac_enabled = get_tree() && get_tree()->is_accessibility_enabled();
// Index of the current `Control` subtree within the containing `Window`.
int window_prev = -1;
checked.insert(from);
while (true) {
// Find prev child.
@ -2554,9 +2559,10 @@ Control *Control::find_prev_valid_focus() const {
return prev_child;
}
if (prev_child == from || prev_child == this) {
if (checked.has(prev_child)) {
return nullptr; // Stuck in a loop with no prev control.
}
checked.insert(prev_child);
from = prev_child; // Try to find the prev control with focus mode FOCUS_ALL.
}