From ea4d5f89eb01c4cb4ec92840adef576cf13af0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 14 Jun 2019 17:48:16 +0300 Subject: [PATCH] animation: Stop the animation before removing all the children If the resource scale or the scale factor changes while the animation is playing, we need to stop the animation and start it again once the texture is loaded, as the idle might try to access an invalidated animation child otherwise. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700 --- js/ui/animation.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/js/ui/animation.js b/js/ui/animation.js index d66eaa404..528fb8220 100644 --- a/js/ui/animation.js +++ b/js/ui/animation.js @@ -54,12 +54,19 @@ var Animation = class { _loadFile(file, width, height) { let [validResourceScale, resourceScale] = this.actor.get_resource_scale(); + let wasPlaying = this._isPlaying; + + if (this._isPlaying) + this.stop(); this._isLoaded = false; this.actor.destroy_all_children(); - if (!validResourceScale) + if (!validResourceScale) { + if (wasPlaying) + this.play(); return; + } let textureCache = St.TextureCache.get_default(); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; @@ -67,6 +74,9 @@ var Animation = class { scaleFactor, resourceScale, this._animationsLoaded.bind(this)); this.actor.set_child(this._animations); + + if (wasPlaying) + this.play(); } _showFrame(frame) {