From 90a5dd1cd8f4eb64c78c4450f364d9009a929dab Mon Sep 17 00:00:00 2001 From: Lysec Date: Tue, 31 Mar 2026 02:10:12 +0200 Subject: [PATCH] fix(theming): keep system color-scheme in sync on every dark mode change Issue: #2357 --- .../Panels/Settings/Tabs/ColorScheme/ColorsSubTab.qml | 2 +- Scripts/python/src/theming/gtk-refresh.py | 3 +++ Services/Theming/ColorSchemeService.qml | 9 ++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Modules/Panels/Settings/Tabs/ColorScheme/ColorsSubTab.qml b/Modules/Panels/Settings/Tabs/ColorScheme/ColorsSubTab.qml index cefbe9386..37891d1f4 100644 --- a/Modules/Panels/Settings/Tabs/ColorScheme/ColorsSubTab.qml +++ b/Modules/Panels/Settings/Tabs/ColorScheme/ColorsSubTab.qml @@ -125,7 +125,7 @@ ColumnLayout { onToggled: checked => { Settings.data.colorSchemes.syncGsettings = checked; if (checked) - ColorSchemeService.pushSystemColorScheme(true); + ColorSchemeService.pushSystemColorScheme(); } } diff --git a/Scripts/python/src/theming/gtk-refresh.py b/Scripts/python/src/theming/gtk-refresh.py index 316f99ce2..5a4b080e3 100644 --- a/Scripts/python/src/theming/gtk-refresh.py +++ b/Scripts/python/src/theming/gtk-refresh.py @@ -177,6 +177,9 @@ async def main(): await sync_system_appearance(mode, update_gtk_theme=True) print("GTK colors applied successfully") else: + # Still push light/dark preference so portal/GTK apps follow the shell even when + # gtk.css / noctalia.css setup failed. + await sync_system_appearance(mode, update_gtk_theme=False) sys.exit(1) diff --git a/Services/Theming/ColorSchemeService.qml b/Services/Theming/ColorSchemeService.qml index bd81470e0..8120ac3de 100644 --- a/Services/Theming/ColorSchemeService.qml +++ b/Services/Theming/ColorSchemeService.qml @@ -18,13 +18,12 @@ Singleton { property string colorsJsonFilePath: Settings.configDir + "colors.json" readonly property string gtkRefreshScript: Quickshell.shellDir + "/Scripts/python/src/theming/gtk-refresh.py" - // force: when true, always push (e.g. user enabled "Sync system theme"). When false/omitted, - // skip if the GTK template is enabled so we do not race its post-hook on every darkMode flip. - function pushSystemColorScheme(force) { + // Push org.gnome.desktop.interface color-scheme whenever sync is on (including on every + // darkMode change). GTK template post-hook still updates gtk-theme and CSS; this path only + // sets prefer-light/prefer-dark so apps like Firefox stay in sync even if CSS steps fail. + function pushSystemColorScheme() { if (!Settings.data.colorSchemes.syncGsettings) return; - if (!force && TemplateProcessor.isTemplateEnabled("gtk")) - return; const mode = Settings.data.colorSchemes.darkMode ? "dark" : "light"; Quickshell.execDetached(["python3", gtkRefreshScript, "--appearance-only", mode]); }