workspace: Add WorkspaceBackground to Workspace itself

Instead of adding it to the window previews container, add it to Workspace
itself. This requires expanding WorkspaceBackground, so add the relevant
x and y expand flags.

Since the background is beneath the window previews, create and add it before
the window preview container.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1691>
This commit is contained in:
Georges Basile Stavracas Neto 2021-02-17 11:01:44 -03:00 committed by Marge Bot
parent 37bcd3d428
commit a17c4283ea

View File

@ -416,7 +416,6 @@ var WorkspaceLayout = GObject.registerClass({
this._container = null; this._container = null;
this._windows = new Map(); this._windows = new Map();
this._sortedWindows = []; this._sortedWindows = [];
this._background = null;
this._lastBox = null; this._lastBox = null;
this._windowSlots = []; this._windowSlots = [];
this._layout = null; this._layout = null;
@ -605,15 +604,6 @@ var WorkspaceLayout = GObject.registerClass({
this._windowSlots = this._getWindowSlots(box.copy()); this._windowSlots = this._getWindowSlots(box.copy());
} }
if (this._background) {
const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
const cornerRadius = scaleFactor * BACKGROUND_CORNER_RADIUS_PIXELS;
this._background.cornerRadius =
Util.lerp(0, cornerRadius, this._stateAdjustment.value);
this._background.allocate(box);
}
const allocationScale = containerBox.get_width() / this._workarea.width; const allocationScale = containerBox.get_width() / this._workarea.width;
const workspaceBox = new Clutter.ActorBox(); const workspaceBox = new Clutter.ActorBox();
@ -621,7 +611,7 @@ var WorkspaceLayout = GObject.registerClass({
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
for (const child of container) { for (const child of container) {
if (!child.visible || child === this._background) if (!child.visible)
continue; continue;
// The fifth element in the slot array is the WindowPreview // The fifth element in the slot array is the WindowPreview
@ -783,16 +773,6 @@ var WorkspaceLayout = GObject.registerClass({
this.layout_changed(); this.layout_changed();
} }
setBackground(background) {
if (this._background)
this._container.remove_child(this._background);
this._background = background;
if (this._background)
this._container.add_child(this._background);
}
syncStacking(stackIndices) { syncStacking(stackIndices) {
const windows = [...this._windows.keys()]; const windows = [...this._windows.keys()];
windows.sort((a, b) => { windows.sort((a, b) => {
@ -802,7 +782,7 @@ var WorkspaceLayout = GObject.registerClass({
return stackIndices[seqA] - stackIndices[seqB]; return stackIndices[seqA] - stackIndices[seqB];
}); });
let lastWindow = this._background; let lastWindow = null;
for (const window of windows) { for (const window of windows) {
window.setStackAbove(lastWindow); window.setStackAbove(lastWindow);
lastWindow = window; lastWindow = window;
@ -880,6 +860,8 @@ class WorkspaceBackground extends St.Widget {
super._init({ super._init({
style_class: 'workspace-background', style_class: 'workspace-background',
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
x_expand: true,
y_expand: true,
}); });
this._monitorIndex = monitorIndex; this._monitorIndex = monitorIndex;
@ -978,6 +960,11 @@ class Workspace extends St.Widget {
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
}); });
// Background
this._background = new WorkspaceBackground(monitorIndex);
this.add_child(this._background);
// Window previews
const layoutManager = new WorkspaceLayout(metaWorkspace, monitorIndex); const layoutManager = new WorkspaceLayout(metaWorkspace, monitorIndex);
this._container = new Clutter.Actor({ this._container = new Clutter.Actor({
reactive: true, reactive: true,
@ -1000,10 +987,6 @@ class Workspace extends St.Widget {
if (monitorIndex != Main.layoutManager.primaryIndex) if (monitorIndex != Main.layoutManager.primaryIndex)
this.add_style_class_name('external-monitor'); this.add_style_class_name('external-monitor');
// Background
this._background = new WorkspaceBackground(monitorIndex);
layoutManager.setBackground(this._background);
const clickAction = new Clutter.ClickAction(); const clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', action => { clickAction.connect('clicked', action => {
// Switch to the workspace when not the active one, leave the // Switch to the workspace when not the active one, leave the
@ -1048,6 +1031,17 @@ class Workspace extends St.Widget {
// DND requires this to be set // DND requires this to be set
this._delegate = this; this._delegate = this;
layoutManager.stateAdjustment.connect('notify::value',
() => this._updateBackgroundBorderRadius());
}
_updateBackgroundBorderRadius() {
const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
const cornerRadius = scaleFactor * BACKGROUND_CORNER_RADIUS_PIXELS;
const { stateAdjustment } = this._container.layout_manager;
this._background.cornerRadius =
Util.lerp(0, cornerRadius, stateAdjustment.value);
} }
_shouldLeaveOverview() { _shouldLeaveOverview() {
@ -1303,7 +1297,7 @@ class Workspace extends St.Widget {
this._container.layout_manager.addWindow(clone, metaWindow); this._container.layout_manager.addWindow(clone, metaWindow);
if (this._windows.length == 0) if (this._windows.length == 0)
clone.setStackAbove(this._background); clone.setStackAbove(null);
else else
clone.setStackAbove(this._windows[this._windows.length - 1]); clone.setStackAbove(this._windows[this._windows.length - 1]);