From 7059e31f6a2a471a020a5908516813ff9443beda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 27 May 2019 23:18:34 -0500 Subject: [PATCH] background: Group 'changed' signal emission Background is monitoring the whole `org.gnome.desktop.background` gsettings keys for changes connecting to the non-specialized 'changed' signal and re-emitting this as-is. This means that when the background is changed via control-center, we get multiple 'changed' signal events from GSettings, and for each one of this we recreate a Background and a BackgroundActor. Avoid this by using an idle to delay the emission of the 'changed' signal grouping the events. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/558 --- js/ui/background.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/js/ui/background.js b/js/ui/background.js index d107fee1b..2a404ae9b 100644 --- a/js/ui/background.js +++ b/js/ui/background.js @@ -257,9 +257,8 @@ var Background = class Background { this._refreshAnimation(); }); - this._settingsChangedSignalId = this._settings.connect('changed', () => { - this.emit('changed'); - }); + this._settingsChangedSignalId = + this._settings.connect('changed', this._emitChangedSignal.bind(this)); this._load(); } @@ -290,6 +289,22 @@ var Background = class Background { if (this._settingsChangedSignalId != 0) this._settings.disconnect(this._settingsChangedSignalId); this._settingsChangedSignalId = 0; + + if (this._changedIdleId) { + GLib.source_remove(this._changedIdleId); + this._changedIdleId = 0; + } + } + + _emitChangedSignal() { + if (this._changedIdleId) + return; + + this._changedIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + this._changedIdleId = 0; + this.emit('changed'); + return GLib.SOURCE_REMOVE; + }); } updateResolution() { @@ -345,7 +360,7 @@ var Background = class Background { if (changedFile.equal(file)) { let imageCache = Meta.BackgroundImageCache.get_default(); imageCache.purge(changedFile); - this.emit('changed'); + this._emitChangedSignal(); } }); this._fileWatches[key] = signalId;