iconGrid: Only animate items when we actually need it

Animating items of the iconGrid involves calling a few more C functions,
which is quite slow. Especially calling ClutterActor.set_easing_delay()
is slow because we override that function in JS to adjust for the
animation slow-down factor. So add a small class variable to make sure
we only animate the icons of the grid when we actually need it.

This makes the average time spent in vfunc_allocate() of the iconGrid go
down to about 0.7 ms.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1713>
This commit is contained in:
Jonas Dreßler 2021-02-24 11:29:46 +01:00 committed by Marge Bot
parent 7771bf4437
commit 7f99655067

View File

@ -790,6 +790,7 @@ var IconGridLayout = GObject.registerClass({
const pageHeight = this._pageHeight; const pageHeight = this._pageHeight;
const pageSizeChanged = this._pageSizeChanged; const pageSizeChanged = this._pageSizeChanged;
const lastRowAlign = this.lastRowAlign; const lastRowAlign = this.lastRowAlign;
const shouldEaseItems = this._shouldEaseItems;
this._pages.forEach((page, pageIndex) => { this._pages.forEach((page, pageIndex) => {
if (isRtl && orientation === Clutter.Orientation.HORIZONTAL) if (isRtl && orientation === Clutter.Orientation.HORIZONTAL)
@ -826,8 +827,7 @@ var IconGridLayout = GObject.registerClass({
Math.max(childSize, naturalWidth), Math.max(childSize, naturalWidth),
Math.max(childSize, naturalHeight)); Math.max(childSize, naturalHeight));
// Only ease icons when the page size didn't change if (!shouldEaseItems || pageSizeChanged)
if (pageSizeChanged)
item.allocate(childBox); item.allocate(childBox);
else if (animateIconPosition(item, childBox, nChangedIcons)) else if (animateIconPosition(item, childBox, nChangedIcons))
nChangedIcons++; nChangedIcons++;
@ -835,6 +835,7 @@ var IconGridLayout = GObject.registerClass({
}); });
this._pageSizeChanged = false; this._pageSizeChanged = false;
this._shouldEaseItems = false;
this._runPostAllocation(); this._runPostAllocation();
} }
@ -863,6 +864,8 @@ var IconGridLayout = GObject.registerClass({
if (!this._container) if (!this._container)
return; return;
this._shouldEaseItems = true;
this._container.add_child(item); this._container.add_child(item);
this._addItemToPage(item, page, index); this._addItemToPage(item, page, index);
} }
@ -889,6 +892,8 @@ var IconGridLayout = GObject.registerClass({
if (!this._items.has(item)) if (!this._items.has(item))
throw new Error(`Item ${item} is not part of the IconGridLayout`); throw new Error(`Item ${item} is not part of the IconGridLayout`);
this._shouldEaseItems = true;
this._removeItemData(item); this._removeItemData(item);
this._addItemToPage(item, newPage, newPosition); this._addItemToPage(item, newPage, newPosition);
} }
@ -906,6 +911,8 @@ var IconGridLayout = GObject.registerClass({
if (!this._container) if (!this._container)
return; return;
this._shouldEaseItems = true;
this._container.remove_child(item); this._container.remove_child(item);
this._removeItemData(item); this._removeItemData(item);
} }