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

7.4 KiB
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)

# 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:
    [ -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.