NoSignal-OS/os updates/app-theme-awareness/README.md
28allday 19fd794b6b NoSignal — fully-offline Arch → Hyprland desktop installer
Single-script builder (nosignal.sh) that turns a stock Arch Linux ISO into a
fully-offline installer for a themed Hyprland + caelestia (Quickshell) desktop:
matching SDDM greeter, Btrfs/Limine bootable snapshots, chwd-style GPU
detection, and a curated "os updates" layer (keybind cheatsheet, settings
panels, system polish, on-box management skill). See README.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:03:10 +01:00

3.2 KiB
Executable file

app-theme-awareness

User-level, no root.

Goal

Make external apps (Chrome/Chromium, Electron, Firefox, GTK, Qt) follow Caelestia's light/dark mode automatically — dark when Caelestia is dark.

Why they don't today

Modern apps read one signal: org.freedesktop.appearancecolor-scheme, published by xdg-desktop-portal. By default that value is 0 ("no preference") because nothing sets it — gsettings org.gnome.desktop.interface color-scheme is 'default'. So every app defaults to light. All portal pieces are already installed (xdg-desktop-portal, -gtk, -hyprland); libadwaita is present.

How this works

  • nosignal-app-theme-sync: reads caelestia scheme get ("Mode: dark| light") and sets:
    • gsettings org.gnome.desktop.interface color-schemeprefer-dark / prefer-light. xdg-desktop-portal-gtk republishes this as the freedesktop appearance color-scheme, which Chrome, Electron, Firefox, GTK4/libadwaita and Qt6 honor (UI + web prefer-color-scheme).
    • gtk-application-prefer-dark-theme in gtk-3.0/gtk-4.0 settings.ini for legacy GTK3 apps that ignore the portal.
  • nosignal-app-theme.path + .service (user units, mirroring NoSignal's hyprmoncfgd-rescan.path): watch ~/.local/state/caelestia/scheme.json and re-run the sync on every scheme change, and run it once at login. So flipping Caelestia light↔dark flips the apps live.
  • portals.conf: pins the Settings portal backend to gtk (keeping Hyprland's portal default for screencast), so the appearance value is served reliably. Installed only if the user has no portals.conf.

install-app-theme-awareness.sh does all of it idempotently — entirely user-level (no root, no pacman hook).

Per-app notes

  • Chrome/Chromium (Wayland): follows the portal automatically. If the UI stays light, set chrome://settings → Appearance → GTK / "Use system".
  • Qt: QT_QPA_PLATFORMTHEME=qtengine is already set; Qt6 honors the portal. Old Qt5 apps may need a dark qt5ct/Kvantum style (out of scope).
  • GTK3 dark fidelity: prefer-dark uses Adwaita's built-in dark rendering. For a fuller dark GTK3 theme the builder can add gnome-themes-extra (ships Adwaita-dark) — optional.

Builder integration

Ship the sync script in the layer bin, the two user units (enabled by default, like the other NoSignal user units), and seed portals.conf. Ideally Caelestia itself could set color-scheme when its scheme flips; until then these units bridge it. Mode is read from caelestia scheme get, so it tracks the dynamic Material scheme.

Verify (after install)

caelestia scheme set -m light   # or via the Caelestia UI
gsettings get org.gnome.desktop.interface color-scheme   # -> 'prefer-light'
caelestia scheme set -m dark
gsettings get org.gnome.desktop.interface color-scheme   # -> 'prefer-dark'
# Chrome/GTK apps follow within a moment.

Files

  • nosignal-app-theme-sync — mode → portal/GTK sync.
  • nosignal-app-theme.service / .path — login run + watch-on-change.
  • portals.conf — Settings backend = gtk.
  • install-app-theme-awareness.sh — idempotent user-level installer.
  • migrations/1781442000-app-theme-awareness.sh — delegates to it.