From 3c3f06dc69c0dbf45ba5410ce0bf106857d4696d Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 10 Jul 2024 14:37:50 +0700 Subject: [PATCH] Run river in systemd --- environments/river/default.nix | 2 +- environments/river/home.nix | 65 ++++++++++++++++++++++------------ modules/wm/home.nix | 5 +++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/environments/river/default.nix b/environments/river/default.nix index 27f6807..9f2ea96 100644 --- a/environments/river/default.nix +++ b/environments/river/default.nix @@ -12,7 +12,7 @@ }; initial_session = { # zsh -c is to give river access to profile variables - command = "river"; + command = "${pkgs.systemd}/bin/systemctl --wait --user start river.service"; user = "zoriya"; }; }; diff --git a/environments/river/home.nix b/environments/river/home.nix index 0322abb..cf5e1ea 100644 --- a/environments/river/home.nix +++ b/environments/river/home.nix @@ -1,4 +1,8 @@ -{pkgs, ...}: let +{ + pkgs, + config, + ... +}: let cliphist = "${pkgs.cliphist}/bin/cliphist"; screenshot = pkgs.writeShellApplication { name = "screenshot"; @@ -102,8 +106,8 @@ in { "Super F" = "toggle-fullscreen"; "Super+Shift F" = "toggle-float"; - "Super R" = "spawn $BROWSER"; - "Super E" = "spawn $TERMINAL"; + "Super R" = "spawn ${config.home.sessionVariables.BROWSER}"; + "Super E" = "spawn ${config.home.sessionVariables.TERMINAL}}"; "Super P" = "spawn 'rofi -show drun -show-icons'"; "Super X" = "spawn '${screenshot}/bin/screenshot'"; "Super B" = "spawn '${pkgs.hyprpicker}/bin/hyprpicker | wl-copy'"; @@ -134,31 +138,46 @@ in { riverctl map normal Super 0 set-focused-tags "$all_tags" riverctl map normal Super+Shift 0 set-view-tags "$all_tags" ''; - systemd.extraCommands = [ - "systemctl --user reset-failed" - # "systemctl --user import-environment $VARIABLES" - "systemctl --user start river-session.target" - "trap 'systemctl --user start --job-mode=replace-irreversibly river-session-shutdown.target' INT TERM" - # && systemctl --user unset-environment $VARIABLES (in trap) - "hyprlock --immediate" - "sleep infinity" - ]; + systemd = { + # Only import env vars, do not use their systemctl --user start river-session.target that we override below. + enable = true; + extraCommands = [ + "systemd-notify --ready" + "hyprlock --immediate" + ]; + }; }; - systemd.user.targets.river-session-shutdown = { + # Run river in systemd directly and not by hand. Failing to do so will make graphical-session.target never stop. + # So a big wait time when shutting down & graphical services are not restarted when starting river again. + systemd.user.targets.river-session = { Unit = { - Description = "shutdown river compositor session"; - DefaultDependencies = "no"; - StopWhenUnneeded = true; - Conflicts = ["graphical-session.target" "graphical-session-pre.target" "river-session.target"]; - After = ["graphical-session.target" "graphical-session-pre.target" "river-session.target"]; - Before = ["shutdown.target"]; + Description = "river compositor session"; + Documentation = ["man:systemd.special(7)"]; + BindsTo = ["graphical-session.target"]; + Before = ["graphical-session.target"]; + Wants = ["graphical-session-pre.target"]; + After = ["graphical-session-pre.target"]; + RefuseManualStart = "yes"; + StopWhenUnneeded = "yes"; }; + }; + + systemd.user.services.river = { + Unit = { + Description = "River compositor"; + Documentation = "man:river(1)"; + BindsTo = ["river-session.target"]; + Before = ["river-session.target"]; + }; + Service = { - ExecStart = "${pkgs.procps}/bin/pidof river && ${pkgs.river}/bin/riverctl exit"; - }; - Install = { - WantedBy = ["shutdown.target"]; + Type = "notify"; + # used to get env/session vars (and path). + ExecStart = "/bin/sh -lc ${pkgs.river}/bin/river"; + TimeoutStopSec = 10; + NotifyAccess = "all"; + ExecStopPost = "${pkgs.systemd}/bin/systemctl --user unset-environment ${builtins.concatStringsSep " " config.wayland.windowManager.river.systemd.variables}"; }; }; diff --git a/modules/wm/home.nix b/modules/wm/home.nix index dd01e88..60bef27 100644 --- a/modules/wm/home.nix +++ b/modules/wm/home.nix @@ -88,4 +88,9 @@ in { ]; }; }; + systemd.user.services.hypridle = { + Unit = { + After = ["graphical-session.target"]; + }; + }; }