popovermenu: Cycle around focus also with (Shift+)Tab

Currently when moving the focus with (Shift+)Tab, it also traverses the window's
widgets, although it would be expected that the focus stays within the popover,
as it's (almost) like it's a separate window. This would be consistent with
the behaviour of the Up/down arrows, which do cycle around the focus once it
reaches the end.

So this commit makes the popovermenu cycle around focus in any direction, apart
from left/right because they are used to open and close submenus and it wouldn't
make sense anyway to cycle horizontally as there's usually only one widget per
line.
This commit is contained in:
vanadiae 2021-07-05 19:20:58 +02:00
parent ca547b8716
commit ef92adc87d

View File

@ -480,12 +480,21 @@ gtk_popover_menu_focus (GtkWidget *widget,
else else
return TRUE; return TRUE;
} }
else if (direction == GTK_DIR_UP || direction == GTK_DIR_DOWN) /* Cycle around with up/down arrows and (Shift+)Tab when modal */
else if (gtk_popover_get_autohide (GTK_POPOVER (menu)))
{ {
GtkWidget *p; GtkWidget *p = gtk_root_get_focus (gtk_widget_get_root (widget));
/* In the case where the popover doesn't have any focusable child, if
* the menu doesn't have any item for example, then the focus will end
* up out of the popover, hence creating an infinite loop below. To
* avoid this, just say we had focus and stop here.
*/
if (!gtk_widget_is_ancestor (p, widget) && p != widget)
return TRUE;
/* cycle around */ /* cycle around */
for (p = gtk_root_get_focus (gtk_widget_get_root (widget)); for (;
p != widget; p != widget;
p = gtk_widget_get_parent (p)) p = gtk_widget_get_parent (p))
{ {