From 8c72c93aae57bfca10fc3cb9b1d5c4d509c6c5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 14 Feb 2015 03:18:52 +0100 Subject: [PATCH] messageTray: Skip banner mode when queue exceeds a threshold We want to shield users from being overloaded by an overwhelming stream of notification banners, either due to coming back from idle/lock or because an application is misbehaving. Previously we replaced all queued notifications with a summary notification in that case, but now that notifications appear in the summary immediately, we can simply stop adding them to the queue and rely on the date menu to convey that information to the user. https://bugzilla.gnome.org/show_bug.cgi?id=744850 --- js/ui/messageTray.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index eea354cf7..7dfa6c0f2 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -27,6 +27,8 @@ const NOTIFICATION_TIMEOUT = 4; const HIDE_TIMEOUT = 0.2; const LONGER_HIDE_TIMEOUT = 0.6; +const MAX_NOTIFICATIONS_IN_QUEUE = 3; + // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD // range from the point where it left the tray. const MOUSE_LEFT_ACTOR_THRESHOLD = 20; @@ -1550,12 +1552,19 @@ const MessageTray = new Lang.Class({ // we stop hiding it and show it again. this._updateShowingNotification(); } else if (this._notificationQueue.indexOf(notification) < 0) { - notification.connect('destroy', - Lang.bind(this, this._onNotificationDestroy)); - this._notificationQueue.push(notification); - this._notificationQueue.sort(function(notification1, notification2) { - return (notification2.urgency - notification1.urgency); - }); + // If the queue is "full", we skip banner mode and just show a small + // indicator in the panel; however do make an exception for CRITICAL + // notifications, as only banner mode allows expansion. + let bannerCount = this._notification ? 1 : 0; + let full = (this.queueCount + bannerCount >= MAX_NOTIFICATIONS_IN_QUEUE); + if (!full || notification.urgency == Urgency.CRITICAL) { + notification.connect('destroy', + Lang.bind(this, this._onNotificationDestroy)); + this._notificationQueue.push(notification); + this._notificationQueue.sort(function(notification1, notification2) { + return (notification2.urgency - notification1.urgency); + }); + } } this._updateState(); },