{ config, lib, pkgs, ... }: # ====================== WALLPAPER========================= let # Source of wallpapers in your repo (as you specified) srcDir = "~/nixos/files/wallpapers/picture"; # Note: this is interpreted as a shell-style KEY=VALUE file. confFile = "~/nixos/files/conf/wallpaper/wallpaper.conf"; setWallpaperScript = pkgs.writeShellScript "set-hourly-wallpaper" '' set -euo pipefail # --- Defaults (can be overridden by wallpaper.conf) --- TRANSITION_TYPE="fade" # e.g. fade, wipe, simple, any TRANSITION_DURATION="2" # seconds (can be decimals) TRANSITION_FPS="60" # frames per second SRC_DIR="${srcDir}" # Load overrides (shell KEY=VALUE) if [ -f "${confFile}" ]; then # shellcheck disable=SC1090 . "${confFile}" fi DEST_DIR="$HOME/Pictures/Wallpapers" mkdir -p "$DEST_DIR" # Copy source wallpapers into user's Pictures/Wallpapers # -r recursive, -u update if newer # If the folder is empty or missing, don't crash the session. if [ -d "$SRC_DIR" ]; then cp -ru "$SRC_DIR"/. "$DEST_DIR"/ 2>/dev/null || true fi # Pick a random image from DEST_DIR img="$( find "$DEST_DIR" -type f \ \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' \) \ | shuf -n 1 )" [ -n "''${img:-}" ] || exit 0 # Ensure swww daemon is running (per-user) if ! ${pkgs.swww}/bin/swww query >/dev/null 2>&1; then ${pkgs.swww}/bin/swww-daemon >/dev/null 2>&1 & sleep 0.4 fi # Smooth transition wallpaper set exec ${pkgs.swww}/bin/swww img "$img" \ --transition-type "''${TRANSITION_TYPE}" \ --transition-duration "''${TRANSITION_DURATION}" \ --transition-fps "''${TRANSITION_FPS}" ''; in { # Packages needed by the script + swww environment.systemPackages = with pkgs; [ swww bash coreutils findutils util-linux ]; # Run for ANY logged-in user via systemd user units # (each user session has its own systemd --user instance) systemd.user.services.wallpaper-rotate = { description = "Copy wallpapers to ~/Pictures/Wallpapers and set a random wallpaper with transition"; serviceConfig = { Type = "oneshot"; ExecStart = "${setWallpaperScript}"; }; }; systemd.user.timers.wallpaper-rotate = { description = "Hourly wallpaper rotation timer"; wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "2min"; OnUnitActiveSec = "1h"; RandomizedDelaySec = "5min"; Unit = "wallpaper-rotate.service"; }; }; }