[gnome-shell] AppMenuButton: Improve handling of signals
- From: Tim Lunn <timl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] AppMenuButton: Improve handling of signals
- Date: Mon, 22 Apr 2013 00:15:28 +0000 (UTC)
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]