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:
parent
7771bf4437
commit
7f99655067
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user