fix(greetd): pin greeter GPU + software cursors + single-output centering

Diagnosed the intermittent "login won't take input / frozen cursor" on this
dual-AMD-GPU box: cage (wlroots) could pick the display-less iGPU, and amdgpu
hardware cursors can freeze. regreet-session.sh now:
- pins WLR_DRM_DEVICES to the first DRM card with a connected output (portable,
  evaluated live — no hard-coded PCI path),
- sets WLR_NO_HARDWARE_CURSORS=1 (fixes the stuck cursor),
- runs cage with `-m last` so the login card centres on a single monitor instead
  of the default "extend", which stretched the canvas across all three monitors
  and left the card floating in the middle of the span.

sysupdate.sh now deploys /etc/greetd config (config/regreet/session, not PAM) when
greetd is the active greeter, using the single primed sudo credential.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUN7gg6GGfnToghMijLm5Y
main
Amir Alexander Abdelbaki 2026-07-07 13:37:22 +02:00
parent de666acac7
commit 48e32e7eea
2 changed files with 37 additions and 2 deletions

View File

@ -3,7 +3,7 @@
# #
# greetd runs this as the unprivileged `greeter` user. cage is a minimal # greetd runs this as the unprivileged `greeter` user. cage is a minimal
# wlroots/Wayland compositor; `-s` allows VT switching (so Ctrl+Alt+F-keys still # wlroots/Wayland compositor; `-s` allows VT switching (so Ctrl+Alt+F-keys still
# reach a console). Env here tunes the greeter's look before ReGreet starts. # reach a console). Env here tunes the greeter's look/behaviour before ReGreet starts.
# #
# Scaling: cage renders at output scale 1. Bump XCURSOR_SIZE for a larger cursor; # Scaling: cage renders at output scale 1. Bump XCURSOR_SIZE for a larger cursor;
# uncomment GDK_SCALE to integer-scale the whole greeter (careful on mixed-DPI # uncomment GDK_SCALE to integer-scale the whole greeter (careful on mixed-DPI
@ -13,4 +13,22 @@
export XCURSOR_SIZE=32 export XCURSOR_SIZE=32
# export GDK_SCALE=2 # export GDK_SCALE=2
exec cage -s -- regreet # ── Multi-GPU: pin the greeter to a DRM card that actually drives a monitor ─────
# On a dual-GPU box (dGPU + iGPU) wlroots enumerates both cards and may pick the
# display-less one, giving a blank or input-frozen greeter. Hand it only the first
# card that has a connected output. Evaluated live, so it stays portable across
# boots and machines (no hard-coded PCI path).
for _status in /sys/class/drm/card[0-9]*-*/status; do
[ "$(cat "$_status" 2>/dev/null)" = "connected" ] || continue
_card="/dev/dri/$(basename "$(dirname "$_status")" | cut -d- -f1)"
[ -e "$_card" ] && { WLR_DRM_DEVICES="$_card"; export WLR_DRM_DEVICES; break; }
done
# amdgpu hardware cursors can freeze on this hardware (the cursor sticks and input
# feels dead); software cursors are reliable.
export WLR_NO_HARDWARE_CURSORS=1
# cage's default is "-m extend", which stretches one canvas across every monitor and
# leaves ReGreet's login card floating in the middle of the whole multi-monitor span.
# "-m last" renders on a single output instead, so the card is centred on one screen.
exec cage -s -m last -- regreet

View File

@ -597,12 +597,29 @@ _fix_hypr_usr() {
fi fi
} }
# Deploy root-owned greeter config (/etc/greetd) that config-updater can't reach.
# Only when greetd is the active greeter on this machine. Uses the sudo credential
# primed once at startup, so it doesn't re-prompt. PAM is intentionally left to the
# setup module — a bad PAM file could lock out login.
_deploy_greetd() {
local src="$DOTFILES/etc-greetd"
[[ -d "$src" ]] || return 0
systemctl is-enabled greetd.service &>/dev/null || return 0
log "Deploying greetd / ReGreet config to ${BO}/etc/greetd${RS}..."
sudo install -Dm644 "$src/config.toml" /etc/greetd/config.toml && \
sudo install -Dm644 "$src/regreet.toml" /etc/greetd/regreet.toml && \
sudo install -Dm644 "$src/regreet.css" /etc/greetd/regreet.css && \
sudo install -Dm755 "$src/regreet-session.sh" /etc/greetd/regreet-session.sh && \
ok "greetd config deployed" || warn "greetd config deploy had errors"
}
sync_configs() { sync_configs() {
section "Config Sync" section "Config Sync"
# ── Migration: old flat layout → hypr/usr/ ─────────────────────────────── # ── Migration: old flat layout → hypr/usr/ ───────────────────────────────
_migrate_hypr_usr _migrate_hypr_usr
_fix_hypr_usr _fix_hypr_usr
_deploy_greetd
# ── Preferred: use the installed update-configs.sh ─────────────────────── # ── Preferred: use the installed update-configs.sh ───────────────────────
local cfg_script local cfg_script