docs: on a gamescope session the display outranks the end-game setting
ci / web (push) Successful in 1m23s
ci / docs-site (push) Successful in 1m19s
decky / build-publish (push) Successful in 33s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 16s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 57s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 26s
docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 23s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 23s
ci / bench (push) Successful in 5m32s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m35s
ci / rust-arm64 (push) Successful in 9m2s
windows-host / package (push) Successful in 20m22s
windows-host / winget-source (push) Skipped
arch / build-publish (push) Successful in 14m46s
docker / build-push-arm64cross (push) Successful in 30s
docker / deploy-docs (push) Successful in 52s
android / android (push) Successful in 16m52s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 18m44s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 18m36s
ci / rust (push) Successful in 27m3s
apple / swift (push) Successful in 6m5s
apple / screenshots (push) Successful in 25m23s
deb / build-publish-host (push) Successful in 16m6s
deb / build-publish-client-arm64 (push) Successful in 11m21s
deb / build-publish (push) Successful in 11m28s
ci / web (push) Successful in 1m23s
ci / docs-site (push) Successful in 1m19s
decky / build-publish (push) Successful in 33s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 16s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 57s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 26s
docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 23s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 23s
ci / bench (push) Successful in 5m32s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m35s
ci / rust-arm64 (push) Successful in 9m2s
windows-host / package (push) Successful in 20m22s
windows-host / winget-source (push) Skipped
arch / build-publish (push) Successful in 14m46s
docker / build-push-arm64cross (push) Successful in 30s
docker / deploy-docs (push) Successful in 52s
android / android (push) Successful in 16m52s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 18m44s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 18m36s
ci / rust (push) Successful in 27m3s
apple / swift (push) Successful in 6m5s
apple / screenshots (push) Successful in 25m23s
deb / build-publish-host (push) Successful in 16m6s
deb / build-publish-client-arm64 (push) Successful in 11m21s
deb / build-publish (push) Successful in 11m28s
On-glass on .41: with `game_on_session_end: keep` — "leave it running, nothing
is ever closed" — a deliberate stop ended the game, and a drop ended it ~14 s
later. Both times the LEASE did the right thing (no `ending the launched game`
line); the game died because the virtual display was torn down, and a nested
launch runs inside that gamescope.
So on a dedicated gamescope session the game's lifetime IS the display's, and
keep-alive decides it — not this setting:
* a deliberate stop skips the linger by design, so the game goes at once,
* a drop lingers the keep-alive window, then takes the game with it,
* only keep-alive Forever actually keeps it — and `always` still ends it at
the reconnect window, which is the documented precedence and was verified
(a `forever`-pinned display released at grace expiry, 60.006 s).
That makes the console's promise untrue on the most common Linux setup, so the
card now says so for every option rather than only warning about `always`, and
the docs get the three cases as a table. Worded so a non-gamescope host reads it
and moves on — a desktop-session launch is an ordinary process and none of it
applies.
Not changing behavior here: making `keep` pin the display would pit it against
"a stop must not leave a ghost display", and which wins is a product call rather
than something to decide silently mid-test.
web: codegen + tsc + biome clean, en/de complete. docs-site: build + tsc clean.
This commit is contained in:
@@ -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
|
> (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.
|
> 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
|
### Automation
|
||||||
|
|
||||||
The host publishes `game.running` and `game.exited` events (the latter says whether the player quit
|
The host publishes `game.running` and `game.exited` events (the latter says whether the player quit
|
||||||
|
|||||||
@@ -413,5 +413,6 @@
|
|||||||
"session_game_grace": "Zeitfenster für die Rückkehr",
|
"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_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_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."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -413,5 +413,6 @@
|
|||||||
"session_game_grace": "Reconnect window",
|
"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_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_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."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,14 @@ export const SessionGameCard: FC = () => {
|
|||||||
{m.session_game_always_warning()}
|
{m.session_game_always_warning()}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
{/* 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. */}
|
||||||
|
<p className="max-w-prose text-xs text-muted-foreground">
|
||||||
|
{m.session_game_nested_note()}
|
||||||
|
</p>
|
||||||
</Field>
|
</Field>
|
||||||
|
|
||||||
{(server.game_on_session_end ?? "keep") === "always" && (
|
{(server.game_on_session_end ?? "keep") === "always" && (
|
||||||
|
|||||||
Reference in New Issue
Block a user