Blob Blame History Raw
From 4915a9e8e404555379aa8807ad8c53c7589f2ae7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Sun, 8 Sep 2019 18:09:23 +0200
Subject: [PATCH 1/2] iconGrid: Delete private child property when removing
 child

Delete a private property we set when the child got added to make sure
the reference is deleted after the child got removed from the grid.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/704
---
 js/ui/iconGrid.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js
index e0a1e8bd8..08d72aff1 100644
--- a/js/ui/iconGrid.js
+++ b/js/ui/iconGrid.js
@@ -251,6 +251,7 @@ var IconGrid = GObject.registerClass({
 
     _childRemoved(grid, child) {
         child.disconnect(child._iconGridKeyFocusInId);
+        delete child._iconGridKeyFocusInId;
     }
 
     vfunc_get_preferred_width(_forHeight) {
-- 
2.23.0


From 004a5e104256da8ec3a845e86c6a10b5c7998b24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
Date: Fri, 6 Sep 2019 11:50:52 +0200
Subject: [PATCH 2/2] 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 08d72aff1..1d22e821a 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) {
-- 
2.23.0