Blame SOURCES/0010-userWidget-Disconnect-signal-connections-on-destroy.patch

efe155
From 477e87ac1a1a99cd4d7a9ee7bb789975e9fc1fbf Mon Sep 17 00:00:00 2001
efe155
From: Ray Strode <rstrode@redhat.com>
efe155
Date: Mon, 28 Sep 2020 22:28:08 -0400
efe155
Subject: [PATCH 10/13] userWidget: Disconnect signal connections on destroy
efe155
efe155
At the moment an Avatar (and StIcon) are getting leaked
efe155
every time the screen is locked.
efe155
efe155
This is because the Avatar class sets up a global signal
efe155
connection that prevents the object from getting garbage
efe155
collected when its actor is destroyed.
efe155
efe155
This commit adds a destroy handler to disconnect the
efe155
signal connection.
efe155
---
efe155
 js/ui/userWidget.js | 12 +++++++++++-
efe155
 1 file changed, 11 insertions(+), 1 deletion(-)
efe155
efe155
diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js
efe155
index 4e1ce25e9..0a80fa672 100644
efe155
--- a/js/ui/userWidget.js
efe155
+++ b/js/ui/userWidget.js
efe155
@@ -9,63 +9,73 @@ const Gio = imports.gi.Gio;
efe155
 const GObject = imports.gi.GObject;
efe155
 const Lang = imports.lang;
efe155
 const St = imports.gi.St;
efe155
 
efe155
 const Params = imports.misc.params;
efe155
 
efe155
 var AVATAR_ICON_SIZE = 64;
efe155
 
efe155
 // Adapted from gdm/gui/user-switch-applet/applet.c
efe155
 //
efe155
 // Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
efe155
 // Copyright (C) 2008,2009 Red Hat, Inc.
efe155
 
efe155
 var Avatar = new Lang.Class({
efe155
     Name: 'Avatar',
efe155
 
efe155
     _init(user, params) {
efe155
         this._user = user;
efe155
         params = Params.parse(params, { reactive: false,
efe155
                                         iconSize: AVATAR_ICON_SIZE,
efe155
                                         styleClass: 'framed-user-icon' });
efe155
         this._iconSize = params.iconSize;
efe155
 
efe155
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
efe155
         this.actor = new St.Bin({ style_class: params.styleClass,
efe155
                                   track_hover: params.reactive,
efe155
                                   reactive: params.reactive,
efe155
                                   width: this._iconSize * scaleFactor,
efe155
                                   height: this._iconSize * scaleFactor });
efe155
 
efe155
+        this.actor.connect('destroy', this._onDestroy.bind(this));
efe155
+
efe155
         // Monitor the scaling factor to make sure we recreate the avatar when needed.
efe155
         let themeContext = St.ThemeContext.get_for_stage(global.stage);
efe155
-        themeContext.connect('notify::scale-factor', this.update.bind(this));
efe155
+        this._scaleFactorChangedId = themeContext.connect('notify::scale-factor', this.update.bind(this));
efe155
+    },
efe155
+
efe155
+    _onDestroy() {
efe155
+        if (this._scaleFactorChangedId != 0) {
efe155
+            let themeContext = St.ThemeContext.get_for_stage(global.stage);
efe155
+            themeContext.disconnect(this._scaleFactorChangedId);
efe155
+            this._scaleFactorChangedId = 0;
efe155
+        }
efe155
     },
efe155
 
efe155
     setSensitive(sensitive) {
efe155
         this.actor.can_focus = sensitive;
efe155
         this.actor.reactive = sensitive;
efe155
     },
efe155
 
efe155
     update() {
efe155
         let iconFile = this._user.get_icon_file();
efe155
         if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS))
efe155
             iconFile = null;
efe155
 
efe155
         if (iconFile) {
efe155
             let file = Gio.File.new_for_path(iconFile);
efe155
             this.actor.child = null;
efe155
             this.actor.style = 'background-image: url("%s");'.format(iconFile);
efe155
         } else {
efe155
             this.actor.style = null;
efe155
             this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
efe155
                                              icon_size: this._iconSize });
efe155
         }
efe155
 
efe155
         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
efe155
         this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor);
efe155
     }
efe155
 });
efe155
 
efe155
 var UserWidgetLabel = new Lang.Class({
efe155
     Name: 'UserWidgetLabel',
efe155
     Extends: St.Widget,
efe155
-- 
efe155
2.25.1
efe155