diff --git a/features/scripts/utils/nomarchy-restart-app b/features/scripts/utils/nomarchy-restart-app index 53ba2d1..953845a 100755 --- a/features/scripts/utils/nomarchy-restart-app +++ b/features/scripts/utils/nomarchy-restart-app @@ -2,6 +2,28 @@ # Restart an application by killing it and relaunching via uwsm. # Usage: nomarchy-restart-app [application-args...] +# +# We wait for the old process to actually exit before launching the +# new one. Without the wait, the new instance starts while the old +# one's wayland surface is still mapped — visible as ghosting on +# layer-shell apps and double-instance briefly for everything else. +# Same race that produced the waybar theme-switch artifacts before +# 386da51 moved waybar to a SIGUSR2-reload path. -pkill -x $1 -setsid uwsm-app -- "$@" >/dev/null 2>&1 & +app="$1" +shift || true + +if pgrep -x "$app" >/dev/null 2>&1; then + pkill -x "$app" 2>/dev/null || true + # Poll for graceful exit, up to ~1.5s. + for _ in $(seq 1 15); do + pgrep -x "$app" >/dev/null 2>&1 || break + sleep 0.1 + done + # Anything still running: SIGKILL it. Without this, a misbehaving + # process can hold the surface indefinitely and the new instance + # races on top. + pkill -KILL -x "$app" 2>/dev/null || true +fi + +setsid uwsm-app -- "$app" "$@" >/dev/null 2>&1 &