appDisplay: Use navigate_from_event() for keyboard focus in app folders

It wasn't possible to navigate by keyboard inside app folders due
to the focus being grabbed by the dialog. Changed vfunc_key_press_event()
to use the focus manager's navigate_from_event(), which is the same method
used by modal dialogs (also making use of the focus group already assigned
to AppFolderDialog).

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6331
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3338>
This commit is contained in:
sorelz
2024-05-22 23:24:39 +01:00
parent 8b0f3144ca
commit 3061589610

View File

@ -2805,49 +2805,10 @@ export const AppFolderDialog = GObject.registerClass({
}
vfunc_key_press_event(event) {
if (global.stage.get_key_focus() !== this)
return Clutter.EVENT_PROPAGATE;
if (global.focus_manager.navigate_from_event(event))
return Clutter.EVENT_STOP;
// Since we need to only grab focus on one item child when the user
// actually press a key we don't use navigate_focus when opening
// the popup.
// Instead of that, grab the focus on the AppFolderPopup actor
// and actually moves the focus to a child only when the user
// actually press a key.
// It should work with just grab_key_focus on the AppFolderPopup
// actor, but since the arrow keys are not wrapping_around the focus
// is not grabbed by a child when the widget that has the current focus
// is the same that is requesting focus, so to make it works with arrow
// keys we need to connect to the key-press-event and navigate_focus
// when that happens using TAB_FORWARD or TAB_BACKWARD instead of arrow
// keys
// Use TAB_FORWARD for down key and right key
// and TAB_BACKWARD for up key and left key on ltr
// languages
let direction;
let isLtr = Clutter.get_default_text_direction() === Clutter.TextDirection.LTR;
switch (event.get_key_symbol()) {
case Clutter.KEY_Down:
direction = St.DirectionType.TAB_FORWARD;
break;
case Clutter.KEY_Right:
direction = isLtr
? St.DirectionType.TAB_FORWARD
: St.DirectionType.TAB_BACKWARD;
break;
case Clutter.KEY_Up:
direction = St.DirectionType.TAB_BACKWARD;
break;
case Clutter.KEY_Left:
direction = isLtr
? St.DirectionType.TAB_BACKWARD
: St.DirectionType.TAB_FORWARD;
break;
default:
return Clutter.EVENT_PROPAGATE;
}
return this.navigate_focus(null, direction, false);
return Clutter.EVENT_PROPAGATE;
}
_setLighterBackground(lighter) {