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:
parent
a4bf44734d
commit
959639bdc9
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user