[gnome-shell] iconGrid: Queue a relayout after child opacity changes



commit 004a5e104256da8ec3a845e86c6a10b5c7998b24
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Fri Sep 6 11:50:52 2019 +0200

    iconGrid: Queue a relayout after child opacity changes
    
    We're using a vfunc override for `get_paint_volume` to exclude children
    with an opacity of 0 from the paint volume and thus decrease the size of
    the area we need to paint.
    
    Now if the paint volume is requested during the spring animation (the
    real icons are hidden using an opacity of 0 and clones are used for the
    animation), `get_paint_volume` returns a paint volume with a height of
    0. After that, the spring animation finishes and the icon-opacities are
    set to 255 in `_resetAnimationActors`, and since we cache paint volumes
    and there's no reason for Clutter to assume it got invalid, the icons
    end up not being painted.
    
    Fix this by queuing a relayout of the grid when the opacity of a child
    is changed from or to 0, which manually invalidates the paint volume.
    
    The reason why this is not an issue with the paginated icon grid
    (all-apps view) is probably because StScrollView invalidates the paint
    volume a lot more often than regular containers.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1502

 js/ui/iconGrid.js | 12 ++++++++++++
 1 file changed, 12 insertions(+)
---
diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js
index 08d72aff1d..1d22e821aa 100644
--- a/js/ui/iconGrid.js
+++ b/js/ui/iconGrid.js
@@ -247,11 +247,23 @@ var IconGrid = GObject.registerClass({
 
     _childAdded(grid, child) {
         child._iconGridKeyFocusInId = child.connect('key-focus-in', this._keyFocusIn.bind(this));
+
+        child._paintVisible = child.opacity > 0;
+        child._opacityChangedId = child.connect('notify::opacity', () => {
+            let paintVisible = child._paintVisible;
+            child._paintVisible = child.opacity > 0;
+            if (paintVisible !== child._paintVisible)
+                this.queue_relayout();
+        });
     }
 
     _childRemoved(grid, child) {
         child.disconnect(child._iconGridKeyFocusInId);
         delete child._iconGridKeyFocusInId;
+
+        child.disconnect(child._opacityChangedId);
+        delete child._opacityChangedId;
+        delete child._paintVisible;
     }
 
     vfunc_get_preferred_width(_forHeight) {


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