|
|
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 |
|