{ config, pkgs, lib, flakeRoot, ... }: let username = config.defaultUser or "henrov"; homeDir = "/home/${username}"; wallpaperSrc = "${flakeRoot}/assets/Wallpapers"; wallpaperDst = "${homeDir}/Wallpapers"; script = pkgs.writeShellScript "wallpaper-sync-and-set.sh" '' #!/usr/bin/env bash set -euo pipefail SRC="${wallpaperSrc}" DST="${wallpaperDst}" mkdir -p "$SRC" "$DST" ######################################## # 2-way sync (additive, newer wins) ######################################## # SRC -> DST rsync -au "$SRC/" "$DST/" # DST -> SRC rsync -au "$DST/" "$SRC/" ######################################## # Initialize swww (safe if already running) ######################################## if ! pgrep -x swww-daemon >/dev/null; then swww init sleep 1 fi ######################################## # Get workspaces ######################################## WORKSPACES=$(hyprctl workspaces -j | jq -r '.[].id') ######################################## # Function: set random wallpaper for workspace ######################################## set_wallpaper() { local WS="$1" WALL=$(find "$DST" -type f | shuf -n 1) if [ -n "$WALL" ]; then hyprctl dispatch workspace "$WS" swww img "$WALL" --transition-type any fi } ######################################## # If workspace passed → only update that ######################################## if [ "$#" -eq 1 ]; then set_wallpaper "$1" exit 0 fi ######################################## # Otherwise: update all workspaces ######################################## for WS in $WORKSPACES; do set_wallpaper "$WS" done ''; in { ################################# # Packages ################################# environment.systemPackages = with pkgs; [ swww waypaper jq rsync ]; ################################# # Service: main worker ################################# systemd.user.services.wallpaperSync = { description = "2-way sync wallpapers + set random per workspace"; after = [ "graphical-session.target" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${script}"; }; wantedBy = [ "default.target" ]; # run at login }; ################################# # Timer: every hour ################################# systemd.user.timers.wallpaperSync = { description = "Run wallpaper sync hourly"; wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "2min"; OnUnitActiveSec = "1h"; Persistent = true; }; }; ################################# # Hyprland integration (new workspace) ################################# # This assumes you manage Hyprland via Nix/Home Manager ################################# environment.etc."hypr/hyprland.conf".text = lib.mkAfter '' # Run wallpaper script when workspace changes bind = SUPER, Return, exec, ${script} # Hook: when workspace is created/switched exec-once = hyprctl --batch "dispatch exec ${script}" ''; }