[gnome-shell/gnome-3-30] osdWindow: Disconnect signals on destroy



commit 5ee0f743de69c2a5ad9ec3ba3a3d5cbe82ffa214
Author: Florian Müllner <fmuellner gnome org>
Date:   Sun Sep 23 01:06:21 2018 +0000

    osdWindow: Disconnect signals on destroy
    
    Since we started to show OSD windows on all monitors, OSD windows are
    destroyed when the corresponding monitor is disconnected. We shouldn't
    leave any signal handlers around in that case - they prevent the object
    from being garbage collected, and trigger warnings for accessing proper-
    ties of invalidated GObjects.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/602
    
    
    (cherry picked from commit 8566ec2ee5a793715b2a1def8dcf83787bc857b6)

 js/ui/osdWindow.js | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)
---
diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js
index fb6587be0..d7077a063 100644
--- a/js/ui/osdWindow.js
+++ b/js/ui/osdWindow.js
@@ -118,15 +118,30 @@ var OsdWindow = new Lang.Class({
         this._hideTimeoutId = 0;
         this._reset();
 
-        Main.layoutManager.connect('monitors-changed',
-                                   this._relayout.bind(this));
+        this.actor.connect('destroy', this._onDestroy.bind(this));
+
+        this._monitorsChangedId =
+            Main.layoutManager.connect('monitors-changed',
+                                       this._relayout.bind(this));
         let themeContext = St.ThemeContext.get_for_stage(global.stage);
-        themeContext.connect('notify::scale-factor',
-                             this._relayout.bind(this));
+        this._scaleChangedId =
+            themeContext.connect('notify::scale-factor',
+                                 this._relayout.bind(this));
         this._relayout();
         Main.uiGroup.add_child(this.actor);
     },
 
+    _onDestroy() {
+        if (this._monitorsChangedId)
+            Main.layoutManager.disconnect(this._monitorsChangedId);
+        this._monitorsChangedId = 0;
+
+        let themeContext = St.ThemeContext.get_for_stage(global.stage);
+        if (this._scaleChangedId)
+            themeContext.disconnect(this._scaleChangedId);
+        this._scaleChangedId = 0;
+    },
+
     setIcon(icon) {
         this._icon.gicon = icon;
     },


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]