messageTray: Limit number of notifications per source

While applications can no longer spam the users with a constant stream
of banner notifications, it is still possible to drown the summary in
the message list. Avoid this by limiting the number of notifications a
single source is allowed to display simultaniously.

test-xy-stress in libnotify's tests suddenly became fun again ...

https://bugzilla.gnome.org/show_bug.cgi?id=744850
This commit is contained in:
Florian Müllner 2015-02-14 00:06:11 +01:00
parent 8c72c93aae
commit 4eff643d59

View File

@ -28,6 +28,7 @@ const HIDE_TIMEOUT = 0.2;
const LONGER_HIDE_TIMEOUT = 0.6; const LONGER_HIDE_TIMEOUT = 0.6;
const MAX_NOTIFICATIONS_IN_QUEUE = 3; const MAX_NOTIFICATIONS_IN_QUEUE = 3;
const MAX_NOTIFICATIONS_PER_SOURCE = 3;
// We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD
// range from the point where it left the tray. // range from the point where it left the tray.
@ -43,10 +44,10 @@ const State = {
}; };
// These reasons are useful when we destroy the notifications received through // These reasons are useful when we destroy the notifications received through
// the notification daemon. We use EXPIRED for transient notifications that the // the notification daemon. We use EXPIRED for notifications that we dismiss
// user did not interact with, DISMISSED for all other notifications that were // and the user did not interact with, DISMISSED for all other notifications
// destroyed as a result of a user action, and SOURCE_CLOSED for the notifications // that were destroyed as a result of a user action, and SOURCE_CLOSED for the
// that were requested to be destroyed by the associated source. // notifications that were requested to be destroyed by the associated source.
const NotificationDestroyedReason = { const NotificationDestroyedReason = {
EXPIRED: 1, EXPIRED: 1,
DISMISSED: 2, DISMISSED: 2,
@ -1304,6 +1305,9 @@ const Source = new Lang.Class({
if (this.notifications.indexOf(notification) >= 0) if (this.notifications.indexOf(notification) >= 0)
return; return;
while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
this.notifications.shift().destroy(NotificationDestroyedReason.EXPIRED);
notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy)); notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy));
notification.connect('acknowledged-changed', Lang.bind(this, this.countUpdated)); notification.connect('acknowledged-changed', Lang.bind(this, this.countUpdated));
this.notifications.push(notification); this.notifications.push(notification);