From ea8736b13ab57130650bfa193472a40b5df6dc4a 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 283a03174..851b9af95 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(); } });