NoSignal-OS/os updates/sddm-theme/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

88 lines
4.4 KiB
Markdown
Executable file

# sddm-theme — login screen matching the desktop (palette, wallpaper, font)
A small Qt6 QML SDDM greeter theme ("caelestia") that mirrors the desktop:
- **Colours** come from the caelestia Material scheme
(`~/.local/state/caelestia/scheme.json`) — surface card, primary login
button, error colour, all from the live palette.
- **Background** is the user's current wallpaper (copied into the theme —
the greeter runs as the `sddm` user and cannot read the user's home).
- **Font** is the exact font the shell uses: **Google Sans Flex**, loaded by
file path from the shell's bundled asset
(`/etc/xdg/quickshell/caelestia/assets/google-sans-flex/…ttf`), falling
back to **Rubik** (system-installed) if that file moves.
Layout: big clock + date, centered card with username/password, primary
"Log in" button, a session cycler line ("Session: … ⟳", click to cycle),
and Sleep/Restart/Shut down text buttons bottom-right (only shown when SDDM
reports the action is allowed). Pure QtQuick — no QtQuick.Controls styles,
no SddmComponents, so there are no style dependencies to break.
**Gaming sessions are hidden from the greeter.** Gaming Mode is entered from
the desktop only (`Super+Shift+S` → DeckShift switch); logging
into a gamescope session from the login screen would bypass that flow. The
cycler filters out any session matching `gaming|gamescope|steam|big picture`
(covers "Gaming Mode (ChimeraOS)" and both "Steam Big Picture" entries), and
if SDDM's remembered last session is a gamescope one (it is, right after a
reboot from Gaming Mode) the selection snaps to the first desktop session
instead of preselecting it.
## Files
```
caelestia/Main.qml the theme (pure QtQuick, Qt6)
caelestia/metadata.desktop theme metadata (QtVersion=6)
caelestia/theme.conf default colours = foam-sea scheme
sddm-theme-sync -> /usr/local/bin (root): regenerates theme.conf +
background from the live scheme/wallpaper
install-sddm-theme.sh idempotent installer (needs sudo)
```
Theme installs to `/usr/share/sddm/themes/caelestia`; selected via the
drop-in `/etc/sddm.conf.d/20-sddm-theme.conf` (`[Theme] Current=caelestia`).
Remove that drop-in to fall back to SDDM's default greeter.
## Install / test
```sh
sh install-sddm-theme.sh # installs + runs the initial sync (sudo)
sddm-greeter-qt6 --test-mode --theme /usr/share/sddm/themes/caelestia # preview, no logout
sudo sddm-theme-sync # re-sync after changing wallpaper
```
Verified in test mode on the box (renders correctly, no QML errors).
## Keeping it in sync with wallpaper changes
The greeter is a snapshot: it matches the scheme as of the last
`sddm-theme-sync`. The installer runs one sync; after the user changes
wallpaper the login screen keeps the old look until `sudo sddm-theme-sync`
is run again. Good follow-up for the builder: hook the sync into the
wallpaper-change path (e.g. a polkit-less systemd path unit watching the
scheme state file, or a sudoers rule + caelestia hook) — left out here to
keep the component simple and safe.
## Builder notes — how to put this in the ISO
1. Integrate the standard way: component → layer
(`~/.local/share/nosignal/sddm-theme/`), migration
`1781398800-sddm-theme.sh``nosignal-update/migrations/`, copy-list line:
```sh
[ -d "$SRC/sddm-theme" ] && cp -a "$SRC/sddm-theme" "$DEST/"
```
2. **Bake the theme into the image** (this one IS applied at build time,
unlike the opt-in Gaming Mode): theme dir to `/usr/share/sddm/themes/caelestia`, sync
script to `/usr/local/bin/`, the `20-sddm-theme.conf` drop-in to
`/etc/sddm.conf.d/`.
3. **Seed the background at build time**: copy the default wallpaper
(foam-sea.png) to
`/usr/share/sddm/themes/caelestia/backgrounds/wallpaper.png`. The shipped
`theme.conf` already carries the foam-sea palette, so the greeter matches
the default desktop on first boot before any user sync has run.
4. The theme requires the caelestia shell's Google Sans Flex asset path; if
the shell tree moves under the project rename, update `fontFile=` in
`theme.conf` (sync script too) — Rubik fallback covers any breakage.
5. No package delta (qt6 QML comes with sddm; `jq` already in base).
6. Verify on a clean VM: first boot greeter = foam-sea background, Material
card, Google Sans font; change wallpaper in the desktop → run
`sudo sddm-theme-sync` → greeter follows.