fix: make portal startup uwsm-aware to stop light-mode race

Logging in via a bare Hyprland session never activates
graphical-session.target, so the systemd xdg-desktop-portal units can't
start. The old script worked around this by killing and relaunching the
portals manually, but that delayed the portal past waybar/chromium
startup, so they intermittently came up in light mode.

Switch to the "Hyprland (uwsm-managed)" session: uwsm activates
graphical-session.target and systemd starts the portals in the right
order. The startup script now detects that target and bows out, falling
back to the manual launch only on a bare session (e.g. another machine
without uwsm). Document uwsm in the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeena 2026-06-13 16:47:44 +09:00
parent 6ece13e84b
commit 6199866e4c
2 changed files with 22 additions and 3 deletions

View file

@ -1,8 +1,23 @@
#!/bin/sh
sleep 1
killall -e xdg-desktop-portal-hyprland
killall xdg-desktop-portal
# Under a uwsm-managed session, systemd brings up graphical-session.target and
# starts the xdg-desktop-portal units natively, in the right order. In that case
# we must NOT manually kill/relaunch them — doing so fights systemd and causes
# the portal to crash (broken pipe), which left apps stuck in light mode.
#
# So: wait briefly for graphical-session.target. If it comes up (uwsm), bow out.
# If it never does (a bare "Hyprland" session, e.g. launched directly from GDM),
# fall through and start the portals manually as before.
for _ in $(seq 1 10); do
if systemctl --user -q is-active graphical-session.target; then
exit 0
fi
sleep 0.5
done
# Bare session fallback: start the portals by hand.
killall -e xdg-desktop-portal-hyprland 2>/dev/null
killall xdg-desktop-portal 2>/dev/null
/usr/lib/xdg-desktop-portal-hyprland &
sleep 2
/usr/lib/xdg-desktop-portal &