workspaceThumbnail: Do not update scale while collapsing
The scale property tracks the relative size at which we display thumbnails given the space we have available. That assumes that the allocation represents that available space, but it will actually be smaller while the minimap itself is collapsing. Luckily we have an easy option to avoid a distorted scale: Just don't update it while collapsing. We expect scale changes when adding or removing thumbnails, but as we freeze those during transitions, we can do the same with the scale. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3739 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1696>
This commit is contained in:
parent
7b1b04f95a
commit
d3a1557864
@ -1288,27 +1288,31 @@ var ThumbnailsBox = GObject.registerClass({
|
|||||||
const portholeHeight = this._porthole.height;
|
const portholeHeight = this._porthole.height;
|
||||||
const spacing = themeNode.get_length('spacing');
|
const spacing = themeNode.get_length('spacing');
|
||||||
|
|
||||||
// Compute the scale we'll need once everything is updated
|
|
||||||
const nWorkspaces = this._thumbnails.length;
|
const nWorkspaces = this._thumbnails.length;
|
||||||
let totalSpacing = (nWorkspaces - 1) * spacing;
|
|
||||||
const availableWidth = (box.get_width() - totalSpacing) / nWorkspaces;
|
|
||||||
|
|
||||||
const hScale = availableWidth / portholeWidth;
|
// Compute the scale we'll need once everything is updated,
|
||||||
const vScale = box.get_height() / portholeHeight;
|
// unless we are currently transitioning
|
||||||
const newScale = Math.min(hScale, vScale);
|
if (this._expandFraction === 1) {
|
||||||
|
const totalSpacing = (nWorkspaces - 1) * spacing;
|
||||||
|
const availableWidth = (box.get_width() - totalSpacing) / nWorkspaces;
|
||||||
|
|
||||||
if (newScale != this._targetScale) {
|
const hScale = availableWidth / portholeWidth;
|
||||||
if (this._targetScale > 0) {
|
const vScale = box.get_height() / portholeHeight;
|
||||||
// We don't do the tween immediately because we need to observe the ordering
|
const newScale = Math.min(hScale, vScale);
|
||||||
// in queueUpdateStates - if workspaces have been removed we need to slide them
|
|
||||||
// out as the first thing.
|
if (newScale !== this._targetScale) {
|
||||||
this._targetScale = newScale;
|
if (this._targetScale > 0) {
|
||||||
this._pendingScaleUpdate = true;
|
// We don't ease immediately because we need to observe the
|
||||||
} else {
|
// ordering in queueUpdateStates - if workspaces have been
|
||||||
this._targetScale = this._scale = newScale;
|
// removed we need to slide them out as the first thing.
|
||||||
|
this._targetScale = newScale;
|
||||||
|
this._pendingScaleUpdate = true;
|
||||||
|
} else {
|
||||||
|
this._targetScale = this._scale = newScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._queueUpdateStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._queueUpdateStates();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const ratio = portholeWidth / portholeHeight;
|
const ratio = portholeWidth / portholeHeight;
|
||||||
|
Loading…
Reference in New Issue
Block a user