From 856a4d27e0c59395b7f5980423087b5e850f4e1b Mon Sep 17 00:00:00 2001 From: Alexander Mikhaylenko Date: Thu, 4 Jul 2019 23:15:15 +0500 Subject: [PATCH] workspaceAnimation: Use window clones Instead of reparenting windows, clone them. This will allow to properly support multi-monitor setups in subsequent commits. Block window mapping animation while the animation is running to prevent new windows appearing during the animation from being visible at the same time as their clones. Fixes https://gitlab.gnome.org/GNOME/mutter/issues/929 https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1326 --- js/ui/workspaceAnimation.js | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/js/ui/workspaceAnimation.js b/js/ui/workspaceAnimation.js index a357302b6..4ead15dff 100644 --- a/js/ui/workspaceAnimation.js +++ b/js/ui/workspaceAnimation.js @@ -37,12 +37,16 @@ class WorkspaceGroup extends Clutter.Actor { } _syncStacking() { - const windowActors = global.get_window_actors(); - let lastSibling = null; + const windowActors = global.get_window_actors().filter(w => + this._shouldShowWindow(w.meta_window)); + + let lastRecord; for (const windowActor of windowActors) { - this.set_child_above_sibling(windowActor, lastSibling); - lastSibling = windowActor; + const record = this._windowRecords.find(r => r.windowActor === windowActor); + + this.set_child_above_sibling(record.clone, lastRecord ? lastRecord.clone : null); + lastRecord = record; } } @@ -51,16 +55,18 @@ class WorkspaceGroup extends Clutter.Actor { this._shouldShowWindow(w.meta_window)); for (const windowActor of windowActors) { - const record = { - windowActor, - parent: windowActor.get_parent(), - }; + const clone = new Clutter.Clone({ + source: windowActor, + x: windowActor.x, + y: windowActor.y, + }); - record.parent.remove_child(windowActor); - this.add_child(windowActor); - windowActor.show(); + this.add_child(clone); + + const record = { windowActor, clone }; record.windowDestroyId = windowActor.connect('destroy', () => { + clone.destroy(); this._windowRecords.splice(this._windowRecords.indexOf(record), 1); }); @@ -71,11 +77,7 @@ class WorkspaceGroup extends Clutter.Actor { _removeWindows() { for (const record of this._windowRecords) { record.windowActor.disconnect(record.windowDestroyId); - this.remove_child(record.windowActor); - record.parent.add_child(record.windowActor); - - if (!this._workspace.active) - record.windowActor.hide(); + record.clone.destroy(); } this._windowRecords = [];