#!/bin/bash # # setup-gamescope-boot-gnome.sh # # GNOME/GDM equivalent of theupriser/cachyos-gamescope-boot, scoped to boot # mechanics only (no Vapor theme / wallpaper / icon work). # # CONFIRMED (by reading CachyOS/gamescope-session source directly) that # gamescope-session-cachyos's own session-switching tooling is KDE-only: # # 1. /usr/lib/steamos/steam-set-session hardcodes a case statement over # plasmalogin/sddm and silently `exit 0`s (no error!) for any other # display manager, including GDM. This is called both by # steamos-session-select AND by the packaged system service # cachyos-gamescope-autologin.service - so under GDM, both are # currently silent no-ops. # 2. /usr/bin/steamos-session-select additionally shells out to # `qdbus6 org.kde.Shutdown /Shutdown org.kde.Shutdown.logout`, a # KDE-Plasma-specific D-Bus call with no GNOME/Mutter equivalent. # # FIX APPROACH: this script replaces those two files directly at their real # paths (/usr/lib/steamos/steam-set-session, /usr/bin/steamos-session-select) # with GDM-aware versions, so Steam's own "Switch to Desktop" button (which # calls these by path) works unmodified - no separate parallel tool needed. # No upstream PR is filed and nothing is submitted to any other repo; this is # a purely local override. # # SURVIVING PACKAGE UPDATES: a `pacman -Syu` of gamescope-session-cachyos # would normally overwrite these back to the broken originals. To make the # fix self-healing at the system level without manual reapplication, a # persistent source-of-truth copy is kept under /usr/local/share/gamescope-gdm-fix # (a path pacman never touches), and a pacman hook # (/etc/pacman.d/hooks/95-gamescope-gdm-fix.hook) automatically re-applies it # via PostTransaction every time that package is installed or upgraded. # # Also configures: # - GDM autologin as the target user (AutomaticLoginEnable/AutomaticLogin) # for the initial boot. # - Deck-style "reset to gamescope after any desktop logout", i.e. the # actual GDM analog of plasmalogin's Relogin=true. VERIFIED (via GDM bug # reports, not guessed) that GDM's own AutomaticLoginEnable/TimedLogin # ONLY apply once at daemon startup and do NOT reliably re-arm after a # logout - see e.g. https://bugs.launchpad.net/ubuntu/+source/gdm/+bug/499337 # and https://discussion.fedoraproject.org/t/gnome-wayland-automatic-login-for-single-application-mode-kiosk-mode-is-not-working-after-log-out/109453 . # The workaround that's actually used is restarting gdm.service itself, # which forces it to re-evaluate AutomaticLoginEnable from scratch - the # same trick the KDE original performs explicitly via # `systemctl restart plasmalogin` in its own desktop shortcut. Here it's # wired to fire automatically on every logout via a user-level systemd # unit bound to that user's own shutdown.target. # - The user's default session via AccountsService # (/var/lib/AccountsService/users/), which is what GDM actually # reads - written by the fixed steam-set-session. # - Steam's background-autostart systemd user unit (DE-agnostic fix, # ported unchanged from the KDE original's step 8b, minus the KWin-only # env var) so the Steam Controller virtual keyboard (Steam+X) keeps # working in desktop mode. # - A plain "Return to Gaming Mode" desktop launcher (no custom icon/theme) # that calls the now-working `steamos-session-select gamescope`. # # Explicitly NOT done here: Vapor theme, wallpaper, icon cache, launcher # icon theming - out of scope per request. # # Safe to re-run: idempotent, backs up files before editing. set -uo pipefail # ---------- helpers ---------- c_reset="\033[0m"; c_bold="\033[1m"; c_green="\033[32m"; c_yellow="\033[33m"; c_red="\033[31m"; c_cyan="\033[36m" info() { echo -e "${c_cyan}[INFO]${c_reset} $*"; } ok() { echo -e "${c_green}[OK]${c_reset} $*"; } warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; } err() { echo -e "${c_red}[ERROR] $*${c_reset}" >&2; } ask_yn() { local prompt="$1" default="${2:-y}" reply local hint="[Y/n]"; [[ "$default" == "n" ]] && hint="[y/N]" read -rp "$(echo -e "${c_bold}${prompt}${c_reset} ${hint} ")" reply reply="${reply:-$default}" [[ "$reply" =~ ^[Yy]$ ]] } require_root_helper() { if [[ $EUID -eq 0 && -z "${SUDO_USER:-}" ]]; then err "Please run this script as your normal user (it will call sudo itself), not directly as root." exit 1 fi } backup_file() { local f="$1" if [[ -f "$f" && ! -f "${f}.bak-gamescope-wizard-gnome" ]]; then sudo cp -a "$f" "${f}.bak-gamescope-wizard-gnome" info "Backed up $f -> ${f}.bak-gamescope-wizard-gnome" fi } # Find the wayland-sessions/xsessions desktop entry gamescope-session-cachyos # ships, and print its session ID (filename minus .desktop) via stdout. find_gamescope_session_id() { local f for f in /usr/share/wayland-sessions/*gamescope*.desktop /usr/share/xsessions/*gamescope*.desktop; do [[ -f "$f" ]] || continue basename "$f" .desktop return 0 done return 1 } # Find the GNOME desktop-mode session entry (name varies: gnome.desktop, # gnome-xorg.desktop, etc). Falls back to "gnome" if nothing is found. find_gnome_session_id() { local f for f in /usr/share/wayland-sessions/gnome*.desktop /usr/share/xsessions/gnome*.desktop; do [[ -f "$f" ]] || continue basename "$f" .desktop return 0 done echo "gnome" } # ---------- start ---------- require_root_helper echo -e "${c_bold}CachyOS Steam Deck-style Gamescope Boot Wizard (GNOME/GDM)${c_reset}" echo "Boot mechanics only, self-healing via a pacman hook. No theming, no upstream PR." echo if ! command -v pacman >/dev/null 2>&1; then err "This doesn't look like an Arch/CachyOS system (no pacman found). Aborting." exit 1 fi TARGET_USER="${SUDO_USER:-$USER}" read -rp "$(echo -e "${c_bold}Which user should autologin into gamescope?${c_reset} [${TARGET_USER}] ")" input_user TARGET_USER="${input_user:-$TARGET_USER}" if ! id "$TARGET_USER" >/dev/null 2>&1; then err "User '$TARGET_USER' does not exist on this system." exit 1 fi user_home="$(eval echo "~$TARGET_USER")" ok "Using user: $TARGET_USER" echo # ---------- 1. Login manager check ---------- DM="$(systemctl show -p Id --value display-manager 2>/dev/null | sed 's/\.service$//')" info "Detected display manager: ${DM:-none}" if [[ "$DM" != "gdm" ]]; then warn "This wizard targets GDM. Detected display manager is '${DM:-unknown}'." warn "If you're on plasma-login-manager/SDDM + KDE, use the original KDE wizard instead." ask_yn "Continue anyway?" n || exit 0 fi echo # ---------- 2. Install packages ---------- info "Checking required packages: gamescope-session-cachyos, steam, mangohud, accountsservice" MISSING=() for pkg in gamescope-session-cachyos steam mangohud accountsservice; do pacman -Qi "$pkg" >/dev/null 2>&1 || MISSING+=("$pkg") done if [[ ${#MISSING[@]} -gt 0 ]]; then info "Missing packages: ${MISSING[*]}" if ask_yn "Install them now?"; then sudo pacman -S --needed "${MISSING[@]}" else err "Cannot continue without these packages." exit 1 fi else ok "All required packages already installed." fi echo # ---------- 3. Verify gamescope has a GDM-visible session entry ---------- info "Looking for a gamescope session entry under /usr/share/wayland-sessions or /usr/share/xsessions" GAMESCOPE_SESSION_ID="" if GAMESCOPE_SESSION_ID="$(find_gamescope_session_id)"; then ok "Found session: $GAMESCOPE_SESSION_ID" else err "No gamescope *.desktop entry found under /usr/share/wayland-sessions or /usr/share/xsessions." err "gamescope-session-cachyos isn't exposing a session for GDM to list. Aborting." exit 1 fi GNOME_SESSION_ID="$(find_gnome_session_id)" info "Desktop-mode session detected as: $GNOME_SESSION_ID" echo # ---------- 4. Configure GDM autologin ---------- CUSTOM_CONF="/etc/gdm/custom.conf" info "Configuring $CUSTOM_CONF for autologin as $TARGET_USER" backup_file "$CUSTOM_CONF" sudo touch "$CUSTOM_CONF" if ! grep -q '^\[daemon\]' "$CUSTOM_CONF"; then sudo tee -a "$CUSTOM_CONF" > /dev/null <<< "[daemon]" fi set_daemon_key() { local key="$1" value="$2" if sudo grep -q "^${key}=" "$CUSTOM_CONF"; then sudo sed -i "s|^${key}=.*|${key}=${value}|" "$CUSTOM_CONF" else sudo awk -v k="$key" -v v="$value" ' /^\[daemon\]/ && !done { print; print k"="v; done=1; next } { print } ' "$CUSTOM_CONF" | sudo tee "${CUSTOM_CONF}.tmp" > /dev/null sudo mv "${CUSTOM_CONF}.tmp" "$CUSTOM_CONF" fi } set_daemon_key "AutomaticLoginEnable" "True" set_daemon_key "AutomaticLogin" "$TARGET_USER" # NOT using TimedLoginEnable as a Relogin=true stand-in: confirmed via GDM # bug reports (see header) that it does not reliably re-arm after a logout. # The actual re-login-after-logout mechanism is step 5 below. ok "GDM autologin config written:" sudo sed -n '/\[daemon\]/,/^\[/p' "$CUSTOM_CONF" | head -n -1 2>/dev/null || sudo cat "$CUSTOM_CONF" echo # ---------- 5. Re-login after logout (real Relogin=true equivalent) ---------- # # GDM only evaluates AutomaticLoginEnable when gdm.service itself starts, not # on every logout (confirmed - see header links). Restarting gdm.service # forces that re-evaluation, so it will log the autologin user straight back # in. Fires automatically on every logout via a user-level systemd unit bound # to that user's own shutdown.target, so it covers both this script's own # toggle tool and an ordinary desktop logout uniformly. SUDOERS_FILE="/etc/sudoers.d/99-gamescope-gdm-relogin" info "Installing a narrow sudoers rule so $TARGET_USER can restart gdm.service without a password" sudo tee "$SUDOERS_FILE" > /dev/null << EOF $TARGET_USER ALL=(root) NOPASSWD: /usr/bin/systemctl restart gdm.service EOF sudo chmod 440 "$SUDOERS_FILE" if ! sudo visudo -c -f "$SUDOERS_FILE" >/dev/null 2>&1; then err "Generated sudoers file failed validation - removing it." sudo rm -f "$SUDOERS_FILE" exit 1 fi ok "Sudoers rule installed and validated." RELOGIN_UNIT_DIR="$user_home/.config/systemd/user" sudo -u "$TARGET_USER" mkdir -p "$RELOGIN_UNIT_DIR" sudo -u "$TARGET_USER" tee "$RELOGIN_UNIT_DIR/gamescope-gdm-relogin.service" > /dev/null << 'EOF' [Unit] Description=Restart GDM on logout so it re-triggers autologin (Deck-style relogin) DefaultDependencies=no Before=shutdown.target [Service] Type=oneshot ExecStart=/usr/bin/sudo /usr/bin/systemctl restart gdm.service [Install] WantedBy=shutdown.target EOF sudo -u "$TARGET_USER" XDG_RUNTIME_DIR="/run/user/$(id -u "$TARGET_USER")" systemctl --user daemon-reload sudo -u "$TARGET_USER" XDG_RUNTIME_DIR="/run/user/$(id -u "$TARGET_USER")" systemctl --user enable gamescope-gdm-relogin.service ok "Relogin-on-logout unit installed and enabled." echo # ---------- 6. GDM-aware steam-set-session / steamos-session-select, self-healing ---------- # # Rather than filing anything upstream, this replaces the two KDE-only files # with our own GDM-aware versions directly at their real paths, so Steam's # own "Switch to Desktop" button (which calls these by path) works # unmodified. To survive a `pacman -Syu` of gamescope-session-cachyos # overwriting them back to the broken originals, a persistent source-of-truth # copy is kept under /usr/local/share (never touched by pacman) and a pacman # hook re-applies it automatically after every install/upgrade of that # package - fully self-healing, no manual reapplication, no upstream PR. FIX_SHARE_DIR="/usr/local/share/gamescope-gdm-fix" STEAM_SET_SESSION="/usr/lib/steamos/steam-set-session" SESSION_SELECT="/usr/bin/steamos-session-select" info "Installing GDM-aware steam-set-session / steamos-session-select as persistent source of truth" sudo mkdir -p "$FIX_SHARE_DIR" sudo tee "$FIX_SHARE_DIR/steam-set-session" > /dev/null << 'STEAM_SET_SESSION_EOF' #!/bin/bash set -e DISPLAY_MANAGER="$(systemctl show -p Id --value display-manager)" DM_ID="${DISPLAY_MANAGER%.service}" # Session, gamescope or plasma SESSION="${1:-gamescope-session.desktop}" case "$DM_ID" in plasmalogin) CONF_FILE="/etc/plasmalogin.conf.d/zz-steamos-autologin.conf";; sddm) CONF_FILE="/etc/sddm.conf.d/zz-steamos-autologin.conf";; gdm) # GDM has no conf.d-style autologin fragment to write - it reads a # per-user default session straight out of AccountsService. Write it # there instead, stripping the .desktop suffix that plasmalogin/sddm # keep (AccountsService's Session= key is the session ID, not a # filename). if [[ -n "${PKEXEC_UID:-}" ]]; then TARGET_USER="$(id -un "$PKEXEC_UID")" else TARGET_USER="$(logname 2>/dev/null || echo "${SUDO_USER:-}")" fi [[ -z "$TARGET_USER" ]] && exit 0 ACCOUNTS_FILE="/var/lib/AccountsService/users/$TARGET_USER" SESSION_ID="${SESSION%.desktop}" mkdir -p /var/lib/AccountsService/users touch "$ACCOUNTS_FILE" grep -q '^\[User\]' "$ACCOUNTS_FILE" || echo "[User]" >> "$ACCOUNTS_FILE" if grep -q '^Session=' "$ACCOUNTS_FILE"; then sed -i "s|^Session=.*|Session=$SESSION_ID|" "$ACCOUNTS_FILE" else sed -i "/^\[User\]/a Session=$SESSION_ID" "$ACCOUNTS_FILE" fi systemctl restart accounts-daemon 2>/dev/null || true exit 0 ;; esac # Don't do anything if system is using unsupported display manager [[ -z "$CONF_FILE" ]] && exit 0 if [[ ! -d "$(dirname "$CONF_FILE")" ]]; then mkdir -p "$(dirname "$CONF_FILE")" fi cat < "$CONF_FILE" [Autologin] Session=$SESSION INNEREOF STEAM_SET_SESSION_EOF sudo tee "$FIX_SHARE_DIR/steamos-session-select" > /dev/null << 'SESSION_SELECT_EOF' #!/bin/bash set -e DISPLAY_MANAGER="$(systemctl show -p Id --value display-manager)" DM_ID="${DISPLAY_MANAGER%.service}" # Desktop-mode session filename varies by DM: plasmalogin/sddm boot KDE # Plasma (plasma.desktop, a fixed name). GDM boots whatever GNOME session # happens to be installed, which may be named gnome.desktop or # gnome-xorg.desktop depending on the system - detect it instead of # hardcoding, falling back to "gnome.desktop" if detection fails. find_desktop_session_file() { local f for f in /usr/share/wayland-sessions/gnome*.desktop /usr/share/xsessions/gnome*.desktop; do [[ -f "$f" ]] || continue basename "$f" return 0 done echo "gnome.desktop" } case "$DM_ID" in gdm) DESKTOP_SESSION="$(find_desktop_session_file)";; *) DESKTOP_SESSION="plasma.desktop";; esac logout_current_session() { # Under GDM, ending the session is all this needs to do - re-arming # autologin back into whatever session was just set (gamescope or # desktop) is handled separately by a per-user systemd unit bound to # shutdown.target (installed by setup-gamescope-boot-gnome.sh), which # restarts gdm.service so it re-evaluates AutomaticLoginEnable. Plain # AutomaticLoginEnable/TimedLogin do not reliably re-arm after a logout # on their own. case "$DM_ID" in gdm) gnome-session-quit --no-prompt --logout 2>/dev/null \ || loginctl terminate-user "$(id -un)";; *) qdbus6 org.kde.Shutdown /Shutdown org.kde.Shutdown.logout;; esac } case "$1" in 'persistent') systemctl --user mask cachyos-gamescope-autologin.service pkexec /usr/lib/steamos/steam-set-session "$DESKTOP_SESSION";; 'oneshot') systemctl --user unmask cachyos-gamescope-autologin.service pkexec /usr/lib/steamos/steam-set-session gamescope-session.desktop;; 'gamescope') pkexec /usr/lib/steamos/steam-set-session gamescope-session.desktop logout_current_session;; 'desktop'|'plasma'|'gnome') pkexec /usr/lib/steamos/steam-set-session "$DESKTOP_SESSION" steam -shutdown systemctl --user stop gamescope-session.target;; *) [[ -n "$1" ]] && echo -e "Unknown session '$1'\n" cat < Modes: persistent Enable persistent session mode. The system will remember the last session you used and boot into it next time. If you last used Gamescope, it will boot into Gamescope. If you last used the desktop, it will boot into the desktop. oneshot Restore default oneshot behaviour. Every fresh boot will start in Gamescope first, regardless of the previously used session. gamescope Immediately switch to the Gamescope session. desktop Immediately switch to the desktop session - whichever one is actually installed (Plasma under plasma-login-manager/SDDM, or the detected GNOME session under GDM). 'plasma' and 'gnome' are accepted as aliases for this same mode, kept for compatibility with old habits/scripts, but 'desktop' is the name to use since it doesn't assume either DE. This is the same action triggered by Steam's "Switch to Desktop". Example: $(basename "$0") persistent INNEREOF exit 1;; esac if [[ -e /dev/input/.hidden ]]; then echo "Unhide hidden controller devices as needed" pkexec mv /dev/input/.hidden/* /dev/input pkexec rm -r /dev/input/.hidden fi SESSION_SELECT_EOF sudo chmod 755 "$FIX_SHARE_DIR/steam-set-session" "$FIX_SHARE_DIR/steamos-session-select" sudo chown root:root "$FIX_SHARE_DIR/steam-set-session" "$FIX_SHARE_DIR/steamos-session-select" ok "Persistent copies installed under $FIX_SHARE_DIR." REAPPLY_SCRIPT="/usr/local/bin/reapply-gamescope-gdm-fix" info "Installing $REAPPLY_SCRIPT (copies the fix over the real package paths)" sudo tee "$REAPPLY_SCRIPT" > /dev/null << EOF #!/bin/bash # Re-applies the GNOME/GDM support fix for gamescope-session-cachyos. # Safe to run any time; called automatically by a pacman hook after every # install/upgrade of that package, and once now by the setup script. set -euo pipefail install -m 755 -o root -g root "$FIX_SHARE_DIR/steam-set-session" "$STEAM_SET_SESSION" install -m 755 -o root -g root "$FIX_SHARE_DIR/steamos-session-select" "$SESSION_SELECT" EOF sudo chmod +x "$REAPPLY_SCRIPT" ok "Reapply script installed." HOOK_FILE="/etc/pacman.d/hooks/95-gamescope-gdm-fix.hook" info "Installing pacman hook at $HOOK_FILE (auto-reapplies the fix after every package update)" sudo mkdir -p /etc/pacman.d/hooks sudo tee "$HOOK_FILE" > /dev/null << 'EOF' [Trigger] Operation = Install Operation = Upgrade Type = Package Target = gamescope-session-cachyos [Action] Description = Reapplying GNOME/GDM support fix to gamescope-session-cachyos... When = PostTransaction Exec = /usr/local/bin/reapply-gamescope-gdm-fix EOF ok "Pacman hook installed - future updates to gamescope-session-cachyos will self-heal." info "Applying the fix now" backup_file "$STEAM_SET_SESSION" backup_file "$SESSION_SELECT" sudo "$REAPPLY_SCRIPT" ok "steam-set-session and steamos-session-select now support GDM directly." echo # ---------- 7. Set the user's initial default session ---------- info "Setting initial default session for $TARGET_USER to '$GAMESCOPE_SESSION_ID' via the now-fixed steam-set-session" sudo "$STEAM_SET_SESSION" "${GAMESCOPE_SESSION_ID}.desktop" ok "Default session set." echo # ---------- 8. Steam background autostart (Steam+X virtual keyboard) ---------- # # DE-agnostic - ported unchanged from the KDE original's step 8b, minus the # KWIN_IM_SHOW_ALWAYS env var (KWin-specific, meaningless under Mutter). info "Configuring Steam background autostart for desktop-mode virtual keyboard support" steam_env_dir="$user_home/.config/environment.d" sudo -u "$TARGET_USER" mkdir -p "$steam_env_dir" sudo -u "$TARGET_USER" tee "$steam_env_dir/99-gamescope-steam-glyphs.conf" > /dev/null <<< 'STEAM_GAMEPADUI_ARGS="-gamepadui -steamos3"' systemd_user_dir="$user_home/.config/systemd/user" sudo -u "$TARGET_USER" mkdir -p "$systemd_user_dir" sudo -u "$TARGET_USER" tee "$systemd_user_dir/steam-desktop-autostart.service" > /dev/null << 'EOF' [Unit] Description=Steam Background Autostart for Virtual Keyboard After=graphical-session.target PartOf=graphical-session.target [Service] Type=simple ExecStart=/usr/bin/steam -silent Restart=on-failure RestartSec=5 [Install] WantedBy=graphical-session.target EOF sudo -u "$TARGET_USER" rm -f "$user_home/.config/autostart/steam.desktop" sudo -u "$TARGET_USER" XDG_RUNTIME_DIR="/run/user/$(id -u "$TARGET_USER")" systemctl --user daemon-reload sudo -u "$TARGET_USER" XDG_RUNTIME_DIR="/run/user/$(id -u "$TARGET_USER")" systemctl --user enable steam-desktop-autostart.service ok "Steam background autostart unit installed (will start on next graphical login)." echo # ---------- 9. "Return to Gaming Mode" desktop shortcut (no theming) ---------- info "Creating a plain 'Return to Gaming Mode' desktop shortcut" desktop_dir="$user_home/Desktop" if [[ -f "$user_home/.config/user-dirs.dirs" ]]; then xdg_desktop=$(grep '^XDG_DESKTOP_DIR=' "$user_home/.config/user-dirs.dirs" | cut -d '"' -f 2) [[ -n "$xdg_desktop" ]] && desktop_dir="${xdg_desktop/\$HOME/$user_home}" fi sudo -u "$TARGET_USER" mkdir -p "$desktop_dir" shortcut_path="$desktop_dir/Return to Gaming Mode.desktop" sudo -u "$TARGET_USER" tee "$shortcut_path" > /dev/null << 'EOF' [Desktop Entry] Name=Return to Gaming Mode Comment=Switch session back to Gamescope Exec=steamos-session-select gamescope Icon=applications-games Terminal=false Type=Application Categories=System; EOF sudo -u "$TARGET_USER" chmod +x "$shortcut_path" ok "Shortcut created at: $shortcut_path (using the stock icon theme - no custom icon)." echo # ---------- 10. Summary ---------- echo -e "${c_bold}Setup complete.${c_reset}" echo "What this did:" echo " - Installed gamescope-session-cachyos, steam, mangohud, accountsservice (if missing)" echo " - Set $CUSTOM_CONF to autologin '$TARGET_USER' at boot" echo " - Installed $SUDOERS_FILE + gamescope-gdm-relogin.service (user unit) so gdm" echo " restarts on every logout, forcing real Relogin=true-equivalent behavior" echo " (confirmed AutomaticLoginEnable/TimedLogin alone do NOT reliably re-arm" echo " after logout on GDM - see the script header for the bug reports)" echo " - Replaced $STEAM_SET_SESSION and $SESSION_SELECT with GDM-aware versions," echo " with a persistent copy under $FIX_SHARE_DIR and a pacman hook" echo " ($HOOK_FILE) that automatically reapplies them after every" echo " gamescope-session-cachyos update - self-healing, no manual steps, no PR needed" echo " - Set '$TARGET_USER's initial default session to gamescope" echo " - Configured Steam background autostart (steam-desktop-autostart.service," echo " user unit) so Steam+X virtual keyboard works in desktop mode" echo " - Created a plain 'Return to Gaming Mode' desktop shortcut (stock icon)" echo echo "Steam's own in-Big-Picture 'Switch to Desktop' button now works too, since it" echo "calls steamos-session-select by path and that's exactly what was replaced." echo echo "To manually flip sessions any time:" echo " steamos-session-select gamescope # switch to gamescope right now" echo " steamos-session-select desktop # switch to desktop right now (also: plasma, gnome)" echo " steamos-session-select persistent # remember last-used session across reboots" echo " steamos-session-select oneshot # always start in gamescope (default Deck behavior)" echo echo "Deliberately NOT done here: Vapor theme, wallpaper, icon cache, launcher icon" echo "theming - out of scope." echo echo "Backups of any files this script modified were saved with a" echo ".bak-gamescope-wizard-gnome suffix next to the original." echo if ask_yn "Reboot now to test it?" n; then sudo reboot else info "Skipping reboot. Run 'sudo reboot' whenever you're ready to test." fi