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:
parent
8e231cb2ec
commit
85743ede7e
@ -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() {
|
||||||
|
Loading…
Reference in New Issue
Block a user