[gnome-shell/gnome-3-8] AppMenuButton: Improve handling of signals
- From: Tim Lunn <timl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gnome-3-8] AppMenuButton: Improve handling of signals
- Date: Wed, 1 May 2013 08:35:04 +0000 (UTC)
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]