MessageTray: fix reentrancy problem in hideNotificationCompleted

Hiding notificationWidget with a telepathy notification causes
unfocused to be emitted, which causes a reentrant updateState.
If another notification is queued, it is shown before the old
one is cleared.

https://bugzilla.gnome.org/show_bug.cgi?id=683986
This commit is contained in:
Giovanni Campagna 2012-12-22 16:02:19 +01:00
parent 8e231cb2ec
commit 85743ede7e

View File

@ -2270,7 +2270,7 @@ const MessageTray = new Lang.Class({
this._notificationClickedId = this._notification.connect('done-displaying', this._notificationClickedId = this._notification.connect('done-displaying',
Lang.bind(this, this._escapeTray)); Lang.bind(this, this._escapeTray));
this._notification.connect('unfocused', Lang.bind(this, function() { this._notificationUnfocusedId = this._notification.connect('unfocused', Lang.bind(this, function() {
this._updateState(); this._updateState();
})); }));
this._notificationBin.child = this._notification.actor; this._notificationBin.child = this._notification.actor;
@ -2410,19 +2410,22 @@ const MessageTray = new Lang.Class({
}, },
_hideNotificationCompleted: function() { _hideNotificationCompleted: function() {
this._notificationRemoved = false;
this._notificationWidget.hide();
this._closeButton.hide();
this._pointerInTray = false;
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
this._notificationBin.child = null;
this._notification.collapseCompleted(); this._notification.collapseCompleted();
this._notification.disconnect(this._notificationClickedId); this._notification.disconnect(this._notificationClickedId);
this._notificationClickedId = 0; this._notificationClickedId = 0;
this._notification.disconnect(this._notificationUnfocusedId);
this._notificationUnfocusedId = 0;
let notification = this._notification; let notification = this._notification;
this._notification = null; this._notification = null;
if (notification.isTransient) if (notification.isTransient)
notification.destroy(NotificationDestroyedReason.EXPIRED); notification.destroy(NotificationDestroyedReason.EXPIRED);
this._notificationRemoved = false;
this._closeButton.hide();
this._pointerInTray = false;
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
this._notificationBin.child = null;
this._notificationWidget.hide();
}, },
_expandActiveNotification: function() { _expandActiveNotification: function() {