messageTray: Always remove destroyed banners

Currently we only mark the banner as removed if it is destroyed
while in SHOWN or SHOWING state, but not if we're already HIDING
(for example in response to `NotificationBanner::done-displaying`).

If this happens, we'll try to destroy the notification again at
the end of the transition, which leads to (harmless but annoying)
log spam since Notifications were turned into GObjects (that are
disposed when destroyed).

Address this by always marking destroyed banners as removed, while
still only triggering a state update while shown (or in the process
of being shown).

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1908>
This commit is contained in:
Florian Müllner 2021-07-08 19:10:05 +02:00 committed by Marge Bot
parent 850d2a33a8
commit 1f4eea12a5

View File

@ -1022,17 +1022,20 @@ var MessageTray = GObject.registerClass({
} }
_onNotificationDestroy(notification) { _onNotificationDestroy(notification) {
if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) { this._notificationRemoved = this._notification === notification;
this._updateNotificationTimeout(0);
this._notificationRemoved = true;
this._updateState();
return;
}
let index = this._notificationQueue.indexOf(notification); if (this._notificationRemoved) {
if (index != -1) { if (this._notificationState === State.SHOWN ||
this._notificationQueue.splice(index, 1); this._notificationState === State.SHOWING) {
this.emit('queue-changed'); this._updateNotificationTimeout(0);
this._updateState();
}
} else {
const index = this._notificationQueue.indexOf(notification);
if (index !== -1) {
this._notificationQueue.splice(index, 1);
this.emit('queue-changed');
}
} }
} }