15d3d423fa
apple / swift (push) Successful in 56s
ci / docs-site (push) Successful in 28s
ci / rust (push) Successful in 1m48s
android / android (push) Successful in 2m11s
ci / web (push) Successful in 27s
deb / build-publish (push) Successful in 2m24s
decky / build-publish (push) Successful in 12s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 7s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 5s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 3s
ci / bench (push) Successful in 4m32s
flatpak / build-publish (push) Successful in 4m1s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 8m18s
docker / deploy-docs (push) Successful in 18s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 7m43s
The plugin was a QAM launcher whose stream never appeared, with no
pairing. Three fixes, plus a headless --pair mode on the GTK client:
- Stream actually starts (MoonDeck's proven mechanism): gamescope only
focuses the process tree Steam launched via reaper, so a flatpak
spawned from the (root) backend is invisible. The frontend now
registers ONE hidden non-Steam shortcut pointing at bin/punktfunkrun.sh,
passes the host as the shortcut's Steam launch options, and starts it
with SteamClient.Apps.RunGame — gamescope then fullscreen-focuses it.
The wrapper execs `flatpak run io.unom.Punktfunk --connect <host>`.
- Fullscreen page: routerHook.addRoute("/punktfunk") — host list,
per-host Pair/Stream, and a settings section (resolution/refresh/
bitrate/gamepad/mic, written to client-gtk-settings.json).
- Pairing: a gamepad-navigable PIN keypad. The host shows the PIN; the
backend runs the SPAKE2 ceremony headlessly via the client's new
`--pair <PIN> --connect host` CLI mode (app.rs), persisting the host
as paired so the stream then connects silently. Same flatpak =>
shared identity store, verified live (ceremony against a real host).
- Backend (main.py): discover / pair / runner_info / get_settings /
set_settings / kill_stream; uses DECKY_USER_HOME so paths resolve to
the deck user's flatpak install regardless of the plugin's root flag.
CI (decky.yml) and the sideload packager now ship bin/punktfunkrun.sh.
The Steam-shortcut launch and headless-pairing env follow MoonDeck
exactly but need a Deck in Gaming Mode to fully confirm.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
35 lines
1.8 KiB
Bash
Executable File
35 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# punktfunk stream runner — the target of the hidden non-Steam shortcut the plugin creates.
|
|
#
|
|
# WHY A WRAPPER SCRIPT (load-bearing, from MoonDeck's hard-won knowledge): the stream client
|
|
# must be a descendant of the process Steam launches via `reaper`, or gamescope never gives
|
|
# its window focus/fullscreen in Gaming Mode (gamescope detects the "current app" by AppID,
|
|
# which only attaches to reaper's descendants — see gamescope#484). So the Decky plugin
|
|
# launches THIS script through SteamClient.Apps.RunGame; the script then execs the flatpak
|
|
# client, which inherits the shortcut's AppID and is focused. Launching the flatpak directly
|
|
# from the (root) Decky backend produces an unfocused, invisible window.
|
|
#
|
|
# Per-session parameters arrive as environment variables, set as the shortcut's Steam launch
|
|
# options by the plugin (SteamClient.Apps.SetAppLaunchOptions), so ONE generic shortcut serves
|
|
# every host:
|
|
# PF_HOST host[:port] to connect to (required)
|
|
# PF_APPID flatpak app id (default io.unom.Punktfunk)
|
|
# PF_FLATPAK override the flatpak binary path (default: `flatpak` on PATH)
|
|
#
|
|
# Runs as the `deck` user (Steam launched it), so the --user flatpak install is visible and
|
|
# WAYLAND_DISPLAY / XDG_RUNTIME_DIR are already correct for gamescope.
|
|
set -u
|
|
|
|
APPID="${PF_APPID:-io.unom.Punktfunk}"
|
|
FLATPAK="${PF_FLATPAK:-flatpak}"
|
|
|
|
if [ -z "${PF_HOST:-}" ]; then
|
|
echo "punktfunkrun: PF_HOST is not set (the plugin sets it as a launch option)" >&2
|
|
exit 2
|
|
fi
|
|
|
|
echo "punktfunkrun: streaming $APPID --connect $PF_HOST" >&2
|
|
# exec so the flatpak client IS the game process — when it exits, Steam ends the "game" and
|
|
# Gaming Mode reclaims focus automatically (no manual refocus needed).
|
|
exec "$FLATPAK" run --arch=x86_64 "$APPID" --connect "$PF_HOST"
|