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
This commit is contained in:
parent
4915a9e8e4
commit
004a5e1042
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user