{ config, lib, pkgs, ... }: let moduleName = "hm-backgrounds"; src = ../home-manager/conf/backgrounds; video = "${config.home.homeDirectory}/backgrounds/videos/191684-891315375.mp4"; startWallpaper = pkgs.writeShellScript "start-video-wallpaper" '' set -euo pipefail VIDEO="${video}" MPVPAPER="${pkgs.mpvpaper}/bin/mpvpaper" HYPRCTL="${pkgs.hyprland}/bin/hyprctl" PKILL="${pkgs.procps}/bin/pkill" AWK="${pkgs.gawk}/bin/awk" # Avoid stacking multiple instances on rebuild / relogin $PKILL -x mpvpaper || true # Wait until Hyprland is ready for i in $(seq 1 30); do if $HYPRCTL monitors >/dev/null 2>&1; then break fi sleep 1 done # If the file doesn't exist, don't crash-loop forever if [ ! -f "$VIDEO" ]; then echo "Wallpaper video not found: $VIDEO" exit 0 fi # Detect monitors MONITORS="$($HYPRCTL monitors | $AWK '/^Monitor/ {print $2}')" if [ -z "$MONITORS" ]; then echo "No monitors detected by hyprctl." exit 0 fi # Start mpvpaper per monitor for m in $MONITORS; do $MPVPAPER -o "--loop --no-audio --panscan=1.0 --video-aspect-override=yes" "$m" "$VIDEO" & done wait ''; in { # 0) Make HM reliably manage/restart user services on switch # (prevents having to run systemctl --user daemon-reload manually) systemd.user.startServices = "sd-switch"; # 1) Put the whole repo folder into ~/backgrounds home.file."backgrounds".source = src; # 2) Ensure dependencies exist home.packages = with pkgs; [ mpv mpvpaper procps gawk ]; # 3) Run video wallpaper on ALL monitors # # IMPORTANT: # - Do NOT tie to graphical-session.target / hyprland-session.target, because in your setup # those targets were inactive/missing. # - Instead, start on user login via default.target, and the script itself waits for Hyprland. systemd.user.services.video-wallpaper = { Unit = { Description = "Video wallpaper (mpvpaper) on all Hyprland monitors"; }; Service = { Type = "simple"; Restart = "on-failure"; RestartSec = 2; ExecStart = startWallpaper; }; Install = { WantedBy = [ "default.target" ]; }; }; # 4) Restart on switch so new /nix/store script paths are picked up # (kept, but now it won’t break boot/login if the user bus isn’t ready) home.activation.restartVideoWallpaper = lib.hm.dag.entryAfter [ "writeBoundary" ] '' ${pkgs.systemd}/bin/systemctl --user daemon-reload || true ${pkgs.systemd}/bin/systemctl --user reset-failed video-wallpaper || true ${pkgs.systemd}/bin/systemctl --user restart video-wallpaper || true ''; home.file.".nixlog/loaded.${moduleName}-module-loaded".text = "loaded\n"; }