Launch apps in their own scope instead of the compositor's cgroup (#6541)
* Launch apps in their own scope instead of the compositor's cgroup
The launcher ran desktop entries through gtk-launch, so the app inherited
quickshell's cgroup, which belongs to wayland-wm@hyprland.desktop.service.
A kernel OOM kill there fails the compositor unit and tears down the whole
session, dropping the user at SDDM with every window lost. A single runaway
app took the desktop down three times in one afternoon.
Route launches through uwsm-app so each app gets its own scope under
app-graphical.slice. A runaway app now fails its own scope and the session
keeps running.
The post-install launches had the same inheritance bug in a milder form,
where the app landed in the installer terminal's scope and died with it.
0aedef58 patched that with setsid, which detaches the session but leaves
cgroup membership behind. A scope fixes it properly.
* Detach post-install app launches
* Preserve desktop entry launch compatibility
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
This commit is contained in:
co-authored by
David Heinemeier Hansson
parent
fe55ac264d
commit
40f92eabdf
@@ -99,9 +99,9 @@ assert(
|
||||
)
|
||||
|
||||
assert(
|
||||
/function launch\(desktopId, name\) \{[\s\S]*?gtk-launch[\s\S]*?\n \}/.test(appLibraryQml) &&
|
||||
appLibraryQml.includes('Util.execDetached("gtk-launch "'),
|
||||
'app library runs desktop entry launch through the shell'
|
||||
/function launch\(desktopId, name\) \{[\s\S]*?uwsm-app[\s\S]*?\n \}/.test(appLibraryQml) &&
|
||||
appLibraryQml.includes('Util.execDetached("uwsm-app -- gtk-launch "'),
|
||||
'app library launches desktop entries through gtk-launch in their own scope'
|
||||
)
|
||||
|
||||
assert(
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
||||
|
||||
test_tmp=$(mktemp -d)
|
||||
trap 'rm -rf "$test_tmp"' EXIT
|
||||
|
||||
mock_bin="$test_tmp/bin"
|
||||
test_home="$test_tmp/home"
|
||||
mkdir -p "$mock_bin" "$test_home"
|
||||
|
||||
cat >"$mock_bin/omarchy-pkg-add" <<'SH'
|
||||
#!/bin/bash
|
||||
printf 'pkg:%s\n' "$*" >>"$OMARCHY_TEST_LOG"
|
||||
exit "${OMARCHY_TEST_PKG_STATUS:-0}"
|
||||
SH
|
||||
|
||||
for command in omarchy-pkg-aur-add omarchy-install-emacs omazed omarchy-theme-set-vscode omarchy-install-gaming-gpu-lib32; do
|
||||
cat >"$mock_bin/$command" <<'SH'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
SH
|
||||
done
|
||||
|
||||
cat >"$mock_bin/setsid" <<'SH'
|
||||
#!/bin/bash
|
||||
printf 'launch:%s\n' "$*" >>"$OMARCHY_TEST_LOG"
|
||||
SH
|
||||
|
||||
cat >"$mock_bin/omarchy-launch-floating-terminal-with-presentation" <<'SH'
|
||||
#!/bin/bash
|
||||
printf '%s\n' "$1" >"$OMARCHY_TEST_PRESENTATION"
|
||||
SH
|
||||
|
||||
chmod +x "$mock_bin"/*
|
||||
|
||||
export HOME="$test_home"
|
||||
export OMARCHY_TEST_LOG="$test_tmp/launch.log"
|
||||
export OMARCHY_TEST_PRESENTATION="$test_tmp/presentation"
|
||||
export PATH="$mock_bin:$PATH"
|
||||
|
||||
wait_for_launch() {
|
||||
local expected="$1"
|
||||
|
||||
for ((attempt = 0; attempt < 100; attempt++)); do
|
||||
grep -Fxq "$expected" "$OMARCHY_TEST_LOG" && return 0
|
||||
sleep 0.01
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
assert_detached_installer_launch() {
|
||||
local script="$1"
|
||||
local desktop_id="$2"
|
||||
|
||||
: >"$OMARCHY_TEST_LOG"
|
||||
bash "$ROOT/bin/$script"
|
||||
|
||||
wait_for_launch "launch:uwsm-app -- gtk-launch $desktop_id" ||
|
||||
fail "$script launches its desktop entry through gtk-launch in a UWSM scope"
|
||||
grep -Fqx "setsid uwsm-app -- gtk-launch $desktop_id >/dev/null 2>&1 &" "$ROOT/bin/$script" ||
|
||||
fail "$script detaches its scoped desktop-entry launch"
|
||||
pass "$script detaches its scoped desktop-entry launch"
|
||||
}
|
||||
|
||||
assert_detached_installer_launch omarchy-install-editor-emacs emacsclient
|
||||
assert_detached_installer_launch omarchy-install-editor-vscode code
|
||||
assert_detached_installer_launch omarchy-install-editor-zed dev.zed.Zed
|
||||
assert_detached_installer_launch omarchy-install-gaming-heroic heroic
|
||||
assert_detached_installer_launch omarchy-install-gaming-steam steam
|
||||
|
||||
bash "$ROOT/bin/omarchy-install-and-launch" "Example App" "alpha beta" "Disk Usage"
|
||||
presentation_command=$(<"$OMARCHY_TEST_PRESENTATION")
|
||||
|
||||
[[ $presentation_command == *'echo Installing\ Example\ App...;'* ]] ||
|
||||
fail "generic installer shell-quotes the display name" "$presentation_command"
|
||||
[[ $presentation_command == *'omarchy-pkg-add alpha beta && (setsid uwsm-app -- gtk-launch Disk\ Usage >/dev/null 2>&1 &)'* ]] ||
|
||||
fail "generic installer waits for packages and detaches only the scoped launch" "$presentation_command"
|
||||
pass "generic installer waits for packages and detaches only the scoped launch"
|
||||
|
||||
: >"$OMARCHY_TEST_LOG"
|
||||
bash -c "$presentation_command"
|
||||
grep -Fxq 'pkg:alpha beta' "$OMARCHY_TEST_LOG" ||
|
||||
fail "generic installer passes every package to the package helper"
|
||||
wait_for_launch 'launch:uwsm-app -- gtk-launch Disk Usage' ||
|
||||
fail "generic installer preserves a desktop ID containing spaces"
|
||||
pass "generic installer preserves a desktop ID containing spaces"
|
||||
|
||||
: >"$OMARCHY_TEST_LOG"
|
||||
if OMARCHY_TEST_PKG_STATUS=1 bash -c "$presentation_command"; then
|
||||
fail "generic installer propagates package installation failure"
|
||||
fi
|
||||
if grep -q '^launch:' "$OMARCHY_TEST_LOG"; then
|
||||
fail "generic installer does not launch after package installation failure"
|
||||
fi
|
||||
pass "generic installer does not launch after package installation failure"
|
||||
Reference in New Issue
Block a user