workspacesView: Derive workspace mode from overview state
WorkspacesView uses the floating layout when the overview is in window picker mode, and the session layout when the overview is in app grid mode. Up until now, the fit mode adjustment was used to derive the workspace mode, but it is incomplete as it doesn't have the full range of workspace states. Make ViewSelector cascade the overview adjustment to WorkspacesDisplay, and use the overview adjustment itself to derive the workspace mode. Extra workspaces don't have to account for the fit mode, and thus are basically a clamp(state, 0, 1) of the overview state. However, don't call animateTo/FromOverview() anymore, since they ease the workspace mode adjustment. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1624>
This commit is contained in:
parent
741d6abb97
commit
d221215ab6
@ -139,7 +139,14 @@ class ActivitiesContainer extends St.Widget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
overviewAdjustment.connect('notify::value', () => {
|
overviewAdjustment.connect('notify::value', () => {
|
||||||
this._adjustment.value = Math.max(overviewAdjustment.value - 1, 0);
|
const { ControlsState } = OverviewControls;
|
||||||
|
|
||||||
|
const overviewState = overviewAdjustment.value;
|
||||||
|
|
||||||
|
this._appDisplay.visible =
|
||||||
|
overviewState >= ControlsState.WINDOW_PICKER;
|
||||||
|
this._adjustment.value = Math.max(0,
|
||||||
|
overviewAdjustment.value - ControlsState.WINDOW_PICKER);
|
||||||
});
|
});
|
||||||
|
|
||||||
this._thumbnailsBox = thumbnailsBox;
|
this._thumbnailsBox = thumbnailsBox;
|
||||||
@ -162,7 +169,6 @@ class ActivitiesContainer extends St.Widget {
|
|||||||
const progress = this._adjustment.value;
|
const progress = this._adjustment.value;
|
||||||
|
|
||||||
this._appDisplay.opacity = progress * 255;
|
this._appDisplay.opacity = progress * 255;
|
||||||
this._appDisplay.visible = progress !== 0;
|
|
||||||
|
|
||||||
this._thumbnailsBox.set({
|
this._thumbnailsBox.set({
|
||||||
scale_x: Util.lerp(1, 0.5, progress),
|
scale_x: Util.lerp(1, 0.5, progress),
|
||||||
@ -281,7 +287,7 @@ var ViewSelector = GObject.registerClass({
|
|||||||
this._thumbnailsBox =
|
this._thumbnailsBox =
|
||||||
new WorkspaceThumbnail.ThumbnailsBox(workspaceAdjustment);
|
new WorkspaceThumbnail.ThumbnailsBox(workspaceAdjustment);
|
||||||
this._workspacesDisplay =
|
this._workspacesDisplay =
|
||||||
new WorkspacesView.WorkspacesDisplay(workspaceAdjustment);
|
new WorkspacesView.WorkspacesDisplay(workspaceAdjustment, overviewAdjustment);
|
||||||
this.appDisplay = new AppDisplay.AppDisplay();
|
this.appDisplay = new AppDisplay.AppDisplay();
|
||||||
|
|
||||||
const activitiesContainer = new ActivitiesContainer(
|
const activitiesContainer = new ActivitiesContainer(
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const OverviewControls = imports.ui.overviewControls;
|
||||||
const SwipeTracker = imports.ui.swipeTracker;
|
const SwipeTracker = imports.ui.swipeTracker;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
@ -20,7 +21,7 @@ const WORKSPACE_INACTIVE_SCALE = 0.94;
|
|||||||
var WorkspacesViewBase = GObject.registerClass({
|
var WorkspacesViewBase = GObject.registerClass({
|
||||||
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
||||||
}, class WorkspacesViewBase extends St.Widget {
|
}, class WorkspacesViewBase extends St.Widget {
|
||||||
_init(monitorIndex) {
|
_init(monitorIndex, overviewAdjustment) {
|
||||||
super._init({
|
super._init({
|
||||||
style_class: 'workspaces-view',
|
style_class: 'workspaces-view',
|
||||||
clip_to_allocation: true,
|
clip_to_allocation: true,
|
||||||
@ -35,6 +36,11 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
||||||
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
||||||
|
|
||||||
|
this._overviewAdjustment = overviewAdjustment;
|
||||||
|
this._overviewId = overviewAdjustment.connect('notify::value', () => {
|
||||||
|
this._updateWorkspaceMode();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@ -48,6 +54,10 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
Main.overview.disconnect(this._windowDragEndId);
|
Main.overview.disconnect(this._windowDragEndId);
|
||||||
this._windowDragEndId = 0;
|
this._windowDragEndId = 0;
|
||||||
}
|
}
|
||||||
|
if (this._overviewId > 0) {
|
||||||
|
this._overviewAdjustment.disconnect(this._overviewId);
|
||||||
|
delete this._overviewId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_dragBegin() {
|
_dragBegin() {
|
||||||
@ -58,6 +68,9 @@ var WorkspacesViewBase = GObject.registerClass({
|
|||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateWorkspaceMode() {
|
||||||
|
}
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
vfunc_allocate(box) {
|
||||||
this.set_allocation(box);
|
this.set_allocation(box);
|
||||||
|
|
||||||
@ -81,10 +94,10 @@ var FitMode = {
|
|||||||
|
|
||||||
var WorkspacesView = GObject.registerClass(
|
var WorkspacesView = GObject.registerClass(
|
||||||
class WorkspacesView extends WorkspacesViewBase {
|
class WorkspacesView extends WorkspacesViewBase {
|
||||||
_init(monitorIndex, scrollAdjustment, fitModeAdjustment) {
|
_init(monitorIndex, scrollAdjustment, fitModeAdjustment, overviewAdjustment) {
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
super._init(monitorIndex);
|
super._init(monitorIndex, overviewAdjustment);
|
||||||
|
|
||||||
this._fitModeAdjustment = fitModeAdjustment;
|
this._fitModeAdjustment = fitModeAdjustment;
|
||||||
this._fitModeNotifyId = this._fitModeAdjustment.connect('notify::value', () => {
|
this._fitModeNotifyId = this._fitModeAdjustment.connect('notify::value', () => {
|
||||||
@ -220,12 +233,19 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateWorkspacesState() {
|
_updateWorkspacesState() {
|
||||||
|
const { ControlsState } = OverviewControls;
|
||||||
|
|
||||||
const adj = this._scrollAdjustment;
|
const adj = this._scrollAdjustment;
|
||||||
const fitMode = this._fitModeAdjustment.value;
|
const fitMode = this._fitModeAdjustment.value;
|
||||||
|
const overviewState = this._overviewAdjustment.value;
|
||||||
|
|
||||||
|
const normalizedWorkspaceState = 1 -
|
||||||
|
Math.abs(ControlsState.WINDOW_PICKER - overviewState);
|
||||||
|
const workspaceMode = Util.lerp(normalizedWorkspaceState, 0, fitMode);
|
||||||
|
|
||||||
// Fade and scale inactive workspaces
|
// Fade and scale inactive workspaces
|
||||||
this._workspaces.forEach((w, index) => {
|
this._workspaces.forEach((w, index) => {
|
||||||
w.stateAdjustment.value = Util.lerp(1, 0, fitMode);
|
w.stateAdjustment.value = workspaceMode;
|
||||||
|
|
||||||
const distanceToCurrentWorkspace = Math.abs(adj.value - index);
|
const distanceToCurrentWorkspace = Math.abs(adj.value - index);
|
||||||
|
|
||||||
@ -236,6 +256,10 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateWorkspaceMode() {
|
||||||
|
this._updateWorkspacesState();
|
||||||
|
}
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
vfunc_allocate(box) {
|
||||||
this.set_allocation(box);
|
this.set_allocation(box);
|
||||||
|
|
||||||
@ -443,22 +467,31 @@ class WorkspacesView extends WorkspacesViewBase {
|
|||||||
|
|
||||||
var ExtraWorkspaceView = GObject.registerClass(
|
var ExtraWorkspaceView = GObject.registerClass(
|
||||||
class ExtraWorkspaceView extends WorkspacesViewBase {
|
class ExtraWorkspaceView extends WorkspacesViewBase {
|
||||||
_init(monitorIndex) {
|
_init(monitorIndex, overviewAdjustment) {
|
||||||
super._init(monitorIndex);
|
super._init(monitorIndex, overviewAdjustment);
|
||||||
this._workspace = new Workspace.Workspace(null, monitorIndex);
|
this._workspace = new Workspace.Workspace(null, monitorIndex);
|
||||||
this.add_actor(this._workspace);
|
this.add_actor(this._workspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateWorkspaceMode() {
|
||||||
|
const overviewState = this._overviewAdjustment.value;
|
||||||
|
|
||||||
|
const progress = Math.clamp(overviewState,
|
||||||
|
OverviewControls.ControlsState.HIDDEN,
|
||||||
|
OverviewControls.ControlsState.WINDOW_PICKER);
|
||||||
|
|
||||||
|
this._workspace.stateAdjustment.value = progress;
|
||||||
|
}
|
||||||
|
|
||||||
getActiveWorkspace() {
|
getActiveWorkspace() {
|
||||||
return this._workspace;
|
return this._workspace;
|
||||||
}
|
}
|
||||||
|
|
||||||
animateToOverview() {
|
animateToOverview() {
|
||||||
this._workspace.zoomToOverview();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
animateFromOverview() {
|
animateFromOverview() {
|
||||||
this._workspace.zoomFromOverview();
|
this._workspace.prepareToLeaveOverview();
|
||||||
}
|
}
|
||||||
|
|
||||||
syncStacking(stackIndices) {
|
syncStacking(stackIndices) {
|
||||||
@ -474,13 +507,14 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
|
|||||||
|
|
||||||
var WorkspacesDisplay = GObject.registerClass(
|
var WorkspacesDisplay = GObject.registerClass(
|
||||||
class WorkspacesDisplay extends St.Widget {
|
class WorkspacesDisplay extends St.Widget {
|
||||||
_init(scrollAdjustment) {
|
_init(scrollAdjustment, overviewAdjustment) {
|
||||||
super._init({
|
super._init({
|
||||||
visible: false,
|
visible: false,
|
||||||
clip_to_allocation: true,
|
clip_to_allocation: true,
|
||||||
layout_manager: new Clutter.BinLayout(),
|
layout_manager: new Clutter.BinLayout(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._overviewAdjustment = overviewAdjustment;
|
||||||
this._fitModeAdjustment = new St.Adjustment({
|
this._fitModeAdjustment = new St.Adjustment({
|
||||||
actor: this,
|
actor: this,
|
||||||
value: FitMode.SINGLE,
|
value: FitMode.SINGLE,
|
||||||
@ -740,10 +774,12 @@ class WorkspacesDisplay extends St.Widget {
|
|||||||
let monitors = Main.layoutManager.monitors;
|
let monitors = Main.layoutManager.monitors;
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
for (let i = 0; i < monitors.length; i++) {
|
||||||
let view;
|
let view;
|
||||||
if (this._workspacesOnlyOnPrimary && i != this._primaryIndex)
|
if (this._workspacesOnlyOnPrimary && i !== this._primaryIndex) {
|
||||||
view = new ExtraWorkspaceView(i);
|
view = new ExtraWorkspaceView(i, this._overviewAdjustment);
|
||||||
else
|
} else {
|
||||||
view = new WorkspacesView(i, this._scrollAdjustment, this._fitModeAdjustment);
|
view = new WorkspacesView(i, this._scrollAdjustment,
|
||||||
|
this._fitModeAdjustment, this._overviewAdjustment);
|
||||||
|
}
|
||||||
|
|
||||||
this._workspacesViews.push(view);
|
this._workspacesViews.push(view);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user