91 lines
3.2 KiB
Diff
91 lines
3.2 KiB
Diff
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
|
|
|