[gnome-shell] windowManager: Complete interrupted size change effects



commit fc71f8b33a64854e2c0247a54e442f2c3ca0b487
Author: Florian Müllner <fmuellner gnome org>
Date:   Fri Nov 8 18:22:40 2019 +0100

    windowManager: Complete interrupted size change effects
    
    Resizing effects are more finicky as other effects, as the actual
    animation is delayed until we receive the ::size-changed signal.
    
    However that signal may never be emitted if the window is destroyed
    just after starting the size-change effect, in which case the effect
    is never completed, blocking mutter from destroying the corresponding
    window actor.
    
    Address this by tracking when a resize effect is pending, and complete
    the effect when appropriate.
    
    https://gitlab.gnome.org/GNOME/mutter/issues/655
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/815

 js/ui/windowManager.js | 6 ++++++
 1 file changed, 6 insertions(+)
---
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index 74d4faf7fa..c19043faeb 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -703,6 +703,7 @@ var WindowManager = class {
         this._unminimizing = new Set();
         this._mapping = new Set();
         this._resizing = new Set();
+        this._resizePending = new Set();
         this._destroying = new Set();
         this._movingWindow = null;
 
@@ -1464,6 +1465,7 @@ var WindowManager = class {
             this._clearAnimationInfo(actor);
         });
 
+        this._resizePending.add(actor);
         actor.__animationInfo = { clone: actorClone,
                                   oldRect: oldFrameRect,
                                   destroyId: destroyId };
@@ -1482,6 +1484,7 @@ var WindowManager = class {
         let scaleX = targetRect.width / sourceRect.width;
         let scaleY = targetRect.height / sourceRect.height;
 
+        this._resizePending.delete(actor);
         this._resizing.add(actor);
 
         // Now scale and fade out the clone
@@ -1538,6 +1541,9 @@ var WindowManager = class {
             actor.translation_y = 0;
             this._clearAnimationInfo(actor);
         }
+
+        if (this._resizePending.delete(actor))
+            this._shellwm.completed_size_change(actor);
     }
 
     _hasAttachedDialogs(window, ignoreWindow) {


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