Merge branch '6331-appfolder-keynav' into 'main'

App folders: Fix keyboard navigation in AppFolderDialog

Closes #6331

See merge request GNOME/gnome-shell!3338
This commit is contained in:
sorelz 2024-06-28 09:03:05 +00:00
commit 5804f178a5

View file

@ -2674,11 +2674,14 @@ export const AppFolderDialog = GObject.registerClass({
let folderName = _getFolderName(this._folder);
let newFolderName = this._entry.text.trim();
if (newFolderName.length === 0 || newFolderName === folderName)
if (newFolderName.length === 0 || newFolderName === folderName) {
this.navigate_focus(this, St.DirectionType.TAB_FORWARD, false);
return;
}
this._folder.set_string('name', newFolderName);
this._folder.set_boolean('translate', false);
this.navigate_focus(this, St.DirectionType.TAB_FORWARD, false);
}
_zoomAndFadeIn() {
@ -2805,49 +2808,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) {