Files
dotfiles/hosts/mainframe/sway/headless.conf
T
connor f4200b6a69 Make the headless session actually usable over the stream
Two reasons both Sunshine apps streamed a blank screen.

Steam is an X client, and sway starts Xwayland lazily. DISPLAY therefore
did not exist at the moment the config imported the environment for
Sunshine, so Steam came up with "Unable to open a connection to X" and
rendered nothing. `xwayland force` starts it at compositor launch instead,
and DISPLAY joins the import.

The Desktop app was not broken at all — the desktop was genuinely empty.
swaybg was painting #101920 on an output with no windows and no bar, which
over a stream is indistinguishable from a failed capture. There are now
keybinds for a terminal and a launcher, and kitty starts with the session
so a working capture looks obviously working.

Verified: Xwayland on :0, DISPLAY exported, xdpyinfo and zenity connect,
and Steam Big Picture Mode renders as a window on HEADLESS-1.
2026-09-14 16:01:48 -04:00

36 lines
1.6 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.
exec systemctl --user import-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP
exec 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.