diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in index 90fce6c1e..1af4b09a4 100644 --- a/data/org.gnome.shell.gschema.xml.in +++ b/data/org.gnome.shell.gschema.xml.in @@ -135,6 +135,20 @@ Keybinding to open the application menu. + + ["<Super><Alt>Up"] + Keybinding to shift between overview states + + Keybinding to shift between session, window picker and app grid + + + + ["<Super><Alt>Down"] + Keybinding to shift between overview states + + Keybinding to shift between app grid, window picker and session + + ["<Super>a"] Keybinding to open the “Show Applications” view diff --git a/js/ui/overviewControls.js b/js/ui/overviewControls.js index 14f247b09..96d99403f 100644 --- a/js/ui/overviewControls.js +++ b/js/ui/overviewControls.js @@ -358,6 +358,18 @@ class ControlsManager extends St.Widget { Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, this._toggleAppsPage.bind(this)); + Main.wm.addKeybinding('shift-overview-up', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, + () => this._shiftState(Meta.MotionDirection.UP)); + + Main.wm.addKeybinding('shift-overview-down', + new Gio.Settings({ schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA }), + Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, + Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, + () => this._shiftState(Meta.MotionDirection.DOWN)); + this.connect('destroy', this._onDestroy.bind(this)); this._update(); @@ -513,6 +525,34 @@ class ControlsManager extends St.Widget { } } + _shiftState(direction) { + let { currentState, finalState } = this._stateAdjustment.getStateTransitionParams(); + + if (direction === Meta.MotionDirection.DOWN) + finalState = Math.max(finalState - 1, ControlsState.HIDDEN); + else if (direction === Meta.MotionDirection.UP) + finalState = Math.min(finalState + 1, ControlsState.APP_GRID); + + if (finalState === currentState) + return; + + if (currentState === ControlsState.HIDDEN && + finalState === ControlsState.WINDOW_PICKER) { + Main.overview.show(); + } else if (finalState === ControlsState.HIDDEN) { + Main.overview.hide(); + } else { + this._stateAdjustment.ease(finalState, { + duration: SIDE_CONTROLS_ANIMATION_TIME, + mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => { + this.dash.showAppsButton.checked = + finalState === ControlsState.APP_GRID; + }, + }); + } + } + _onDestroy() { global.workspace_manager.disconnect(this._nWorkspacesNotifyId); }