fix(theming): keep system color-scheme in sync on every dark mode change

Issue: #2357
This commit is contained in:
Lysec
2026-03-31 02:10:12 +02:00
parent 6d3ca58896
commit 90a5dd1cd8
3 changed files with 8 additions and 6 deletions
@@ -125,7 +125,7 @@ ColumnLayout {
onToggled: checked => {
Settings.data.colorSchemes.syncGsettings = checked;
if (checked)
ColorSchemeService.pushSystemColorScheme(true);
ColorSchemeService.pushSystemColorScheme();
}
}
@@ -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)
+4 -5
View File
@@ -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]);
}