# gamemode-toggle-deckshift — Game Mode toggle launches DeckShift

Companion to `gaming-key-guard` (which does the Super+Shift+S keybind). Patches
the package-owned nosignal-shell file; the canonical fix is in the fork.

## Request
The utilities **Game Mode** button (gamepad icon) should launch the DeckShift
gaming session when DeckShift is installed, and do nothing otherwise. Previously
it ran caelestia's cosmetic Game Mode (disable Hyprland animations/blur/gaps).

## Change
`modules/utilities/cards/Toggles.qml`, the `gameMode` `DelegateChoice`:

before
```qml
delegate: Toggle {
    icon: "gamepad"
    checked: GameMode.enabled
    onClicked: GameMode.enabled = !GameMode.enabled
}
```
after (hardened)
```qml
delegate: Toggle {
    id: gmTog
    property bool launching: false
    icon: "gamepad"
    disabled: launching
    onClicked: {
        if (gmTog.launching) return;
        gmTog.launching = true;
        gmTog.internalChecked = false; // don't latch "on" — it's a launcher
        relockTimer.start();
        Quickshell.execDetached(["sh", "-c", "[ -x /usr/local/bin/switch-to-gaming ] && [ -f /usr/share/wayland-sessions/gamescope-session-steam-nm.desktop ] && exec /usr/local/bin/switch-to-gaming"]);
    }
    Timer { id: relockTimer; interval: 5000; onTriggered: gmTog.launching = false }
}
```
- **Kept styled as an off-toggle** (default `isToggle: true`, no `checked`) so it
  keeps the muted/outline look of the other toggles. An earlier version set
  `isToggle: false`, which flipped the icon to filled/accent — that was the
  reported "changed colour"; reverted. `internalChecked` is reset to false on
  click so the launcher never latches "on".
- **Debounced.** A fast double-click previously fired `switch-to-gaming` twice →
  two `systemctl restart sddm` calls → the first restart consumed the one-shot
  autologin marker and the second fell back to the password greeter (the reported
  "takes you to the login screen, not gamescope"). The `launching` guard +
  `disabled` + 5 s `relockTimer` ensure one launch per press.
- The `sh -c '… && … && exec switch-to-gaming'` guard mirrors the Super+Shift+S
  bind and the deckshift-login install-check: nothing happens if DeckShift is absent.
- Adds `import Quickshell` (for `execDetached`; the file only had
  `Quickshell.Bluetooth`). `GameMode` (from `qs.services`) is no longer referenced
  here — the cosmetic Game Mode is still available via its IPC (`gameMode` target)
  if a future build wants to re-expose it elsewhere.
- **Hidden when DeckShift isn't installed.** A `deckshiftProbe` Process
  (`test -f /usr/share/wayland-sessions/gamescope-session-steam-nm.desktop`) sets
  `root.deckshiftInstalled` at load, and the `quickToggles` filter drops the
  `gameMode` entry when it's false (same pattern as the existing `vpn` special-case)
  — so the tile cleanly leaves the grid (no dead button, no gap) on non-gaming
  boxes, and appears once DeckShift is installed (after a shell reload). Needs
  `import Quickshell.Io` for `Process`.

## Pieces / integration
1. **`Toggles.qml`** — corrected file (drop-in for
   `modules/utilities/cards/Toggles.qml` in the nosignal-shell fork). Rebuild the
   package; set `NOSIGNAL_SKIP_SHELL_PATCH` for the build.
2. **`install-gamemode-toggle-deckshift.sh`** — idempotent fallback patch (backup +
   overwrite). Reverted by the next nosignal-shell upgrade (which carries the fix).
3. **`1781478000-gamemode-toggle-deckshift.sh`** → `nosignal-update/migrations/`
   (delegates via `$NOSIGNAL_SRC`).

**Shell restart required:** `qs -c caelestia -n -d` disables the file watcher, so
the patched file is not hot-reloaded — restart the shell (**Ctrl+Super+Alt+R**) or
log out/in after patching.

## Apply on this box now (needs root)
```sh
sudo sh ~/nosignal-handoff/gamemode-toggle-deckshift/install-gamemode-toggle-deckshift.sh
```
then **Ctrl+Super+Alt+R**.
