feat(foxtrot): system Steam + gamescope gaming mode (migrate off flatpak) #656

Closed
lytedev wants to merge 1 commit from foxtrot-system-steam into main
Owner

Migrates foxtrot from Flatpak Steam to nix-managed programs.steam so Steam embeds in nested gamescope (the Flatpak sandbox bound niri's display sockets and escaped gamescope entirely).

What works (validated live)

  • System Steam embeds in gamescope as a single app_id=gamescope window (Flatpak never did)
  • 332G library + native game saves (BG3, Stardew, …) migrated to ~/.local/share/Steam via instant btrfs rename — no re-download, logged in, all games StateFlags=4
  • foxtrot-gamemode launches Steam Big Picture fullscreen on the VITURE glasses; controller navigates; games run in gamescope
  • Launcher now quits a running desktop Steam first (single-instance handoff fix)

Known limitation

  • Controller-as-mouse doesn't move the cursor sprite (Steam Input XTest moves the X11 logical pointer, not the Wayland/gamescope cursor). extest is a dead end here (SIGABRTs the 32-bit client — see code comment). The fix is a proper gamescope session (Jovian steamos-session-select, desktopSession=niri) — follow-up PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XX14i2xvfiY2TrYzm3A64c

Migrates foxtrot from Flatpak Steam to nix-managed `programs.steam` so Steam embeds in nested gamescope (the Flatpak sandbox bound niri's display sockets and escaped gamescope entirely). ## What works (validated live) - System Steam embeds in gamescope as a single `app_id=gamescope` window (Flatpak never did) - 332G library + native game saves (BG3, Stardew, …) migrated to `~/.local/share/Steam` via instant btrfs rename — **no re-download**, logged in, all games `StateFlags=4` - `foxtrot-gamemode` launches Steam Big Picture fullscreen on the VITURE glasses; controller navigates; games run in gamescope - Launcher now quits a running desktop Steam first (single-instance handoff fix) ## Known limitation - **Controller-as-mouse** doesn't move the cursor sprite (Steam Input XTest moves the X11 logical pointer, not the Wayland/gamescope cursor). extest is a dead end here (SIGABRTs the 32-bit client — see code comment). The fix is a proper gamescope **session** (Jovian `steamos-session-select`, `desktopSession=niri`) — **follow-up PR**. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XX14i2xvfiY2TrYzm3A64c
feat(foxtrot): system Steam + gamescope gaming mode (migrate off flatpak)
Some checks failed
/ check-format (push) Failing after 8s
/ build (push) Failing after 3m22s
9fe66ca417
The Flatpak Steam's sandbox always binds the host (niri) display sockets, so a
host gamescope can never contain it — Steam escapes onto niri and the SteamOS
behaviors (overlay, controller-as-mouse, single-surface fullscreen, game<->Steam
focus) never work. Switch foxtrot to nix-managed Steam (programs.steam.enable ->
gaming.nix), which embeds in nested gamescope properly (verified: a single
app_id=gamescope window, no escape).

- gaming mode (foxtrot-gamemode): gamescope -f -e -- steam -gamepadui; now quits
  any running desktop Steam first (single-instance, else -gamepadui hands off to
  the niri instance and gamescope's child exits immediately)
- exit sentinel + graceful -shutdown repointed to system Steam paths
- niri rule: gamescope opens bezel-free fullscreen on the VITURE glasses
- extest left OFF: investigated — it SIGABRTs the 32-bit steam client (loads only
  there, then panics on a Wayland xdg-output unwrap inside pressure-vessel)

Library (332G) + native game saves migrated flatpak -> ~/.local/share/Steam
out-of-band (instant btrfs rename, no re-download). Controller-as-mouse needs a
proper gamescope session (Jovian steamos-session-select, desktop=niri) — follow-up.
lytedev force-pushed foxtrot-system-steam from 9fe66ca417
Some checks failed
/ check-format (push) Failing after 8s
/ build (push) Failing after 3m22s
to d60c4c3a3e
All checks were successful
/ check-format (push) Successful in 16s
/ build (push) Successful in 13m46s
2026-06-29 21:49:57 -05:00
Compare
lytedev closed this pull request 2026-06-30 19:00:01 -05:00
All checks were successful
/ check-format (push) Successful in 16s
Required
Details
/ build (push) Successful in 13m46s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lytedev/nix!656
No description provided.