workspace: Move window previews to a child container
Currently, Workspace is a single actor that contains both the background, and all window previews, and is managed by WorkspaceLayout. In the future, this concentrating aspect of it will bite us; we want the window previews to be clipped to the allocation, but not the background, since it will have shadows. Make Workspace subclass St.Widget with a ClutterBinLayout as layout manager, and move window previews to a child actor. To reduce the impact of this extra actor, it's a ClutterActor instead of a StWidget, and the spacing is still set on Workspace itself. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1691>
This commit is contained in:
parent
b05280a2cd
commit
37bcd3d428
@ -975,14 +975,22 @@ class Workspace extends St.Widget {
|
|||||||
super._init({
|
super._init({
|
||||||
style_class: 'window-picker',
|
style_class: 'window-picker',
|
||||||
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
|
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
|
||||||
layout_manager: new WorkspaceLayout(metaWorkspace, monitorIndex),
|
layout_manager: new Clutter.BinLayout(),
|
||||||
reactive: true,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const layoutManager = new WorkspaceLayout(metaWorkspace, monitorIndex);
|
||||||
|
this._container = new Clutter.Actor({
|
||||||
|
reactive: true,
|
||||||
|
x_expand: true,
|
||||||
|
y_expand: true,
|
||||||
|
});
|
||||||
|
this._container.layout_manager = layoutManager;
|
||||||
|
this.add_child(this._container);
|
||||||
|
|
||||||
this.metaWorkspace = metaWorkspace;
|
this.metaWorkspace = metaWorkspace;
|
||||||
this._activeWorkspaceChangedId =
|
this._activeWorkspaceChangedId =
|
||||||
this.metaWorkspace?.connect('notify::active', () => {
|
this.metaWorkspace?.connect('notify::active', () => {
|
||||||
this.layoutManager.syncOverlays();
|
layoutManager.syncOverlays();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._overviewAdjustment = overviewAdjustment;
|
this._overviewAdjustment = overviewAdjustment;
|
||||||
@ -994,7 +1002,7 @@ class Workspace extends St.Widget {
|
|||||||
|
|
||||||
// Background
|
// Background
|
||||||
this._background = new WorkspaceBackground(monitorIndex);
|
this._background = new WorkspaceBackground(monitorIndex);
|
||||||
this.layout_manager.setBackground(this._background);
|
layoutManager.setBackground(this._background);
|
||||||
|
|
||||||
const clickAction = new Clutter.ClickAction();
|
const clickAction = new Clutter.ClickAction();
|
||||||
clickAction.connect('clicked', action => {
|
clickAction.connect('clicked', action => {
|
||||||
@ -1009,7 +1017,7 @@ class Workspace extends St.Widget {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.bind_property('mapped', clickAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
this.bind_property('mapped', clickAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.add_action(clickAction);
|
this._container.add_action(clickAction);
|
||||||
|
|
||||||
this.connect('style-changed', this._onStyleChanged.bind(this));
|
this.connect('style-changed', this._onStyleChanged.bind(this));
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
@ -1051,7 +1059,7 @@ class Workspace extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_focus_chain() {
|
vfunc_get_focus_chain() {
|
||||||
return this.layout_manager.getFocusChain();
|
return this._container.layout_manager.getFocusChain();
|
||||||
}
|
}
|
||||||
|
|
||||||
_lookupIndex(metaWindow) {
|
_lookupIndex(metaWindow) {
|
||||||
@ -1067,7 +1075,7 @@ class Workspace extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
syncStacking(stackIndices) {
|
syncStacking(stackIndices) {
|
||||||
this.layout_manager.syncStacking(stackIndices);
|
this._container.layout_manager.syncStacking(stackIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
_doRemoveWindow(metaWin) {
|
_doRemoveWindow(metaWin) {
|
||||||
@ -1082,7 +1090,7 @@ class Workspace extends St.Widget {
|
|||||||
// around while the user is interacting with the workspace, we delay
|
// around while the user is interacting with the workspace, we delay
|
||||||
// the positioning until the pointer remains still for at least 750 ms
|
// the positioning until the pointer remains still for at least 750 ms
|
||||||
// or is moved outside the workspace
|
// or is moved outside the workspace
|
||||||
this.layout_manager.layout_frozen = true;
|
this._container.layout_manager.layout_frozen = true;
|
||||||
|
|
||||||
if (this._layoutFrozenId > 0) {
|
if (this._layoutFrozenId > 0) {
|
||||||
GLib.source_remove(this._layoutFrozenId);
|
GLib.source_remove(this._layoutFrozenId);
|
||||||
@ -1107,7 +1115,7 @@ class Workspace extends St.Widget {
|
|||||||
return GLib.SOURCE_CONTINUE;
|
return GLib.SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.layout_manager.layout_frozen = false;
|
this._container.layout_manager.layout_frozen = false;
|
||||||
this._layoutFrozenId = 0;
|
this._layoutFrozenId = 0;
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
@ -1171,7 +1179,7 @@ class Workspace extends St.Widget {
|
|||||||
if (this._layoutFrozenId > 0) {
|
if (this._layoutFrozenId > 0) {
|
||||||
// If a window was closed before, unfreeze the layout to ensure
|
// If a window was closed before, unfreeze the layout to ensure
|
||||||
// the new window is immediately shown
|
// the new window is immediately shown
|
||||||
this.layout_manager.layout_frozen = false;
|
this._container.layout_manager.layout_frozen = false;
|
||||||
|
|
||||||
GLib.source_remove(this._layoutFrozenId);
|
GLib.source_remove(this._layoutFrozenId);
|
||||||
this._layoutFrozenId = 0;
|
this._layoutFrozenId = 0;
|
||||||
@ -1217,7 +1225,7 @@ class Workspace extends St.Widget {
|
|||||||
this._layoutFrozenId = 0;
|
this._layoutFrozenId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.layout_manager.layout_frozen = true;
|
this._container.layout_manager.layout_frozen = true;
|
||||||
this._overviewHiddenId = Main.overview.connect('hidden', this._doneLeavingOverview.bind(this));
|
this._overviewHiddenId = Main.overview.connect('hidden', this._doneLeavingOverview.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1244,11 +1252,11 @@ class Workspace extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_doneLeavingOverview() {
|
_doneLeavingOverview() {
|
||||||
this.layout_manager.layout_frozen = false;
|
this._container.layout_manager.layout_frozen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_doneShowingOverview() {
|
_doneShowingOverview() {
|
||||||
this.layout_manager.layout_frozen = false;
|
this._container.layout_manager.layout_frozen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_isMyWindow(window) {
|
_isMyWindow(window) {
|
||||||
@ -1292,7 +1300,7 @@ class Workspace extends St.Widget {
|
|||||||
this._doRemoveWindow(metaWindow);
|
this._doRemoveWindow(metaWindow);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.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(this._background);
|
||||||
@ -1311,14 +1319,14 @@ class Workspace extends St.Widget {
|
|||||||
if (index == -1)
|
if (index == -1)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
this.layout_manager.removeWindow(this._windows[index]);
|
this._container.layout_manager.removeWindow(this._windows[index]);
|
||||||
|
|
||||||
return this._windows.splice(index, 1).pop();
|
return this._windows.splice(index, 1).pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onStyleChanged() {
|
_onStyleChanged() {
|
||||||
const themeNode = this.get_theme_node();
|
const themeNode = this.get_theme_node();
|
||||||
this.layout_manager.spacing = themeNode.get_length('spacing');
|
this._container.layout_manager.spacing = themeNode.get_length('spacing');
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCloneSelected(clone, time) {
|
_onCloneSelected(clone, time) {
|
||||||
@ -1379,6 +1387,6 @@ class Workspace extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get stateAdjustment() {
|
get stateAdjustment() {
|
||||||
return this.layout_manager.stateAdjustment;
|
return this._container.layout_manager.stateAdjustment;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user