73 lines
1.6 KiB
Nix
73 lines
1.6 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
writeShellScriptBin,
|
|
fd,
|
|
hyprland,
|
|
coreutils,
|
|
gawk,
|
|
}: let
|
|
script = writeShellScriptBin "hyprpaper-random" ''
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Directory (override with WALLPAPER_DIR)
|
|
DIR="''${WALLPAPER_DIR:-''${XDG_CONFIG_HOME:-$HOME/.config}/hypr/wallpapers}"
|
|
|
|
HYPRCTL="${hyprland}/bin/hyprctl"
|
|
FD="${fd}/bin/fd"
|
|
SHUF="${coreutils}/bin/shuf"
|
|
TR="${coreutils}/bin/tr"
|
|
AWK="${gawk}/bin/awk"
|
|
|
|
# Pick one random image (null-safe)
|
|
WALLPAPER="$(
|
|
"$FD" . "$DIR" -t f -e jpg -e jpeg -e png -e webp -e avif -0 --follow --hidden \
|
|
| "$SHUF" -z -n1 \
|
|
| "$TR" -d '\0'
|
|
)"
|
|
|
|
if [[ -z "''${WALLPAPER:-}" ]]; then
|
|
echo "No wallpapers found in: $DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Preload so hyprpaper can use it
|
|
"$HYPRCTL" hyprpaper preload "$WALLPAPER" >/dev/null 2>&1 || true
|
|
|
|
# Apply to all monitors
|
|
"$HYPRCTL" monitors \
|
|
| "$AWK" '/^Monitor /{print $2}' \
|
|
| while IFS= read -r mon; do
|
|
[ -n "$mon" ] && "$HYPRCTL" hyprpaper wallpaper "$mon,$WALLPAPER"
|
|
done
|
|
|
|
exit 0
|
|
'';
|
|
in
|
|
stdenv.mkDerivation {
|
|
pname = "hyprpaper-random";
|
|
version = "0.1.1";
|
|
|
|
dontUnpack = true;
|
|
|
|
buildInputs = [
|
|
fd
|
|
hyprland
|
|
coreutils
|
|
gawk
|
|
];
|
|
|
|
installPhase = ''
|
|
mkdir -p "$out/bin"
|
|
ln -s ${script}/bin/hyprpaper-random "$out/bin/hyprpaper-random"
|
|
'';
|
|
|
|
meta = with lib; {
|
|
description = "Minimal random wallpaper setter for Hyprpaper";
|
|
license = licenses.mit;
|
|
platforms = platforms.linux;
|
|
mainProgram = "hyprpaper-random";
|
|
};
|
|
}
|