mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-15 05:00:09 +00:00
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:
parent
ca547b8716
commit
ef92adc87d
@ -480,12 +480,21 @@ gtk_popover_menu_focus (GtkWidget *widget,
|
||||
else
|
||||
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 */
|
||||
for (p = gtk_root_get_focus (gtk_widget_get_root (widget));
|
||||
for (;
|
||||
p != widget;
|
||||
p = gtk_widget_get_parent (p))
|
||||
{
|
||||
@ -493,7 +502,7 @@ gtk_popover_menu_focus (GtkWidget *widget,
|
||||
}
|
||||
if (gtk_widget_focus_move (widget, direction))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
Loading…
Reference in New Issue
Block a user