The previous fix added DISPLAY to the import but left it as a separate exec line. sway runs exec lines asynchronously and does not order them, so Sunshine won the race every time — it started in the same second as the compositor, before DISPLAY existed in the manager environment, and passed no DISPLAY to the apps it launched. Steam still failed with "Unable to open a connection to X" while Xwayland was up and the manager environment looked correct, which is what made it confusing. One exec with && instead of two. The earlier verification was wrong for the same reason: I launched Steam by hand with DISPLAY=:0 set, which tested Xwayland rather than the path Sunshine actually uses. Re-verified properly by launching Steam in a shell carrying only the environment read out of Sunshine's own /proc entry.
42 lines
2.0 KiB
Plaintext
42 lines
2.0 KiB
Plaintext
# A compositor that exists only so Sunshine has something to capture.
|
|
# mainframe has no desktop: the only connected output (HDMI-A-2) hangs off the
|
|
# Intel iGPU, while the RTX 3060 that does the encoding drives no monitor at
|
|
# all. Capturing the real output would mean grabbing on Intel and encoding on
|
|
# NVIDIA — a cross-GPU copy every frame. A virtual output on the 3060 keeps
|
|
# capture and NVENC on one card.
|
|
|
|
output HEADLESS-1 mode 1920x1080@60Hz position 0,0
|
|
output HEADLESS-1 background #101920 solid_color
|
|
|
|
# Start Xwayland eagerly rather than on first X client. Steam is an X app, and
|
|
# with the default lazy start DISPLAY does not exist yet when the line below
|
|
# imports the environment — so Steam launched by Sunshine got
|
|
# "Unable to open a connection to X" and showed a blank stream.
|
|
xwayland force
|
|
|
|
# Sunshine is a systemd user unit and inherits nothing from this session, so
|
|
# hand it the display variables before starting it.
|
|
#
|
|
# ONE exec with &&, not two. sway runs exec lines asynchronously and does not
|
|
# order them, so as two separate lines Sunshine won every time: it started in
|
|
# the same second as the compositor, before DISPLAY was imported, and passed no
|
|
# DISPLAY to the apps it launched. Steam then failed with "Unable to open a
|
|
# connection to X" even though Xwayland was up and the manager environment was
|
|
# correct.
|
|
exec systemctl --user import-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP && systemctl --user start sunshine.service
|
|
|
|
# Input arrives from the Moonlight client, so keybinds are worth having even
|
|
# though nobody is sitting at this machine. Without them the Desktop app
|
|
# streams an empty screen with no way to open anything.
|
|
set $mod Mod4
|
|
bindsym $mod+Return exec kitty
|
|
bindsym $mod+d exec wofi --show drun
|
|
bindsym $mod+Shift+q kill
|
|
bindsym $mod+Shift+e exec swaymsg exit
|
|
|
|
# Something visible on login, so a working capture is obviously working rather
|
|
# than indistinguishable from a broken one.
|
|
exec kitty
|
|
|
|
# No bar, no idle daemon, no lock screen — there is no one sitting here.
|