Temporarily mutes all notification banners, including CRITICAL ones, for a chosen number of minutes. Start it reactively from a control on an ill-timed banner, or proactively from a persistent panel indicator. Missed notifications accumulate in GNOME's queue and pop up as a burst when the timer ends or you end it early. Suppression uses MessageTray's own bannerBlocked, guarded against GNOME's panel logic that would otherwise lift it. Works on GNOME 45-50.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
1. Why are you checking for `box.add_child` on line 60 `lib/bannerControl.js`? 2. Are you using AI? Why are you using `constructor` on line 18 `extension.js`? [EGO Review Guidelines: AI](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#extensions-must-not-be-ai-generated) 3. Why are you checking for `tray._updateState` on line 19 `lib/extension.js`? If it's not there why are you adding the shell version to support?
Hi, all my extensions I desigh myseld and I use AI for coding. Sorry, I didn't know about AI rule. 1. box.add_child (lib/bannerControl.js:60): a defensive guard while locating the banner's top-level vbox to attach the "mute" button. On 45-50 banner.get_first_child() is always the St.BoxLayout column, which always has add_child, so the typeof check is redundant. I'll drop it. 2. constructor (extension.js:18): tray.constructor.prototype is just how I reached the MessageTray prototype to override _showNotification via InjectionManager; it isn't a class constructor. I'll switch to the canonical direct import (MessageTray.MessageTray.prototype). 3. tray._updateState (extension.js:19): another defensive guard. The controller calls _updateState() after toggling bannerBlocked. I've verified _updateState and bannerBlocked exist in gnome-shell 45 through 50, so the declared 45-50 support is correct and the check is unnecessary. I'll remove it.