workspacesView: Interpolate against relative workspace boxes
The overview transition consists of getting the initial and final states of the overview adjustment, derivating various other internal states from them (such as the fit mode, opacities, translations, etc), and finally interpolating the allocation boxes. When interpolating between the fit mode, WorkspacesView uses the current allocation box to derivate the SINGLE and ALL fit mode boxes. However, that creates a curved path during overview transitions. What we really want to do here is calculate the fit mode box relative to the corresponding overview state. For example: +----------------+----------+------------------------+ | Overview State | Fit Mode | Workspaces geometry | +----------------+----------+------------------------+ | HIDDEN | SINGLE | Cover entire screen | | WINDOW PICKER | SINGLE | Between minimap & Dash | | APP GRID | ALL | 15% screen height | +----------------+----------+------------------------+ Using the table above as the reference, when the overview transitions between WINDOW PICKER and APP GRID, we must interpolate between (SINGLE fit mode @ between minimap & Dash) and (ALL fit mode @ 15% screen height). That way, we always interpolate the final boxes, which corrects the odd path that workspaces follow during this transition. Make the WorkspacesView of the primary monitor use these cached boxes when the overview is in the middle of a transition, and the fit modes of the initial and final state differ, to calculate the workspaces positions. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1624>
This commit is contained in:

committed by
Marge Bot

parent
9c6d8e2aad
commit
bf1fa3879f
@ -42,7 +42,7 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
|
||||
stateAdjustment.connect('notify::value', () => this.layout_changed());
|
||||
}
|
||||
|
||||
_getWorkspacesBoxForState(state, box, searchHeight, dashHeight, thumbnailsHeight) {
|
||||
_computeWorkspacesBoxForState(state, box, searchHeight, dashHeight, thumbnailsHeight) {
|
||||
const workspaceBox = box.copy();
|
||||
const [width, height] = workspaceBox.get_size();
|
||||
const { spacing } = this;
|
||||
@ -145,7 +145,7 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
|
||||
// Update cached boxes
|
||||
for (const state of Object.values(ControlsState)) {
|
||||
this._cachedWorkspaceBoxes.set(
|
||||
state, this._getWorkspacesBoxForState(state, ...params));
|
||||
state, this._computeWorkspacesBoxForState(state, ...params));
|
||||
}
|
||||
|
||||
let workspacesBox;
|
||||
@ -184,6 +184,10 @@ class ControlsManagerLayout extends Clutter.BoxLayout {
|
||||
|
||||
this._viewSelector.allocate(childBox);
|
||||
}
|
||||
|
||||
getWorkspacesBoxForState(state) {
|
||||
return this._cachedWorkspaceBoxes.get(state);
|
||||
}
|
||||
});
|
||||
|
||||
var OverviewAdjustment = GObject.registerClass(
|
||||
@ -288,6 +292,7 @@ class ControlsManager extends St.Widget {
|
||||
this._thumbnailsBox =
|
||||
new WorkspaceThumbnail.ThumbnailsBox(this._workspaceAdjustment);
|
||||
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(
|
||||
this,
|
||||
this._workspaceAdjustment,
|
||||
this._stateAdjustment);
|
||||
this._appDisplay = new AppDisplay.AppDisplay();
|
||||
@ -564,6 +569,10 @@ class ControlsManager extends St.Widget {
|
||||
});
|
||||
}
|
||||
|
||||
getWorkspacesBoxForState(state) {
|
||||
return this.layoutManager.getWorkspacesBoxForState(state);
|
||||
}
|
||||
|
||||
get searchEntry() {
|
||||
return this._searchEntry;
|
||||
}
|
||||
|
Reference in New Issue
Block a user