workspace: Update background on workarea changes

The WorkspaceBackground class has specific code to clip the background
to the workarea. However, it doesn't monitor for workarea changes, which
means it cannot react after being created.

Connect to 'workareas-changed', and update the workarea, the radius bounds,
and relayout when workareas change.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1691>
This commit is contained in:
Georges Basile Stavracas Neto 2021-02-15 17:35:24 -03:00 committed by Marge Bot
parent 9d4f017248
commit b05280a2cd

View File

@ -905,9 +905,29 @@ class WorkspaceBackground extends St.Widget {
useContentSize: false,
});
this._workareasChangedId =
global.display.connect('workareas-changed', () => {
this._workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
this._updateRoundedClipBounds();
this.queue_relayout();
});
this._updateRoundedClipBounds();
this.connect('destroy', this._onDestroy.bind(this));
}
_updateRoundedClipBounds() {
const monitor = Main.layoutManager.monitors[this._monitorIndex];
const rect = new Graphene.Rect();
rect.origin.x = this._workarea.x - monitor.x;
rect.origin.y = this._workarea.y - monitor.y;
rect.size.width = this._workarea.width;
rect.size.height = this._workarea.height;
this._bgManager.backgroundActor.content.set_rounded_clip_bounds(rect);
}
vfunc_allocate(box) {
this.set_allocation(box);
@ -923,14 +943,6 @@ class WorkspaceBackground extends St.Widget {
const yOff = (contentHeight / this._workarea.height) *
(this._workarea.y - monitor.y);
const rect = new Graphene.Rect();
rect.origin.x = this._workarea.x - monitor.x;
rect.origin.y = this._workarea.y - monitor.y;
rect.size.width = this._workarea.width;
rect.size.height = this._workarea.height;
this._bgManager.backgroundActor.content.set_rounded_clip_bounds(rect);
contentBox.x1 -= xOff;
contentBox.y1 -= yOff;
contentBox.set_size(xOff + contentWidth, yOff + contentHeight);
@ -942,6 +954,11 @@ class WorkspaceBackground extends St.Widget {
this._bgManager.destroy();
this._bgManager = null;
}
if (this._workareasChangedId) {
global.display.disconnect(this._workareasChangedId);
delete this._workareasChangedId;
}
}
set cornerRadius(radius) {