windowPreview: Cache the boundingBox of the layout manager

Accessing GObject properties from JS has proven to be quite slow because
of the JS->C->JS roundtrip involved. With the WindowPreview this
actually has an impact since we're accessing those properties very often
while creating new layouts.

So cache the boundingBox and the windowCenter properties of the
WindowPreview using a this._cachedBoundingBox JS object. This might
speed up opening the overview with lots of open windows significantly.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1617>
This commit is contained in:
Jonas Dreßler 2021-02-01 11:51:27 +01:00 committed by Marge Bot
parent a4bf44734d
commit 959639bdc9

View File

@ -231,8 +231,22 @@ var WindowPreview = GObject.registerClass({
this._stackAbove = null; this._stackAbove = null;
this._cachedBoundingBox = {
x: this._windowContainer.layout_manager.bounding_box.x1,
y: this._windowContainer.layout_manager.bounding_box.y1,
width: this._windowContainer.layout_manager.bounding_box.get_width(),
height: this._windowContainer.layout_manager.bounding_box.get_height(),
};
this._windowContainer.layout_manager.connect( this._windowContainer.layout_manager.connect(
'notify::bounding-box', layout => { 'notify::bounding-box', layout => {
this._cachedBoundingBox = {
x: layout.bounding_box.x1,
y: layout.bounding_box.y1,
width: layout.bounding_box.get_width(),
height: layout.bounding_box.get_height(),
};
// A bounding box of 0x0 means all windows were removed // A bounding box of 0x0 means all windows were removed
if (layout.bounding_box.get_area() > 0) if (layout.bounding_box.get_area() > 0)
this.emit('size-changed'); this.emit('size-changed');
@ -561,23 +575,14 @@ var WindowPreview = GObject.registerClass({
} }
get boundingBox() { get boundingBox() {
const box = this._windowContainer.layout_manager.bounding_box; return { ...this._cachedBoundingBox };
return {
x: box.x1,
y: box.y1,
width: box.get_width(),
height: box.get_height(),
};
} }
get windowCenter() { get windowCenter() {
const box = this._windowContainer.layout_manager.bounding_box; return {
x: this._cachedBoundingBox.x + this._cachedBoundingBox.width / 2,
return new Graphene.Point({ y: this._cachedBoundingBox.y + this._cachedBoundingBox.height / 2,
x: box.get_x() + box.get_width() / 2, };
y: box.get_y() + box.get_height() / 2,
});
} }
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase