ControlsManagerLayout: Cache workAreaBox

Allocation runs every frame during the overview animations, so we want
to do as little work there as possible. Cache the work area box
computation.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2395>
This commit is contained in:
Ivan Molodetskikh 2022-07-30 21:59:33 -07:00 committed by Marge Bot
parent c3284eb8ac
commit 8562606ad1

View File

@ -45,19 +45,34 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
this._postAllocationCallbacks = []; this._postAllocationCallbacks = [];
stateAdjustment.connect('notify::value', () => this.layout_changed()); stateAdjustment.connect('notify::value', () => this.layout_changed());
this._workAreaBox = new Clutter.ActorBox();
global.display.connectObject(
'workareas-changed', () => this._updateWorkAreaBox(),
this);
this._updateWorkAreaBox();
} }
_computeWorkspacesBoxForState(state, box, workAreaBox, searchHeight, dashHeight, thumbnailsHeight) { _updateWorkAreaBox() {
const monitor = Main.layoutManager.primaryMonitor;
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index);
const startX = workArea.x - monitor.x;
const startY = workArea.y - monitor.y;
this._workAreaBox.set_origin(startX, startY);
this._workAreaBox.set_size(workArea.width, workArea.height);
}
_computeWorkspacesBoxForState(state, box, searchHeight, dashHeight, thumbnailsHeight) {
const workspaceBox = box.copy(); const workspaceBox = box.copy();
const [width, height] = workspaceBox.get_size(); const [width, height] = workspaceBox.get_size();
const { y1: startY } = workAreaBox; const {y1: startY} = this._workAreaBox;
const { spacing } = this; const { spacing } = this;
const { expandFraction } = this._workspacesThumbnails; const { expandFraction } = this._workspacesThumbnails;
switch (state) { switch (state) {
case ControlsState.HIDDEN: case ControlsState.HIDDEN:
workspaceBox.set_origin(...workAreaBox.get_origin()); workspaceBox.set_origin(...this._workAreaBox.get_origin());
workspaceBox.set_size(...workAreaBox.get_size()); workspaceBox.set_size(...this._workAreaBox.get_size());
break; break;
case ControlsState.WINDOW_PICKER: case ControlsState.WINDOW_PICKER:
workspaceBox.set_origin(0, workspaceBox.set_origin(0,
@ -80,9 +95,9 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
return workspaceBox; return workspaceBox;
} }
_getAppDisplayBoxForState(state, box, workAreaBox, searchHeight, dashHeight, appGridBox) { _getAppDisplayBoxForState(state, box, searchHeight, dashHeight, appGridBox) {
const [width, height] = box.get_size(); const [width, height] = box.get_size();
const { y1: startY } = workAreaBox; const {y1: startY} = this._workAreaBox;
const appDisplayBox = new Clutter.ActorBox(); const appDisplayBox = new Clutter.ActorBox();
const { spacing } = this; const { spacing } = this;
@ -135,13 +150,7 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
const { spacing } = this; const { spacing } = this;
const monitor = Main.layoutManager.primaryMonitor; const startY = this._workAreaBox.y1;
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor.index);
const startX = workArea.x - monitor.x;
const startY = workArea.y - monitor.y;
const workAreaBox = new Clutter.ActorBox();
workAreaBox.set_origin(startX, startY);
workAreaBox.set_size(workArea.width, workArea.height);
box.y1 += startY; box.y1 += startY;
const [width, height] = box.get_size(); const [width, height] = box.get_size();
let availableHeight = height; let availableHeight = height;
@ -181,7 +190,7 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
} }
// Workspaces // Workspaces
let params = [box, workAreaBox, searchHeight, dashHeight, thumbnailsHeight]; let params = [box, searchHeight, dashHeight, thumbnailsHeight];
const transitionParams = this._stateAdjustment.getStateTransitionParams(); const transitionParams = this._stateAdjustment.getStateTransitionParams();
// Update cached boxes // Update cached boxes
@ -206,7 +215,7 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
const workspaceAppGridBox = const workspaceAppGridBox =
this._cachedWorkspaceBoxes.get(ControlsState.APP_GRID); this._cachedWorkspaceBoxes.get(ControlsState.APP_GRID);
params = [box, workAreaBox, searchHeight, dashHeight, workspaceAppGridBox]; params = [box, searchHeight, dashHeight, workspaceAppGridBox];
let appDisplayBox; let appDisplayBox;
if (!transitionParams.transitioning) { if (!transitionParams.transitioning) {
appDisplayBox = appDisplayBox =