[gnome-shell/gnome-3-8] AppMenuButton: Improve handling of signals



commit ea8736b13ab57130650bfa193472a40b5df6dc4a
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 files changed, 35 insertions(+), 6 deletions(-)
---
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 283a031..851b9af 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();
     },
@@ -637,6 +639,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]