Improve dinit service files (#3193)

* Improve dinit service files and niri-session

Two main changes were made:
 - After a discussion in davmac314/dinit#496, 2 dinit services are now
   provided. The first one is 'niri', which runs niri itself, and the
   second one is 'niri.target' which brings up all the dependences from
   user configuration.
 - Made the behaviour of 'niri-session' when running under dinit closer
   to the behaviour when running under systemd. In particular, now the
   script wait for service completion, because some login managers shut
   the session down the moment the startup script completes.

* Update paths in docs
This commit is contained in:
Mark Karlinsky
2026-01-04 09:04:03 +02:00
committed by GitHub
parent 3158f5a9c0
commit 3bfa4a71ff
6 changed files with 41 additions and 15 deletions
+7 -8
View File
@@ -1,8 +1,7 @@
type = process
command = niri --session
restart = false
working-dir = $HOME
depends-on = dbus
after = niri-shutdown
chain-to = niri-shutdown
options: always-chain
type = process
command = niri --session
restart = false
working-dir = $HOME
ready-notification = pipevar:NOTIFY_FD
logfile = $HOME/.local/share/niri/niri.log
depends-on: dbus
-3
View File
@@ -1,3 +0,0 @@
type = scripted
command = dinitctl -u setenv WAYLAND_DISPLAY= XDG_SESSION_TYPE= XDG_CURRENT_DESKTOP= NIRI_SOCKET=
restart = false
+6
View File
@@ -0,0 +1,6 @@
type = internal
restart = false
depends-on: niri
waits-for.d: $XDG_CONFIG_HOME/dinit.d/niri.d/
waits-for.d: $HOME/.config/dinit.d/niri.d/
waits-for.d: /etc/dinit.d/user/niri.d/
+26 -2
View File
@@ -59,13 +59,37 @@ elif hash dinitctl >/dev/null 2>&1; then
fi
# Make sure there's no already running session.
if dinitctl --user is-started niri >/dev/null 2>&1; then
if dinitctl --quiet --user is-started niri 2>/dev/null; then
echo 'A niri session is already running.'
exit 1
fi
# Import the login manager environment into dinit
# Might not work correctly for multiline variable names, but
# it is reasonable to assume there are none
awk 'BEGIN{for(v in ENVIRON) if (v != "AWKPATH" && v != "AWKLIBPATH") print v}' 2>/dev/null | xargs dinitctl --quiet --user setenv 2>/dev/null
# Usually the dbus service would start as niri's dependency and inherit
# environment from dinit, but in case it has already started we need
# to update its environment.
if hash dbus-update-activation-environment >/dev/null 2>&1; then
dbus-update-activation-environment --all >/dev/null 2>&1
fi
# Create the directory for the logfile, if doesn't exist
mkdir --parents $HOME/.local/share/niri
# Start niri
dinitctl --user start niri
dinitctl --quiet --user start niri.target 2>&1
# Wait for termination
dinit-monitor --user --initial -c $'sh -c "
if [ "%s" = "stopped" ] || [ "%s" = "failed" ]; then
ppid=$(ps -o ppid= -p $$)
kill $ppid
fi"' niri >/dev/null 2>&1
# Unset environment that we've set.
dinitctl --quiet --user unsetenv WAYLAND_DISPLAY DISPLAY XDG_SESSION_TYPE XDG_CURRENT_DESKTOP NIRI_SOCKET 2>/dev/null
else
echo "No systemd or dinit detected, please use niri --session instead."
fi