From 68bc03bc17d527e2e50e6b44bcc693c40238619a Mon Sep 17 00:00:00 2001 From: Foxlike Creature <124364698+FoxlikeCreature@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:55:47 +0700 Subject: [PATCH] feat: allow overriding icon theme via cli.json (#106) * theme: allow overriding Qt icon theme via cli.json Papirus colors XDG special folders (Downloads, Pictures, Music, etc.) differently from regular ones - they end up a different color while everything else stays neutral. With themes like breeze-dark, all folder icons share the same style, so everything looks consistent. Add optional `iconTheme` field to the `theme` section of cli.json. When set, it replaces the Papirus icon theme in the generated qtengine config with the specified theme. Example usage in cli.json: "theme": { "iconTheme": "breeze-dark" } * theme: allow overriding Qt and GTK icon theme via cli.json Some folders in Dolphin end up with Papirus-style icons while others use the default theme icons, resulting in two different icon styles mixed together in the same view. Dolphin's default folder icons take their color directly from the active color scheme, so they always match the theme exactly - Papirus has a fixed, limited palette and does not always match. Add optional iconThemeDark and iconThemeLight fields to the theme section of cli.json. When set, they override the Papirus icon theme in both the generated qtengine config and the GTK dconf setting. A generic iconTheme field is also supported as a fallback for both modes. Example usage in cli.json: "theme": { "iconThemeDark": "breeze-dark", "iconThemeLight": "breeze" } --------- Co-authored-by: Foxlike Creature --- src/caelestia/utils/theme.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/caelestia/utils/theme.py b/src/caelestia/utils/theme.py index 0addb83..2fdafd3 100644 --- a/src/caelestia/utils/theme.py +++ b/src/caelestia/utils/theme.py @@ -302,7 +302,7 @@ def _determine_hue_color(r: int, g: int, b: int, brightness: int, use_pale: bool @log_exception -def apply_gtk(colours: dict[str, str], mode: str) -> None: +def apply_gtk(colours: dict[str, str], mode: str, icon_theme: str | None = None) -> None: gtk_template = gen_replace(colours, templates_dir / "gtk.css", hash=True) thunar_template = gen_replace(colours, templates_dir / "thunar.css", hash=True) @@ -313,18 +313,21 @@ def apply_gtk(colours: dict[str, str], mode: str) -> None: subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/gtk-theme", "'adw-gtk3-dark'"]) subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", f"'prefer-{mode}'"]) - subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/icon-theme", f"'Papirus-{mode.capitalize()}'"]) + gtk_icon_theme = icon_theme if icon_theme is not None else f"Papirus-{mode.capitalize()}" + subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/icon-theme", f"'{gtk_icon_theme}'"]) sync_papirus_colors(colours["primary"]) @log_exception -def apply_qt(colours: dict[str, str], mode: str) -> None: +def apply_qt(colours: dict[str, str], mode: str, icon_theme: str | None = None) -> None: colours = gen_replace(colours, templates_dir / f"qt{mode}.colors", hash=True) write_file(config_dir / "qtengine/caelestia.colors", colours) config = (templates_dir / "qtengine.json").read_text() config = config.replace("{{ $mode }}", mode.capitalize()) + if icon_theme is not None: + config = config.replace(f'"iconTheme": "Papirus-{mode.capitalize()}"', f'"iconTheme": "{icon_theme}"') write_file(config_dir / "qtengine/config.json", config) @@ -438,10 +441,11 @@ def apply_colours(colours: dict[str, str], mode: str) -> None: apply_nvtop(colours) if check("enableHtop"): apply_htop(colours) + icon_theme = cfg.get(f"iconTheme{mode.capitalize()}") or cfg.get("iconTheme") if check("enableGtk"): - apply_gtk(colours, mode) + apply_gtk(colours, mode, icon_theme) if check("enableQt"): - apply_qt(colours, mode) + apply_qt(colours, mode, icon_theme) if check("enableWarp"): apply_warp(colours, mode) if check("enableChromium"):