Use _onDestroy() handlers for cleanup in delegates

Unify the style of <delegate>.destroy() methods to only contain a
call to <delegate>.actor.destroy() and handle additional cleanup
in a _onDestroy() signal handler.

https://bugzilla.gnome.org/show_bug.cgi?id=609454
This commit is contained in:
Florian Müllner 2010-02-18 16:43:58 +01:00
parent 0770fd5be5
commit 9f43ed3f95
3 changed files with 25 additions and 12 deletions

View File

@ -47,7 +47,7 @@ Lightbox.prototype = {
container.add_actor(this.actor); container.add_actor(this.actor);
this.actor.raise_top(); this.actor.raise_top();
this._destroySignalId = this.actor.connect('destroy', Lang.bind(this, this.destroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
if (width && height) { if (width && height) {
this.actor.width = width; this.actor.width = width;
@ -135,18 +135,24 @@ Lightbox.prototype = {
/** /**
* destroy: * destroy:
* *
* Destroys the lightbox. This is called automatically if the * Destroys the lightbox.
* lightbox's container is destroyed.
*/ */
destroy : function() { destroy : function() {
this.actor.destroy();
},
/**
* _onDestroy:
*
* This is called when the lightbox' actor is destroyed, either
* by destroying its container or by explicitly calling this.destroy().
*/
_onDestroy: function() {
if (this._allocationChangedSignalId != 0) if (this._allocationChangedSignalId != 0)
this._container.disconnect(this._allocationChangedSignalId); this._container.disconnect(this._allocationChangedSignalId);
this._container.disconnect(this._actorAddedSignalId); this._container.disconnect(this._actorAddedSignalId);
this._container.disconnect(this._actorRemovedSignalId); this._container.disconnect(this._actorRemovedSignalId);
this.actor.disconnect(this._destroySignalId);
this.highlight(null); this.highlight(null);
this.actor.destroy();
} }
}; };

View File

@ -581,6 +581,9 @@ Workspace.prototype = {
this.actor = new Clutter.Group(); this.actor = new Clutter.Group();
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
// Auto-sizing is unreliable in the presence of ClutterClone, so rather than // Auto-sizing is unreliable in the presence of ClutterClone, so rather than
// implicitly counting on the workspace actor to be sized to the size of the // implicitly counting on the workspace actor to be sized to the size of the
// included desktop actor clone, set the size explicitly to the screen size. // included desktop actor clone, set the size explicitly to the screen size.
@ -1330,10 +1333,11 @@ Workspace.prototype = {
}, },
destroy : function() { destroy : function() {
Tweener.removeTweens(this.actor);
this.actor.destroy(); this.actor.destroy();
this.actor = null; },
this._windowOverlaysGroup.destroy();
_onDestroy: function(actor) {
Tweener.removeTweens(actor);
this._metaWorkspace.disconnect(this._windowAddedId); this._metaWorkspace.disconnect(this._windowAddedId);
this._metaWorkspace.disconnect(this._windowRemovedId); this._metaWorkspace.disconnect(this._windowRemovedId);

View File

@ -39,6 +39,8 @@ GenericWorkspacesView.prototype = {
this.actor = new St.Bin({ style_class: "workspaces" }); this.actor = new St.Bin({ style_class: "workspaces" });
this._actor = new Clutter.Group(); this._actor = new Clutter.Group();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.add_actor(this._actor); this.actor.add_actor(this._actor);
this.actor.connect('style-changed', Lang.bind(this, this.actor.connect('style-changed', Lang.bind(this,
function() { function() {
@ -181,13 +183,14 @@ GenericWorkspacesView.prototype = {
}, },
destroy: function() { destroy: function() {
this.actor.destroy();
},
_onDestroy: function() {
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].destroy(); this._workspaces[w].destroy();
this._workspaces = []; this._workspaces = [];
this.actor.destroy();
this.actor = null;
Main.overview.disconnect(this._overviewShowingId); Main.overview.disconnect(this._overviewShowingId);
global.screen.disconnect(this._nWorkspacesNotifyId); global.screen.disconnect(this._nWorkspacesNotifyId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);