From 2beca14b8d4b4aaf7a656b5cab332986dae304ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 4 Feb 2021 21:14:42 +0100 Subject: [PATCH] windowPreview: Tie icon scale to overview state Scaling the icons all the way from/to 0 is a relatively big transition, which is fairly distracting when playing simultaneously for multiple previews after reaching the WINDOW_PICKER state. Instead, tie the scale to the overview state itself, so that the animations runs in parallel. Part-of: --- js/ui/windowPreview.js | 43 +++++++++++++++++++++++++++++------------- js/ui/workspace.js | 2 +- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/js/ui/windowPreview.js b/js/ui/windowPreview.js index b40222de0..12215e052 100644 --- a/js/ui/windowPreview.js +++ b/js/ui/windowPreview.js @@ -5,6 +5,7 @@ const { Atk, Clutter, GLib, GObject, Graphene, Meta, Pango, Shell, St } = imports.gi; const DND = imports.ui.dnd; +const OverviewControls = imports.ui.overviewControls; var WINDOW_DND_SIZE = 256; @@ -209,11 +210,12 @@ var WindowPreview = GObject.registerClass({ 'size-changed': {}, }, }, class WindowPreview extends St.Widget { - _init(metaWindow, workspace) { + _init(metaWindow, workspace, overviewAdjustment) { this.metaWindow = metaWindow; this.metaWindow._delegate = this; this._windowActor = metaWindow.get_compositor_private(); this._workspace = workspace; + this._overviewAdjustment = overviewAdjustment; super._init({ reactive: true, @@ -377,6 +379,12 @@ var WindowPreview = GObject.registerClass({ this.add_child(this._icon); this.add_child(this._closeButton); + this._adjustmentChangedId = + this._overviewAdjustment.connect('notify::value', () => { + this._updateIconScale(); + }); + this._updateIconScale(); + this.connect('notify::realized', () => { if (!this.realized) return; @@ -413,6 +421,22 @@ var WindowPreview = GObject.registerClass({ child.allocate_available_size(0, 0, box.get_width(), box.get_height()); } + _updateIconScale() { + const { ControlsState } = OverviewControls; + const { currentState, initialState, finalState } = + this._overviewAdjustment.getStateTransitionParams(); + const visible = + initialState === ControlsState.WINDOW_PICKER || + finalState === ControlsState.WINDOW_PICKER; + const scale = visible + ? 1 - Math.abs(ControlsState.WINDOW_PICKER - currentState) : 0; + + this._icon.set({ + scale_x: scale, + scale_y: scale, + }); + } + _windowCanClose() { return this.metaWindow.can_close() && !this._hasAttachedDialogs(); @@ -641,18 +665,6 @@ var WindowPreview = GObject.registerClass({ this._overlayEnabled = enabled; this.notify('overlay-enabled'); - this._icon.set({ - scale_x: enabled ? 0 : 1, - scale_y: enabled ? 0 : 1, - }); - this._icon.show(); - this._icon.ease({ - scale_x: enabled ? 1.0 : 0, - scale_y: enabled ? 1.0 : 0, - duration: enabled ? WINDOW_OVERLAY_FADE_TIME : 0, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - if (!enabled) this.hideOverlay(false); else if (this['has-pointer'] || global.stage.key_focus === this) @@ -706,6 +718,11 @@ var WindowPreview = GObject.registerClass({ this._idleHideOverlayId = 0; } + if (this._adjustmentChangedId > 0) { + this._overviewAdjustment.disconnect(this._adjustmentChangedId); + this._adjustmentChangedId = 0; + } + if (this.inDrag) { this.emit('drag-end'); this.inDrag = false; diff --git a/js/ui/workspace.js b/js/ui/workspace.js index 5e3213e4a..f9f9e51ee 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -1237,7 +1237,7 @@ class Workspace extends St.Widget { // Create a clone of a (non-desktop) window and add it to the window list _addWindowClone(metaWindow) { - let clone = new WindowPreview(metaWindow, this); + let clone = new WindowPreview(metaWindow, this, this._overviewAdjustment); clone.connect('selected', this._onCloneSelected.bind(this));