From 2bb8e1be9b5bda7368321d3625cb954c7047bc09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org> Date: Sat, 22 Feb 2020 16:35:32 +0100 Subject: [PATCH] environment: Handle reversed transition with 0 duration If a transition is reversed, the final property values will be the same as before the transition. However this currently only works correctly when we actually use a transition; to fix this with a duration of 0, simply skip the set() call when the transition is reversed. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1042 --- js/ui/environment.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/js/ui/environment.js b/js/ui/environment.js index 31440ea2a..ba378e7d1 100644 --- a/js/ui/environment.js +++ b/js/ui/environment.js @@ -111,6 +111,11 @@ function _easeActor(actor, params) { autoReverse = params.autoReverse; delete params.autoReverse; + // repeatCount doesn't include the initial iteration + const numIterations = repeatCount + 1; + // whether the transition should finish where it started + const isReversed = autoReverse && numIterations % 2 === 0; + if (params.mode != undefined) actor.set_easing_mode(params.mode); delete params.mode; @@ -122,7 +127,8 @@ function _easeActor(actor, params) { let animatedProps = Object.keys(params).map(p => p.replace('_', '-', 'g')); animatedProps.forEach(p => actor.remove_transition(p)); - actor.set(params); + if (actor.get_easing_duration() > 0 || !isReversed) + actor.set(params); actor.restore_easing_state(); let transition = animatedProps.map(p => actor.get_transition(p)) @@ -161,6 +167,11 @@ function _easeActorProperty(actor, propName, target, params) { autoReverse = params.autoReverse; delete params.autoReverse; + // repeatCount doesn't include the initial iteration + const numIterations = repeatCount + 1; + // whether the transition should finish where it started + const isReversed = autoReverse && numIterations % 2 === 0; + // Copy Clutter's behavior for implicit animations, see // should_skip_implicit_transition() if (actor instanceof Clutter.Actor && !actor.mapped) @@ -174,7 +185,9 @@ function _easeActorProperty(actor, propName, target, params) { if (duration == 0) { let [obj, prop] = _getPropertyTarget(actor, propName); - obj[prop] = target; + + if (!isReversed) + obj[prop] = target; Meta.disable_unredirect_for_display(global.display); callback(true);