hypr: move session daemons from exec-once to systemd user services

Replace the hl.exec_cmd autostart block with declarative home-manager
services so the desktop shell has proper ordering and lifecycle:

- services.hyprpaper (with settings) for hyprpaper
- services.cliphist for the text/image clipboard watchers
- services.hyprpolkitagent for the polkit agent
- programs.quickshell.systemd for the quickshell shell
- a hand-written systemd.user.services.mako (home-manager has no unit)

All are tied to config.wayland.systemd.target (graphical-session.target),
which start-hyprland already activates. No UWSM required.
This commit is contained in:
2026-09-19 00:31:18 -07:00
parent 598a43eace
commit fb743d7353
4 changed files with 70 additions and 31 deletions

View File

@@ -18,6 +18,7 @@ in
./hyprlock.nix ./hyprlock.nix
./hypridle.nix ./hypridle.nix
./quickshell.nix ./quickshell.nix
./services.nix
]; ];
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -25,24 +26,32 @@ in
grim grim
slurp slurp
wl-clipboard wl-clipboard
cliphist
brightnessctl brightnessctl
jq jq
# Desktop Environment / Hyprland ecosystem # Desktop Environment / Hyprland ecosystem
hyprpaper hyprpaper
hyprpolkitagent
]; ];
# Build-time rendered wallpaper # Build-time rendered wallpaper
xdg.dataFile."backgrounds/silicon-volt.png".source = wallpaper; xdg.dataFile."backgrounds/silicon-volt.png".source = wallpaper;
# hyprpaper: load the Silicon Volt wallpaper on every output # hyprpaper: load the Silicon Volt wallpaper on every output. The
xdg.configFile."hypr/hyprpaper.conf".text = '' # home-manager module writes hypr/hyprpaper.conf and runs the daemon as a
preload = ${config.home.homeDirectory}/.local/share/backgrounds/silicon-volt.png # systemd user service tied to the Wayland session.
wallpaper = ,${config.home.homeDirectory}/.local/share/backgrounds/silicon-volt.png services.hyprpaper = {
splash = false enable = true;
''; settings = {
splash = false;
preload = "${config.home.homeDirectory}/.local/share/backgrounds/silicon-volt.png";
wallpaper = [
{
monitor = "";
path = "${config.home.homeDirectory}/.local/share/backgrounds/silicon-volt.png";
}
];
};
};
# Notifications: flat brutalist-glass cards with volt accents # Notifications: flat brutalist-glass cards with volt accents
services.mako = { services.mako = {

View File

@@ -1,5 +1,4 @@
{ {
pkgs,
lib, lib,
config, config,
... ...
@@ -282,24 +281,12 @@ in
]; ];
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# 6. Autostart Daemons & Apps (hl.on) # 6. Autostart Daemons & Apps
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
on = [ # Desktop daemons (quickshell, hyprpaper, mako, cliphist and the
{ # polkit agent) are declared as systemd user services in
_args = [ # home/hypr/services.nix and home/hypr/quickshell.nix, tied to the
"hyprland.start" # Wayland session target instead of exec-once.
(mkLua ''
function()
hl.exec_cmd("qs")
hl.exec_cmd("hyprpaper")
hl.exec_cmd("mako")
hl.exec_cmd("wl-paste --type text --watch cliphist store")
hl.exec_cmd("wl-paste --type image --watch cliphist store")
hl.exec_cmd("${pkgs.hyprpolkitagent}/libexec/hyprpolkitagent")
end'')
];
}
];
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# 7. Keybindings (hl.bind) # 7. Keybindings (hl.bind)

View File

@@ -14,11 +14,6 @@ let
(pkgs.quickshell or pkgs.qt6.qtbase); (pkgs.quickshell or pkgs.qt6.qtbase);
in in
{ {
home.packages = with pkgs; [
quickshellPkg
qt6.qtwayland
];
# Quickshell overview module for Hyprland (Super+Tab workspace overview). # Quickshell overview module for Hyprland (Super+Tab workspace overview).
# Vendored from: https://github.com/Shanu-Kumawat/quickshell-overview # Vendored from: https://github.com/Shanu-Kumawat/quickshell-overview
# Placed at the quickshell config root so a bare `qs` finds shell.qml. # Placed at the quickshell config root so a bare `qs` finds shell.qml.
@@ -26,4 +21,15 @@ in
source = ./quickshell; source = ./quickshell;
recursive = true; recursive = true;
}; };
# Run quickshell as a systemd user service tied to the Wayland session.
programs.quickshell = {
enable = true;
package = quickshellPkg;
systemd.enable = true;
};
home.packages = with pkgs; [
qt6.qtwayland
];
} }

37
home/hypr/services.nix Normal file
View File

@@ -0,0 +1,37 @@
{
config,
pkgs,
...
}:
let
# The Wayland session target used by the home-manager Wayland modules
# (resolves to graphical-session.target). start-hyprland activates it.
sessionTarget = config.wayland.systemd.target;
in
{
# PolicyKit agent (replaces the old hl.exec_cmd autostart).
services.hyprpolkitagent.enable = true;
# Clipboard history. The module runs both the text and image watchers as
# systemd user services and adds the cliphist package.
services.cliphist.enable = true;
# mako has no systemd service in home-manager, so declare one here.
# Configuration lives next to the rest of the desktop theme in default.nix.
systemd.user.services.mako = {
Unit = {
Description = "mako notification daemon";
After = [ sessionTarget ];
PartOf = [ sessionTarget ];
};
Service = {
ExecStart = "${pkgs.mako}/bin/mako";
Restart = "always";
RestartSec = 2;
};
Install.WantedBy = [ sessionTarget ];
};
}