From ee4f199a9ff9f302d01393c9b6b79a0a1680db8f Mon Sep 17 00:00:00 2001 From: Tim Lunn Date: Mon, 22 Apr 2013 09:49:14 +1000 Subject: [PATCH] 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 5d2952cf7..332be12b1 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(); } });