[gnome-shell/wip/exalm/gestures: 35/36] workspaceAnimation: Use window clones



commit 6d3a0557a73bd2e6328d89b917eb67ce6cc11998
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Thu Jul 4 23:15:15 2019 +0500

    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.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/605

 js/ui/workspaceAnimation.js | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)
---
diff --git a/js/ui/workspaceAnimation.js b/js/ui/workspaceAnimation.js
index 0a96d21df6..4329afae94 100644
--- a/js/ui/workspaceAnimation.js
+++ b/js/ui/workspaceAnimation.js
@@ -47,13 +47,18 @@ class WorkspaceGroup extends Clutter.Actor {
         windows = windows.filter(w => this._shouldShowWindow(w.meta_window));
 
         for (let window of windows) {
-            let record = { window: window,
-                           parent: window.get_parent() };
+            let clone = new Clutter.Clone({ source: window,
+                                            x: window.x,
+                                            y: window.y });
+
+            this.add_actor(clone);
+            window.hide();
 
-            record.parent.remove_child(window)
-            this.add_child(window);
+            let record = { window: window,
+                           clone: clone };
 
             record.windowDestroyId = window.connect('destroy', () => {
+                clone.destroy();
                 this._windows.splice(this._windows.indexOf(record), 1);
             });
 
@@ -66,12 +71,11 @@ class WorkspaceGroup extends Clutter.Actor {
             let w = this._windows[i];
 
             w.window.disconnect(w.windowDestroyId);
-            this.remove_child(w.window);
-            w.parent.add_child(w.window)
+            w.clone.destroy();
 
-            if (w.window.get_meta_window().get_workspace() !=
+            if (w.window.get_meta_window().get_workspace() ==
                 global.workspace_manager.get_active_workspace())
-                w.window.hide();
+                w.window.show();
         }
 
         this._windows = [];


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]