diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index bdde74637..01d510736 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -197,6 +197,8 @@ const WorkspaceTracker = new Lang.Class({ this._workspaces = []; this._checkWorkspacesId = 0; + this._pauseWorkspaceCheck = false; + let tracker = Shell.WindowTracker.get_default(); tracker.connect('startup-sequence-changed', Lang.bind(this, this._queueCheckWorkspaces)); @@ -220,6 +222,14 @@ const WorkspaceTracker = new Lang.Class({ return new Gio.Settings({ schema_id: 'org.gnome.mutter' }); }, + blockUpdates: function() { + this._pauseWorkspaceCheck = true; + }, + + unblockUpdates: function() { + this._pauseWorkspaceCheck = false; + }, + _checkWorkspaces: function() { let i; let emptyWorkspaces = []; @@ -229,6 +239,10 @@ const WorkspaceTracker = new Lang.Class({ return false; } + // Update workspaces only if Dynamic Workspace Management has not been paused by some other function + if (this._pauseWorkspaceCheck) + return true; + for (i = 0; i < this._workspaces.length; i++) { let lastRemoved = this._workspaces[i]._lastRemovedWindow; if ((lastRemoved && @@ -627,6 +641,8 @@ const WindowManager = new Lang.Class({ this._allowedKeybindings = {}; + this._isWorkspacePrepended = false; + this._switchData = null; this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone)); this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) { @@ -915,6 +931,8 @@ const WindowManager = new Lang.Class({ if (!Meta.prefs_get_dynamic_workspaces()) return; + global.screen.append_new_workspace(false, global.get_current_time()); + let windows = global.get_window_actors().map(function(winActor) { return winActor.meta_window; }); @@ -1642,8 +1660,10 @@ const WindowManager = new Lang.Class({ } else if (isNaN(target)) { // Prepend a new workspace dynamically if (screen.get_active_workspace_index() == 0 && - action == 'move' && target == 'up') + action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { this.insertWorkspace(0); + this._isWorkspacePrepended = true; + } direction = Meta.MotionDirection[target.toUpperCase()]; newWs = screen.get_active_workspace().get_neighbor(direction); @@ -1668,9 +1688,12 @@ const WindowManager = new Lang.Class({ if (!Main.overview.visible) { if (this._workspaceSwitcherPopup == null) { + this._workspaceTracker.blockUpdates(); this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); this._workspaceSwitcherPopup.connect('destroy', Lang.bind(this, function() { + this._workspaceTracker.unblockUpdates(); this._workspaceSwitcherPopup = null; + this._isWorkspacePrepended = false; })); } this._workspaceSwitcherPopup.display(direction, newWs.index());