diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index 0ef8368c3..1428f735a 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -945,6 +945,14 @@ var WindowManager = class { this._workspaceAnimation = new WorkspaceAnimation.WorkspaceAnimationController(); + + this._shellwm.connect('kill-switch-workspace', () => { + if (!this._workspaceAnimation.isAnimating() || this._workspaceAnimation.canCancelGesture()) + return; + + this._workspaceAnimation.cancelSwitchAnimation(); + this._shellwm.completed_switch_workspace(); + }); } _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { @@ -1554,8 +1562,9 @@ var WindowManager = class { return; } - this._workspaceAnimation.animateSwitchWorkspace(shellwm, from, to, - direction); + this._workspaceAnimation.animateSwitchWorkspace(from, to, direction, () => { + this._shellwm.completed_switch_workspace(); + }); } _showTilePreview(shellwm, window, tileRect, monitorIndex) { diff --git a/js/ui/workspaceAnimation.js b/js/ui/workspaceAnimation.js index e4308217c..b8005f392 100644 --- a/js/ui/workspaceAnimation.js +++ b/js/ui/workspaceAnimation.js @@ -10,18 +10,8 @@ const WINDOW_ANIMATION_TIME = 250; var WorkspaceAnimationController = class { constructor() { - this._shellwm = global.window_manager; this._movingWindow = null; - this._switchData = null; - this._shellwm.connect('kill-switch-workspace', shellwm => { - if (this._switchData) { - if (this._switchData.inProgress) - this._switchWorkspaceDone(shellwm); - else if (!this._switchData.gestureActivated) - this._finishWorkspaceSwitch(this._switchData); - } - }); global.display.connect('restacked', this._syncStacking.bind(this)); @@ -231,7 +221,7 @@ var WorkspaceAnimationController = class { this.movingWindow = null; } - animateSwitchWorkspace(shellwm, from, to, direction) { + animateSwitchWorkspace(from, to, direction, onComplete) { this._prepareWorkspaceSwitch(from, to, direction); this._switchData.inProgress = true; @@ -253,15 +243,13 @@ var WorkspaceAnimationController = class { y: yDest, duration: WINDOW_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_CUBIC, - onComplete: () => this._switchWorkspaceDone(shellwm), + onComplete: () => { + this._finishWorkspaceSwitch(this._switchData); + onComplete(); + }, }); } - _switchWorkspaceDone(shellwm) { - this._finishWorkspaceSwitch(this._switchData); - shellwm.completed_switch_workspace(); - } - _directionForProgress(progress) { if (global.workspace_manager.layout_rows === -1) { return progress > 0 @@ -418,6 +406,10 @@ var WorkspaceAnimationController = class { return this._switchData !== null; } + canCancelGesture() { + return this.isAnimating() && this._switchData.gestureActivated; + } + set movingWindow(movingWindow) { this._movingWindow = movingWindow; }