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

64 lines
3.1 KiB
Bash
Executable file

#!/bin/bash
# switch-to-desktop — deckshift-login overlay of DeckShift's original.
#
# WHY THIS OVERLAY EXISTS: the original pkilled gamescope and slept BEFORE its
# final `systemctl restart sddm`. Killing gamescope ends the login session, and
# logind then kills the session's processes — including this very script (it
# is launched by the in-session keybind monitor) — so the restart never ran.
# Stock DeckShift got away with that because its PERMANENT Relogin=true
# autologin re-logged the user in anyway; with deckshift-login's one-shot
# autologin it left the SDDM greeter instead.
#
# Fix, copied from the os-session-select path that already works: do the
# cleanup, arm the one-shot switch, shut Steam down, then queue the SDDM
# restart as a detached root job (nohup + disown). The restart job runs inside
# PID 1, so it completes even though stopping SDDM kills this script and the
# rest of the gaming session — no manual pkill of gamescope needed.
if [[ ! -f /tmp/.gaming-session-active ]]; then
exit 0
fi
rm -f /tmp/.gaming-session-active
# SYNCHRONOUS POWER RESTORE — done first because the trap-based restore in
# gamescope-session-nm-wrapper can be SIGKILL'd by `systemctl restart sddm`
# before it completes, leaving CPU governor / power profile stuck at
# "performance". (Verbatim from DeckShift's original.)
SAVED_STATE_FILE="$HOME/.cache/deckshift/saved-state"
if [[ -f "$SAVED_STATE_FILE" ]]; then
# shellcheck disable=SC1090
source "$SAVED_STATE_FILE"
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo "${PRE_GAMING_CPU_GOVERNOR:-powersave}" > "$gov" 2>/dev/null
done
if command -v powerprofilesctl &>/dev/null && [[ -n "${PRE_GAMING_POWER_PROFILE:-}" ]]; then
sudo -n powerprofilesctl set "$PRE_GAMING_POWER_PROFILE" 2>/dev/null || \
powerprofilesctl set "$PRE_GAMING_POWER_PROFILE" 2>/dev/null
fi
rm -f "$SAVED_STATE_FILE"
fi
# Unmask suspend targets + daemon-reload (verbatim from DeckShift's original).
sudo -n systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null
sudo -n systemctl unmask --runtime sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null
sudo -n systemctl daemon-reload 2>/dev/null
# Arm the one-shot autologin back to the desktop BEFORE anything can kill us.
sudo -n /usr/local/bin/gaming-session-switch desktop 2>/dev/null || true
# Re-enable Bluetooth (verbatim from DeckShift's original).
sudo -n /usr/bin/rfkill unblock bluetooth 2>/dev/null || true
sudo -n /usr/bin/systemctl start bluetooth.service 2>/dev/null || true
# Portal-recovery marker for the next Hyprland startup (from the original;
# moved earlier so it is written even if session teardown kills this script).
touch /tmp/.deckshift-just-returned 2>/dev/null || true
# Give Steam a clean shutdown, then hand over to the SDDM restart. Stopping
# sddm.service tears down the whole gaming session (gamescope included) — the
# same mechanism the working Steam "Exit to Desktop" path relies on.
timeout 5 steam -shutdown 2>/dev/null || true
sleep 1
sudo -n chvt 2 2>/dev/null || true
nohup sudo -n systemctl restart sddm &>/dev/null &
disown
exit 0