Skip to content

csspanels@dr.drummie: Add new extension#924

Closed
drdrummie wants to merge 19 commits into
linuxmint:masterfrom
drdrummie:master
Closed

csspanels@dr.drummie: Add new extension#924
drdrummie wants to merge 19 commits into
linuxmint:masterfrom
drdrummie:master

Conversation

@drdrummie
Copy link
Copy Markdown

csspanels@dr.drummie: Add new extension

A new Cinnamon extension that customizes the appearance of panels, popups, banners, and OSD elements using CSS blur effects.

This extension allows users to apply modern, blurred "glass" UI styles to various Cinnamon desktop components, offering enhanced personalization options.
While partially based on existing code, it introduces different functionality and additional customization features.

All usage instructions are provided in the README.md.

Updated credits section to include icon source.
Updated the troubleshooting section to include known issues and additional guidance.
- Updated the TransparencyManager class to handle and style multiple panels (style of "main" panel is propagated to other panels as well if they exist).
- Updated README.md.
- Added CHANGELOG.md.
- Updated translations (pot / po files).
- Added styling for tooltips and app switchers.
- Fixed known bugs and refactored most of the code.
- Updated README.md. and CHANGELOG.md.
- Updated translations (pot / po files).
- Improved logging and troubleshooting.
@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Dec 10, 2025

How do I get the blur working. I'm using Fluent cinnamon theme, and I reset the extension to default values, then turned on debug logging, and opened the panel context menu, and then the app menu. I got transparency but no blur. I got transparecy on the panel as well but no blur.

Details
Cjs-Message: 02:37:01.036: JS LOG: [LookingGlass/info] [CSSPanels] Debug logging changed to: true
Cjs-Message: 02:37:01.038: JS LOG: [LookingGlass/info] [CSSPanels] Debug logging changed to: true
Cjs-Message: 02:37:04.813: JS LOG: [LookingGlass/info] [CSSPanels] Detecting panel base color...: 
Cjs-Message: 02:37:04.813: JS LOG: [LookingGlass/info] [CSSPanels] Detected panel color: rgb(31, 31, 31): 
Cjs-Message: 02:37:04.813: JS LOG: [LookingGlass/info] [CSSPanels] Propagating detected panel color to popups: 
Cjs-Message: 02:37:04.813: JS LOG: [LookingGlass/info] [CSSPanels] Detecting theme border-radius...: 
Cjs-Message: 02:37:04.813: JS LOG: [LookingGlass/info] [CSSPanels] Element border-radius: 0px: 
Cjs-Message: 02:37:04.814: JS LOG: [LookingGlass/info] [CSSPanels] Attempting menu border-radius detection...: 
Cjs-Message: 02:37:04.814: JS LOG: [LookingGlass/info] [CSSPanels] Element border-radius: 0px: 
Cjs-Message: 02:37:04.814: JS LOG: [LookingGlass/info] [CSSPanels] No menu border-radius detected: 
Cjs-Message: 02:37:04.814: JS LOG: [LookingGlass/info] [CSSPanels] Theme uses flat design, not applying border radius: 
Cjs-Message: 02:37:04.815: JS LOG: [LookingGlass/info] [CSSPanels] Propagating detected panel color to popups: 

(cinnamon:1922997): St-WARNING **: 02:37:04.834: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.834: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.834: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.834: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.841: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.841: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.853: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:04.853: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:09.646: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:09.646: parse_shadow_property: default case
Cjs-Message: 02:37:09.815: JS LOG: [LookingGlass/info] [CSSPanels] [PopupStyler] [02:37:09] Popup menu restored with fade-out transition
Cjs-Message: 02:37:15.357: JS LOG: [LookingGlass/info] [CSSPanels] Detecting panel base color...: 
Cjs-Message: 02:37:15.357: JS LOG: [LookingGlass/info] [CSSPanels] Detected panel color: rgb(31, 31, 31): 
Cjs-Message: 02:37:15.357: JS LOG: [LookingGlass/info] [CSSPanels] Propagating detected panel color to popups: 
Cjs-Message: 02:37:15.357: JS LOG: [LookingGlass/info] [CSSPanels] Detecting theme border-radius...: 
Cjs-Message: 02:37:15.358: JS LOG: [LookingGlass/info] [CSSPanels] Element border-radius: 0px: 
Cjs-Message: 02:37:15.358: JS LOG: [LookingGlass/info] [CSSPanels] Attempting menu border-radius detection...: 
Cjs-Message: 02:37:15.358: JS LOG: [LookingGlass/info] [CSSPanels] Element border-radius: 0px: 
Cjs-Message: 02:37:15.358: JS LOG: [LookingGlass/info] [CSSPanels] No menu border-radius detected: 
Cjs-Message: 02:37:15.358: JS LOG: [LookingGlass/info] [CSSPanels] Theme uses flat design, not applying border radius: 
Cjs-Message: 02:37:15.359: JS LOG: [LookingGlass/info] [CSSPanels] Propagating detected panel color to popups: 

(cinnamon:1922997): St-WARNING **: 02:37:15.381: Ignoring length property that isn't a number at line 1449, col 11

(cinnamon:1922997): St-WARNING **: 02:37:15.385: Ignoring length property that isn't a number at line 1449, col 11

(cinnamon:1922997): St-WARNING **: 02:37:15.396: Ignoring length property that isn't a number at line 1449, col 11

(cinnamon:1922997): St-WARNING **: 02:37:15.402: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.402: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.403: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.403: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.403: Ignoring length property that isn't a number at line 1449, col 11

(cinnamon:1922997): St-WARNING **: 02:37:15.413: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.413: parse_shadow_property: default case

(cinnamon:1922997): St-WARNING **: 02:37:15.413: Ignoring length property that isn't a number at line 1449, col 11
Cjs-Message: 02:37:18.760: JS LOG: [LookingGlass/info] [CSSPanels] [PopupStyler] [02:37:18] Popup menu restored with fade-out transition

@drdrummie
Copy link
Copy Markdown
Author

@fredcw
Hello!
How did you get all this warnings? I have maybe few and only couple of them mention CSSPanels (if there are more panels on the screen and in hidden mode).. And for some warnings how to debug them (I would be grateful for insight)..
Blur "as real css blur" you can't get with CSS in Mint (as I know - some CSS properties are not parsed as they would be in i.e. Brave), that is the reason why i.e. BlurCinnamon uses shaders - I believe I wrote in readme "don't expect miracles because it is only css").. You could write "js blur" variant, but not sure how much resources would it take..
Btw. I have made some progress towards "more realistic blur effect", but don't currently have time to finish it (RL issues)..

@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Dec 10, 2025

@drdrummie Ah sorry, the warnings are nothing to do with your extension, I always get those the first time I open a context menu or app menu after restarting cinnamon.

I think that most people would install the extension specifically for the blur. If it doesn't have that then I think most people would be somewhat disappointed given what it says in the readme and description.

@drdrummie
Copy link
Copy Markdown
Author

@fredcw
I guess you're right, I should update readme and description, at least until I find some time to finish new version..
You know, I was "hot" for few weeks.. Now I almost forgot it that I posted it.. :)
I'm curious and since you tried it - does it have some value?

Tnx!

@claudiux claudiux marked this pull request as draft December 10, 2025 15:03
@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Dec 12, 2025

@drdrummie tbh, given that not all features work on most themes (especially the Mint themes), it might be frustrating to users unless it's specified which theme's it does work on. Another thing to consider is that many people won't read the readme before installing it through cinnamon's UI. This is just my opinion of course. I think it may have potential if it could be made to work reliably on most or nearly all themes.

…factor,

and Cinnamon Spices CI compliance fixes.

New features:
- Wallpaper color extraction (GdkPixbuf) with full-auto and manual modes
- Hover & active color override for panel applets and taskbar items
- Glow Effect Mode: inset / outset / none (replaces border-width approach)
- Desktop context menu styling
- Settings reorganized into 4 pages: Theme, Appearance, Visual Effects, Advanced

Architecture:
- 6 new modules: constants, signalHandler, themeUtils, colorPalette,
  wallpaperMonitor, hoverStyleManager
- Template-based CSS generation (blurTemplateManager)
- Error boundary pattern, LRU cache, debounced theme detection

CI/stability fixes:
- Removed forbidden metadata fields
- Monkey patch idempotency (disable() safe to call multiple times)
- OSD missing disable() fix (leaked monkey patch)
- settings.finalize() in disable()
- Removed untranslated .po files; Croatian (hr) translation maintained
@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 10 potential issue(s):

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/popupStyler.js:522

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:878

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:983

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

⚠️ sync_file_query_exists

csspanels@dr.drummie/files/csspanels@dr.drummie/popupStyler.js:520

if (!cssFile.query_exists(null)) continue;

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:872

if (!cssFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:978

if (!cssFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:450

if (!file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:479

if (!file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

ℹ️ shell_string_spawn

csspanels@dr.drummie/files/csspanels@dr.drummie/systemIndicator.js:56

Util.spawnCommandLine("cinnamon-settings extensions");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ sync_file_query_info

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:500

const info = file.query_info("standard::size,time::modified", Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.


Automated pattern check.

@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 10 potential issue(s):

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/popupStyler.js:522

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:878

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:983

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

⚠️ sync_file_query_exists

csspanels@dr.drummie/files/csspanels@dr.drummie/popupStyler.js:520

if (!cssFile.query_exists(null)) continue;

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:872

if (!cssFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:978

if (!cssFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:450

if (!file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:479

if (!file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

ℹ️ shell_string_spawn

csspanels@dr.drummie/files/csspanels@dr.drummie/systemIndicator.js:56

Util.spawnCommandLine("cinnamon-settings extensions");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ sync_file_query_info

csspanels@dr.drummie/files/csspanels@dr.drummie/wallpaperMonitor.js:500

const info = file.query_info("standard::size,time::modified", Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.


Automated pattern check.

…de, dark/light override

- Added desklet styling (transparency, blur, glow for desktop widgets)
- Added start menu sidebar styling (menu@cinnamon.org, disabled by default)
- Added dark/light mode override control for mixed-theme setups
- Added wallpaper extraction mode: Standard (weighted average) vs Contrast (polar tones)
- Added url field back to metadata.json (Cinnamon runtime requirement)
- Updated translations (pot/po files), added en.po
- Updated README: compatibility note, icon attribution, extension conflict warning
- Updated CHANGELOG
@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 2 potential issue(s):

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:885

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:990

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.


Automated pattern check.

- themeDetector: three-state cache prevents repeated sync GTK CSS file reads on the blurTemplateManager hot path
- extension.js, stylerBase.js: fix 2.0.7 regression where debug messages  were routed to logError/logWarning instead of global.log (info level)
- panelStyler: skipThemeRefresh flag avoids redundant _changeTheme() call during re-apply cycles
@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 2 potential issue(s):

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:885

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:997

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.


Automated pattern check.

…nager hover integration

- systemIndicator: left click now opens extension settings directly via xlet-settings
  (was: generic cinnamon-settings extensions manager)
- systemIndicator: removed manual enter-event/leave-event opacity handlers; indicator
  registered with HoverStyleManager on create, unregistered on destroy
- hoverStyleManager: added hookExternalActor(actor) / unhookExternalActor(actor) public
  API; external actors tracked in _externalActors[] and auto re-hooked on refresh()
- Updated CHANGELOG and README
@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 3 potential issue(s):

ℹ️ shell_string_spawn

csspanels@dr.drummie/files/csspanels@dr.drummie/systemIndicator.js:56

Util.spawnCommandLineAsync("xlet-settings extension csspanels@dr.drummie");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:885

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:997

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.


Automated pattern check.

@github-actions
Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 3 potential issue(s):

ℹ️ shell_string_spawn

csspanels@dr.drummie/files/csspanels@dr.drummie/systemIndicator.js:56

Util.spawnCommandLineAsync("xlet-settings extension csspanels@dr.drummie");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ sync_file_load_contents

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:885

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

csspanels@dr.drummie/files/csspanels@dr.drummie/themeDetector.js:997

const [success, contents] = cssFile.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.


Automated pattern check.

@drdrummie drdrummie marked this pull request as ready for review May 1, 2026 18:27
@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented May 4, 2026

Here's what Gemini thinks. I'm not saying I agree or disagree with any of this, I'm just posting it in case it contains any useful info:

This is a sophisticated and high-quality Pull Request. It is significantly more advanced than the average Cinnamon extension, resembling the architecture of complex GNOME extensions like Dash to Panel or Blur my Shell.

Here is a technical evaluation of the code and my recommendation for its inclusion in the cinnamon-spices-extensions repository.


1. Technical Evaluation

Pros (The Strengths)

  • Architecture: The code is exceptionally modular. The use of a StylerBase class and a centralized GlobalSignalsHandler shows a professional understanding of GObject-based development.
  • Memory Management: One of the biggest issues with Cinnamon extensions is memory leaks. This author explicitly manages run_dispose() on pixbufs (critical for image processing) and uses a robust signal handler to ensure all connections are disconnected when the extension is disabled.
  • Performance Optimization:
    • The BlurTemplateManager uses an LRU (Least Recently Used) cache for CSS strings to avoid re-generating complex CSS on every UI update.
    • Wallpaper analysis uses pixel sampling (grid steps) rather than checking every single pixel, which prevents the CPU from spiking during wallpaper changes.
  • Theming Logic: The ThemeUtils and ThemeDetector classes are impressive. They implement HSP (Highly Sensitive Poo) perceived brightness and WCAG contrast ratio calculations. This ensures that when the extension "auto-extracts" colors, the text remains readable.
  • User Experience: It provides a "Glow" system that replaces hardcoded borders, giving it a modern, "glassmorphism" look (macOS/Windows 11 style) that is currently missing from the default Cinnamon experience.

Cons (The Risks)

  • Heavy Use of Monkey Patching: To style the OSD (Volume/Brightness overlays), Alt-Tab switcher, and Notifications, the extension "monkey patches" (overwrites) core Cinnamon methods (e.g., AppSwitcher3D.prototype._init).
    • Risk: If the Cinnamon team updates the internal code of the appSwitcher in a future version (e.g., Cinnamon 6.4 or 7.0), this extension could cause the shell to crash or the Alt-Tab menu to disappear.
  • Maintenance Burden: Because it touches so many parts of the UI (Nemo, Alt-Tab, Desklets, Panels, OSDs), it is prone to "bit rot." It will require an active maintainer to fix it every time Cinnamon changes its internal JS API.

2. Is it suitable for the official cinnamon-spices repo?

The linuxmint/cinnamon-spices-extensions repository is the official "3rd party" hub. For a PR to be accepted there, it needs to follow specific standards.

My Verdict: Yes, it should be merged, but with specific caveats.

Why it fits:

  1. Code Standards: The code is cleaner and more "modern" than 80% of the extensions currently in the Spices repository. It uses ES6 classes and modular require statements properly.
  2. Feature Demand: "Blur" and "Transparency" are the most requested visual features for Cinnamon. This extension provides a "one-stop-shop" for these features, replacing 3-4 smaller, older extensions.
  3. Safety: The author has included "idempotent restore" logic. Even though they monkey patch, they check if they still "own" the patch before restoring it, which prevents conflicts with other extensions.

Potential Roadblocks for the Mint Team:

  • Review Time: The sheer volume of code (17+ files) is a lot for the Mint team to audit.
  • The "Nemo" integration: The extension attempts to style Nemo (the file manager) context menus. Since Nemo is a C-based app and the shell is JS, this type of integration can sometimes be finicky.

3. Suggestions for the PR Author

If you are the one submitting this or communicating with the author, here are a few suggestions to increase the chances of it being accepted by the Linux Mint maintainers:

  1. Strict Linting: Ensure the code passes eslint with the Cinnamon configuration.
  2. Cinnamon Version Guarding: Ensure the metadata.json strictly defines the cinnamon-version. The backdrop-filter CSS used requires relatively modern versions of the Cinnamon/Muffin compositor.
  3. Monkey Patch Documentation: Add comments in osdStyler.js and alttabStyler.js explaining why the patch is necessary (usually because Cinnamon lacks a native "style-changed" signal for those specific components).
  4. Localisation: The settings-schema.json is very detailed. Ensure that all strings are wrapped in the translation function (which the author already seems to have started in extension.js).

Final Summary

This is top-tier work. It brings a modern aesthetic to Cinnamon that usually requires a lot of manual CSS hacking. As long as the author is committed to maintaining it as Cinnamon evolves, it would be a "Crown Jewel" extension for the Cinnamon Spices ecosystem.

I think the extension should be versioned, i.e. put into a "6.6" subfolder so that it won't be loaded on cinnamon versions is hasn't been tested on? Apart from that this looks OK to me.

@rcalixte
Copy link
Copy Markdown
Member

rcalixte commented May 4, 2026

Here's what Gemini thinks.

Can I politely ask that we not do this? It's low-value noise and in general, I would like to discourage the habit. Let's keep this a platform where we interact with each other and not each other's LLMs.

@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented May 4, 2026

@rcalixte

It's low-value noise

I completely disagree. My comment is for informational purposes only. LLMs are invaluable in finding issues and problems and will only become more so in the future. It won't be long before LLM generated code will be far more reliable than human written code.

where we interact with each other and not each other's LLMs.

How am I not interacting? I looked at the code and It looks safe to me and safely undoes all it's changes when disabled. As long as it's versioned, I think it's fine, which is what I stated:

I think the extension should be versioned, i.e. put into a "6.6" subfolder so that it won't be loaded on cinnamon versions is hasn't been tested on? Apart from that this looks OK to me.

There is no LLM interaction here as far as I can see.

@drdrummie
Copy link
Copy Markdown
Author

drdrummie commented May 4, 2026 via email

@drdrummie
Copy link
Copy Markdown
Author

Just to explain why is there so many things:
After @fredcw first review I was little down knowing that he is right about functionality..
Needed to regroup and made CSSGnome for Zorin, so I started to rewrite CSSPanels similar to CSSGnomme approach. Found that it does work but was really tricky. Gave up again and tried to combine both.

Comment on lines +267 to +302
PANEL_OPACITY: "panel-opacity",
MENU_OPACITY: "menu-opacity",
BORDER_RADIUS: "border-radius",
AUTO_DETECT_RADIUS: "auto-detect-radius",
APPLY_PANEL_RADIUS: "apply-panel-radius",

// Color overrides
OVERRIDE_PANEL_COLOR: "override-panel-color",
CHOOSE_OVERRIDE_PANEL_COLOR: "choose-override-panel-color",
OVERRIDE_POPUP_COLOR: "override-popup-color",
CHOOSE_OVERRIDE_POPUP_COLOR: "choose-override-popup-color",

// Feature toggles
ENABLE_NOTIFICATION_STYLING: "enable-notification-styling",
ENABLE_OSD_STYLING: "enable-osd-styling",
ENABLE_TOOLTIP_STYLING: "enable-tooltip-styling",
ENABLE_ALTTAB_STYLING: "enable-alttab-styling",
ENABLE_APPMENU_SIDEBAR_STYLING: "enable-appmenu-sidebar-styling",
ENABLE_DESKTOP_CONTEXT_STYLING: "enable-desktop-context-styling",

// System
HIDE_TRAY_ICON: "hide-tray-icon",
DEBUG_LOGGING: "debug-logging",
DARK_LIGHT_OVERRIDE: "dark-light-override",

// Blur settings
BLUR_RADIUS: "blur-radius",
BLUR_SATURATE: "blur-saturate",
BLUR_CONTRAST: "blur-contrast",
BLUR_BRIGHTNESS: "blur-brightness",
BLUR_BACKGROUND: "blur-background",
BLUR_BORDER_COLOR: "blur-border-color",
BLUR_BORDER_WIDTH: "blur-border-width",
BLUR_TRANSITION: "blur-transition",
BLUR_OPACITY: "blur-opacity",
BLUR_TEMPLATE: "blur-template",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are all unused.

@mtwebster
Copy link
Copy Markdown
Member

Is this a fork of a gnome-shell extension? How does nemoPopupStyler.js work? Nemo is a Gtk application, and unaffected by any CSS in Cinnamon.

@drdrummie
Copy link
Copy Markdown
Author

@mtwebster Yip I know, I believe I've answered that in post(s) above yours..

@drdrummie drdrummie marked this pull request as draft May 5, 2026 09:04
@mtwebster
Copy link
Copy Markdown
Member

We're going to pass on this.

The only thing guaranteed to happen when I enable this extension is that I'll have an unusable desktop.

There are lots of theme warnings in .xsession-errors. I see a lot of unused code. This wastes peoples' time trying to review this. I get you're trying to re-use an existing project but it should still be kept as tidy as possible.

You're trying to do too much here, honestly. It's never going to work for all desktop elements, all third-party spices. Even with the native window-list applet, you can't touch the 'active' window, so it looks out of place from anything I set on the panel itself. You almost need a theme that is designed to be used with the extension - sort of a 'green screen' model that your customizations might be applied to - I don't know... but as it stands, I think someone will try this for a bit, get frustrated, then disable it.

@mtwebster mtwebster closed this May 5, 2026
@drdrummie
Copy link
Copy Markdown
Author

Ok, thank you for your time!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants