NoSignal-OS/os updates/deckshift-login/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

140 lines
7.4 KiB
Markdown
Executable file

# deckshift-login — full-session DeckShift gaming, password at boot
Keeps DeckShift's gaming model exactly as designed — a **dedicated, full
gamescope session** (`gamescope-session-steam-nm`), switched by rewriting
SDDM's autologin session and restarting SDDM — but fixes the login behaviour:
| Event | Stock DeckShift | With this component |
|-------|-----------------|---------------------|
| Cold boot | autologin, no password ever | **normal SDDM password login** |
| Desktop → Gaming (`Super+Shift+S`) | autologin into gaming session | same (one-shot autologin) |
| Gaming → Desktop (`Super+Shift+R` / Steam > Exit to Desktop) | autologin back to desktop | same (one-shot autologin) |
| SDDM crash / manual restart | autologin | password login |
## How it works
Stock DeckShift keeps a **permanent** `[Autologin]` drop-in
(`/etc/sddm.conf.d/zz-gaming-session.conf`, `Relogin=true`) and its
`gaming-session-switch` helper just flips the `Session=` line — so the box
never shows a password screen again.
This component makes the autologin **one-shot**:
- `gaming-session-switch` (drop-in replacement, same path + interface, so
DeckShift's `switch-to-gaming` / `switch-to-desktop` / `os-session-select`
and the existing sudoers rule keep working) writes the autologin drop-in
fresh on each switch (`Relogin=false`) **and arms a marker in `/run`**.
- `sddm-autologin-gate` runs as `ExecStartPre=` on `sddm.service` (systemd
drop-in): marker present → consume it, keep the autologin for that single
restart; marker absent (cold boot, crash, manual restart — `/run` is tmpfs)
→ delete the autologin drop-in, password greeter shows.
Also adds the `Super+Shift+S → /usr/local/bin/switch-to-gaming` Hyprland bind:
DeckShift appends its bind to `~/.config/hypr/bindings.conf`, an **Omarchy**
path that doesn't exist on caelestia, so on this system DeckShift silently
skips the keybind — this component adds it to
`~/.config/caelestia/hypr-user.conf` instead (replacing caelestia's
`Super+Shift+S` screenshot-freeze; region shots stay on
Print / Shift+Print / Super+Shift+Alt+S). No exit bind is needed on the
desktop side: exiting happens inside the gaming session (DeckShift's evdev
keybind monitor handles `Super+Shift+R`, and Steam > Power > Exit to Desktop
calls `/usr/lib/os-session-select`).
## Files
```
gaming-session-switch -> /usr/local/bin/ (replaces DeckShift's; root 755)
switch-to-desktop -> /usr/local/bin/ (replaces DeckShift's; root 755)
sddm-autologin-gate -> /usr/local/bin/ (root 755)
deckshift-autologin-gate.conf-> /etc/systemd/system/sddm.service.d/
os-session-select -> /usr/lib/ (DeckShift's original, restored
if something overwrote it)
install-deckshift-login.sh idempotent installer (needs sudo)
```
**`deckshift.sh` itself is never modified** — this component only overlays
files that deckshift.sh has already installed (same paths, same interfaces,
the existing sudoers rules keep applying). That is the contract: the ISO
mimics Omarchy's SDDM setup, stock DeckShift installs onto it unchanged, and
this overlay is applied after it.
**Why `switch-to-desktop` is overlaid too**: DeckShift's original pkills gamescope *before* its final
`systemctl restart sddm`. Killing gamescope ends the login session, and
logind then kills the session's processes — including the script itself (it
runs inside the gaming session, launched by the keybind monitor) — so the
restart never executes. Stock DeckShift survives this because its permanent
`Relogin=true` autologin re-logs the user in anyway; with one-shot autologin
it stranded the user at the greeter. The overlay keeps all of DeckShift's
cleanup (power-profile restore, suspend unmask, Bluetooth, portal marker,
Steam shutdown) but queues the SDDM restart as a detached root job — the
same pattern DeckShift's own `os-session-select` uses, which is why Steam's
"Exit to Desktop" worked all along — and lets the service stop tear down
gamescope.
The installer also **removes the withdrawn nested gaming-mode experiment**
(`nosignal-gaming-mode*` scripts, its launcher entry, and its
`# >>> gaming-mode (nested) >>>` bind block) if the box ever had it.
## Install (opt-in, post-install — in this order)
```sh
# 1. DeckShift first (gaming session, switch scripts, sudoers, keybind monitor)
sh ~/deckshift/deckshift.sh
# 2. then the login fix
sh ~/.local/share/nosignal/deckshift-login/install-deckshift-login.sh
```
**Re-run step 2 after any re-run of `deckshift.sh`** — deckshift.sh restores
its permanent-autologin `gaming-session-switch` and recreates the standing
autologin drop-in.
## Test
1. Reboot → SDDM **password** prompt (session: "Hyprland (uwsm-managed)").
2. `Super+Shift+S` → screen flickers (VT switch + SDDM restart) → Steam Big
Picture in a full gamescope session. No password asked.
3. Steam > Power > Exit to Desktop (or `Super+Shift+R`) → back to the Hyprland
desktop. No password asked.
4. Reboot again → password prompt is back (the switch autologin didn't stick).
5. `sudo systemctl restart sddm` from the desktop → password prompt (gate
cleans up; nothing autologins outside a real switch).
## Known quirks
- SDDM remembers the **last session** per user, so after a reboot from inside
Gaming Mode the greeter may preselect "Gaming Mode (ChimeraOS)" — pick
"Hyprland (uwsm-managed)" from the session menu.
- The switch necessarily restarts the whole graphical session: open desktop
apps close when entering Gaming Mode. That is inherent to DeckShift's
full-session design (and why it works better for games than a nested
window: gamescope owns the display, HDR/VRR/input pass through cleanly).
## Builder notes — how to put this in the ISO (opt-in, NOT pre-enabled)
1. **Bake the Omarchy-style SDDM setup — REQUIRED.** DeckShift's
switching is built on SDDM; the ISO must boot to an SDDM password greeter
with `hyprland-uwsm` as the default session and **no autologin baked**.
2. Copy `deckshift-login/` into the layer (lands at
`~/.local/share/nosignal/deckshift-login/`) + the copy-list line in
`nosignal-update/install-nosignal-update.sh`:
```sh
[ -d "$SRC/deckshift-login" ] && cp -a "$SRC/deckshift-login" "$DEST/"
```
3. Ship migration `1781395200-deckshift-login.sh` as-is — it is
**conditional**: it only (re-)applies where DeckShift is actually installed
(`/usr/local/bin/switch-to-gaming` exists), so `nosignal-update` keeps
opted-in boxes patched and is a no-op everywhere else.
4. Do **NOT** run deckshift.sh or this installer at build time, do **NOT**
bake the `# >>> deckshift gaming keys >>>` block into the shipped
`hypr-user.conf`, and do **NOT** bake steam/gamescope/DeckShift packages.
Gaming stays opt-in: the user runs `deckshift.sh` then this installer.
5. Prerequisites already in the base: `[multilib]` + the `omarchy-*` shims
(gaming-enablement) — deckshift.sh depends on both.
6. Drop the withdrawn `gaming-mode/` (nested) component entirely if any copy
is still in the builder tree; this component supersedes it.
7. Document in `NoSignal-keybindings.md`: `Super+Shift+S` = Gaming Mode
**only after opting in** (until then it stays caelestia's
screenshot-freeze); `Super+Shift+R` works inside Gaming Mode only.
8. Verify on a clean VM: install → password login; run deckshift.sh + this
installer → switch in/out of Gaming Mode with no password; reboot →
password login is back.