[gnome-shell] AppMenuButton: Improve handling of signals



commit ee4f199a9ff9f302d01393c9b6b79a0a1680db8f
Author: Tim Lunn <tim feathertop org>
Date:   Mon Apr 22 09:49:14 2013 +1000

    AppMenuButton: Improve handling of signals
    
    If for some reason an extension needs to destroy the AppMenu object,
    currently it is not possible to do this cleanly due to these signals
    remaining connected.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=698531

 js/ui/panel.js | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)
---
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 5d2952c..332be12 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -289,10 +289,10 @@ const AppMenuButton = new Lang.Class({
         this._visible = !Main.overview.visible;
         if (!this._visible)
             this.actor.hide();
-        Main.overview.connect('hiding', Lang.bind(this, function () {
+        this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () {
             this.show();
         }));
-        Main.overview.connect('showing', Lang.bind(this, function () {
+        this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () {
             this.hide();
         }));
 
@@ -302,10 +302,12 @@ const AppMenuButton = new Lang.Class({
 
         let tracker = Shell.WindowTracker.get_default();
         let appSys = Shell.AppSystem.get_default();
-        tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
-        appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
-
-        global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
+        this._focusAppNotifyId =
+            tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
+        this._appStateChangedSignalId =
+            appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
+        this._switchWorkspaceNotifyId =
+            global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
 
         this._sync();
     },
@@ -643,6 +645,33 @@ const AppMenuButton = new Lang.Class({
 
         this.setMenu(menu);
         this._menuManager.addMenu(menu);
+    },
+
+    destroy: function() {
+        if (this._appStateChangedSignalId > 0) {
+            let appSys = Shell.AppSystem.get_default();
+            appSys.disconnect(this._appStateChangedSignalId);
+            this._appStateChangedSignalId = 0;
+        }
+        if (this._focusAppNotifyId > 0) {
+            let tracker = Shell.WindowTracker.get_default();
+            tracker.disconnect(this._focusAppNotifyId);
+            this._focusAppNotifyId = 0;
+        }
+        if (this._overviewHidingId > 0) {
+            Main.overview.disconnect(this._overviewHidingId);
+            this._overviewHidingId = 0;
+        }
+        if (this._overviewShowingId > 0) {
+            Main.overview.disconnect(this._overviewShowingId);
+            this._overviewShowingId = 0;
+        }
+        if (this._switchWorkspaceNotifyId > 0) {
+            global.window_manager.disconnect(this._switchWorkspaceNotifyId);
+            this._switchWorkspaceNotifyId = 0;
+        }
+
+        this.parent();
     }
 });
 


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