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:
Florian Müllner 2021-02-17 20:13:22 +01:00
parent 7b1b04f95a
commit d3a1557864

View File

@ -1288,20 +1288,23 @@ 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;
// Compute the scale we'll need once everything is updated,
// unless we are currently transitioning
if (this._expandFraction === 1) {
const totalSpacing = (nWorkspaces - 1) * spacing;
const availableWidth = (box.get_width() - totalSpacing) / nWorkspaces; const availableWidth = (box.get_width() - totalSpacing) / nWorkspaces;
const hScale = availableWidth / portholeWidth; const hScale = availableWidth / portholeWidth;
const vScale = box.get_height() / portholeHeight; const vScale = box.get_height() / portholeHeight;
const newScale = Math.min(hScale, vScale); const newScale = Math.min(hScale, vScale);
if (newScale != this._targetScale) { if (newScale !== this._targetScale) {
if (this._targetScale > 0) { if (this._targetScale > 0) {
// We don't do the tween immediately because we need to observe the ordering // We don't ease immediately because we need to observe the
// in queueUpdateStates - if workspaces have been removed we need to slide them // ordering in queueUpdateStates - if workspaces have been
// out as the first thing. // removed we need to slide them out as the first thing.
this._targetScale = newScale; this._targetScale = newScale;
this._pendingScaleUpdate = true; this._pendingScaleUpdate = true;
} else { } else {
@ -1310,6 +1313,7 @@ var ThumbnailsBox = GObject.registerClass({
this._queueUpdateStates(); this._queueUpdateStates();
} }
}
const ratio = portholeWidth / portholeHeight; const ratio = portholeWidth / portholeHeight;
const thumbnailFullHeight = Math.round(portholeHeight * this._scale); const thumbnailFullHeight = Math.round(portholeHeight * this._scale);