diff --git a/home/features/cli/default.nix b/home/features/cli/default.nix index f328f47..971884d 100644 --- a/home/features/cli/default.nix +++ b/home/features/cli/default.nix @@ -73,6 +73,7 @@ go htop httpie + hyprpaper-random jq just lazygit diff --git a/home/features/desktop/hyprland.nix b/home/features/desktop/hyprland.nix index b1575a6..124bd5d 100644 --- a/home/features/desktop/hyprland.nix +++ b/home/features/desktop/hyprland.nix @@ -8,6 +8,7 @@ exec-once = [ "hyprpanel" "hyprpaper" + "hyprpaper-random" "hypridle" "wl-paste --type text --watch cliphist store" # Stores only text data "wl-paste --type image --watch cliphist store" # Stores only image data "wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\"" diff --git a/pkgs/default.nix b/pkgs/default.nix index b79dd07..0ce81b7 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -1,5 +1,6 @@ {pkgs, ...}: { # Define your custom packages here + hyprpaper-random = pkgs.callPackage ./hyprpaper-random {}; msty = pkgs.callPackage ./msty {}; msty-sidecar = pkgs.callPackage ./msty-sidecar {}; zellij-ps = pkgs.callPackage ./zellij-ps {}; diff --git a/pkgs/hyprpaper-random/default.nix b/pkgs/hyprpaper-random/default.nix new file mode 100644 index 0000000..4803c5a --- /dev/null +++ b/pkgs/hyprpaper-random/default.nix @@ -0,0 +1,72 @@ +{ + 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"; + }; + }