#!/bin/sh # nosignal-app-theme-sync — make external apps follow Caelestia's light/dark mode. # # Reads Caelestia's current mode (`caelestia scheme get` -> "Mode: dark|light") # and publishes it so toolkit apps follow: # * gsettings color-scheme -> xdg-desktop-portal(-gtk) org.freedesktop.appearance # => Chrome/Chromium, Electron, Firefox, GTK4/libadwaita, Qt6 all follow. # * GTK3 prefer-dark flag in gtk-3.0/gtk-4.0 settings.ini for legacy GTK apps # that don't read the portal. # Idempotent; safe to run repeatedly. Invoked at login and on scheme change by # the nosignal-app-theme .service/.path units. set -u mode=$(caelestia scheme get 2>/dev/null | awk -F': *' '/Mode:/{print tolower($2); exit}') case "$mode" in dark) cs=prefer-dark; pd=true ;; light) cs=prefer-light; pd=false ;; *) cs=default; pd=false ;; # unknown -> no preference esac # 1. master switch (portal): Chrome / Electron / Firefox / GTK4 / Qt6 if command -v gsettings >/dev/null 2>&1; then gsettings set org.gnome.desktop.interface color-scheme "$cs" 2>/dev/null || true fi # 2. legacy GTK3 (+GTK4) prefer-dark flag for apps that ignore the portal for v in 3.0 4.0; do d="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-$v"; f="$d/settings.ini" mkdir -p "$d" [ -f "$f" ] || printf '[Settings]\n' > "$f" grep -q '^\[Settings\]' "$f" || printf '[Settings]\n' >> "$f" if grep -q '^gtk-application-prefer-dark-theme' "$f"; then sed -i "s/^gtk-application-prefer-dark-theme.*/gtk-application-prefer-dark-theme=$pd/" "$f" else printf 'gtk-application-prefer-dark-theme=%s\n' "$pd" >> "$f" fi done echo "app-theme: caelestia mode=${mode:-unknown} -> color-scheme=$cs, gtk prefer-dark=$pd"