From 05a5f4641c8ad6337ccb46e63abcaf27dd7eb852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 9 Jun 2020 19:42:21 +0200 Subject: [PATCH 1/4] popupMenu: Guard against non-menu-item children This avoid a harmless but annoying warning. --- js/ui/popupMenu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 11528560d..144c600d7 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -773,7 +773,8 @@ var PopupMenuBase = class { } _getMenuItems() { - return this.box.get_children().map(a => a._delegate).filter(item => { + const children = this.box.get_children().filter(a => a._delegate !== undefined); + return children.map(a => a._delegate).filter(item => { return item instanceof PopupBaseMenuItem || item instanceof PopupMenuSection; }); } -- 2.31.1 From e5b2c2b3cfd0443fa83fd1f6f56f65fefa5186c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 9 Jun 2020 19:48:06 +0200 Subject: [PATCH 2/4] st/shadow: Check pipeline when painting We shouldn't simply assume that st_shadow_helper_update() has been called before paint() or that the pipeline was created successfully. --- src/st/st-shadow.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/st/st-shadow.c b/src/st/st-shadow.c index ab3eaa856..d53808698 100644 --- a/src/st/st-shadow.c +++ b/src/st/st-shadow.c @@ -296,9 +296,10 @@ st_shadow_helper_paint (StShadowHelper *helper, ClutterActorBox *actor_box, guint8 paint_opacity) { - _st_paint_shadow_with_opacity (helper->shadow, - framebuffer, - helper->pipeline, - actor_box, - paint_opacity); + if (helper->pipeline != NULL) + _st_paint_shadow_with_opacity (helper->shadow, + framebuffer, + helper->pipeline, + actor_box, + paint_opacity); } -- 2.31.1 From 0f7656d85af51339d14217b9a673442a18df3de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 8 Jul 2021 19:10:05 +0200 Subject: [PATCH 3/4] 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 --- js/ui/messageTray.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 1dab00a70..ccf56fc5b 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -1022,17 +1022,20 @@ var MessageTray = GObject.registerClass({ } _onNotificationDestroy(notification) { - if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) { - this._updateNotificationTimeout(0); - this._notificationRemoved = true; - this._updateState(); - return; - } + this._notificationRemoved = this._notification === notification; - let index = this._notificationQueue.indexOf(notification); - if (index != -1) { - this._notificationQueue.splice(index, 1); - this.emit('queue-changed'); + if (this._notificationRemoved) { + if (this._notificationState === State.SHOWN || + this._notificationState === State.SHOWING) { + this._updateNotificationTimeout(0); + this._updateState(); + } + } else { + const index = this._notificationQueue.indexOf(notification); + if (index !== -1) { + this._notificationQueue.splice(index, 1); + this.emit('queue-changed'); + } } } -- 2.31.1 From 8652836521d0729ce230268c7b448cdb393d5b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 8 Jul 2021 19:23:38 +0200 Subject: [PATCH 4/4] shellInfo: Don't destroy source on undo Destroying the source from an action callback will result in the notification being destroyed twice: - source.destroy() destroys all its notifications - a notification destroys itself after an action was activated This results in unwanted log spam when attempting to dispose the notification for a second time. There is actually no good reason for destroying the source explicitly, as sources already self-destruct with their last notification. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4457 --- js/ui/overview.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/js/ui/overview.js b/js/ui/overview.js index 529779ea8..c71b11389 100644 --- a/js/ui/overview.js +++ b/js/ui/overview.js @@ -25,16 +25,6 @@ var OVERVIEW_ACTIVATION_TIMEOUT = 0.5; var ShellInfo = class { constructor() { this._source = null; - this._undoCallback = null; - } - - _onUndoClicked() { - if (this._undoCallback) - this._undoCallback(); - this._undoCallback = null; - - if (this._source) - this._source.destroy(); } setMessage(text, options) { @@ -64,9 +54,8 @@ var ShellInfo = class { notification.update(text, null, { clear: true }); } - this._undoCallback = undoCallback; if (undoCallback) - notification.addAction(_("Undo"), this._onUndoClicked.bind(this)); + notification.addAction(_('Undo'), () => undoCallback()); this._source.showNotification(notification); } -- 2.31.1