diff --git a/docs-site/content/docs/virtual-displays.md b/docs-site/content/docs/virtual-displays.md index a7261ce8..00f312a5 100644 --- a/docs-site/content/docs/virtual-displays.md +++ b/docs-site/content/docs/virtual-displays.md @@ -179,6 +179,23 @@ shutdown — and only forces the issue after ten seconds of being ignored. > (5 minutes). A display set to **Forever** stays up regardless of what happens to the game — a > pinned display is a deliberate "this box is a game host" choice, and closing a game doesn't undo it. +### On a gamescope session, the display has the final say + +When a launch gets its **own gamescope** — a dedicated game session, the usual setup on a Steam Deck +or a Bazzite couch box — the game runs *inside* the streamed display. So it lives exactly as long as +that display does, and **Keep alive decides that, not the setting above**: + +| you disconnect by | what happens to the game | +|---|---| +| pressing **Stop** (or the console's stop) | the display tears down at once — keep-alive is deliberately skipped for a real stop — and the game goes with it, even on *Leave it running* | +| dropping out (network, sleep) | the display lingers for your keep-alive window, then tears down; the game ends with it | +| dropping out, keep-alive **Forever** | the display is pinned, so the game genuinely survives — and *Always close it* still ends it when the reconnect window closes | + +So on a gamescope box, "leave the game running after I disconnect" means **keep-alive Forever** (or a +window long enough to come back in), not just this setting. On a desktop session — KWin, GNOME, Sway — +the game is an ordinary process next to your desktop and none of this applies; the setting above is +the whole story. + ### Automation The host publishes `game.running` and `game.exited` events (the latter says whether the player quit diff --git a/web/messages/de.json b/web/messages/de.json index 30ccc018..052577af 100644 --- a/web/messages/de.json +++ b/web/messages/de.json @@ -413,5 +413,6 @@ "session_game_grace": "Zeitfenster für die Rückkehr", "session_game_grace_help": "Wie lange ein verschwundener Client Zeit hat zurückzukommen, bevor sein Spiel geschlossen wird. Die Konsole zeigt den Countdown; eine neue Verbindung bricht ihn ab.", "session_game_saved": "Sitzungs- und Spieleinstellungen gespeichert", - "session_game_inert": "Dieser Host kann keine Spiele starten – hier bewirken diese Einstellungen nichts" + "session_game_inert": "Dieser Host kann keine Spiele starten – hier bewirken diese Einstellungen nichts", + "session_game_nested_note": "In einer gamescope-Spielsitzung läuft das Spiel *innerhalb* der gestreamten Anzeige und lebt daher genau so lange wie diese – das entscheidet „Offen halten“ oben, nicht diese Einstellung. Ein bewusstes Stoppen reißt die Anzeige sofort ab und nimmt das Spiel mit, egal was du hier wählst." } diff --git a/web/messages/en.json b/web/messages/en.json index 3b0eebeb..30587018 100644 --- a/web/messages/en.json +++ b/web/messages/en.json @@ -413,5 +413,6 @@ "session_game_grace": "Reconnect window", "session_game_grace_help": "How long a client that vanished has to come back before its game is closed. The console shows the countdown, and reconnecting cancels it.", "session_game_saved": "Session and game settings saved", - "session_game_inert": "This host has no way to launch games, so these settings do nothing here" + "session_game_inert": "This host has no way to launch games, so these settings do nothing here", + "session_game_nested_note": "On a gamescope game session the game runs *inside* the streamed display, so it lives exactly as long as that display does — which is what Keep alive above decides, not this setting. A deliberate Stop tears that display down at once and takes the game with it, whichever option you pick here." } diff --git a/web/src/sections/Displays/SessionGameCard.tsx b/web/src/sections/Displays/SessionGameCard.tsx index acf3b7ef..ee56a51f 100644 --- a/web/src/sections/Displays/SessionGameCard.tsx +++ b/web/src/sections/Displays/SessionGameCard.tsx @@ -116,6 +116,14 @@ export const SessionGameCard: FC = () => { {m.session_game_always_warning()}
)} + {/* Shown for every option, including "leave it running": on a nested + gamescope launch the game IS inside the streamed display, so the + display's own keep-alive outranks anything chosen here — verified + on glass (.41), where a deliberate stop ended the game under + `keep`. Worded so a non-gamescope host reads it and moves on. */} ++ {m.session_game_nested_note()} +
{(server.game_on_session_end ?? "keep") === "always" && (