diff --git a/home/common/programs/hyprland/default.nix b/home/common/programs/hyprland/default.nix index 3762e40..5a1cbbe 100644 --- a/home/common/programs/hyprland/default.nix +++ b/home/common/programs/hyprland/default.nix @@ -14,6 +14,7 @@ in ./cursor.nix ./waybar.nix ./quickshell.nix + ./wallpapers.nix ]; home.packages = with pkgs; [ @@ -46,11 +47,12 @@ in gap_size = 5; bg_col = "rgb(000000)"; workspace_method = "center current"; + skip_empty = true; }; hyprfocus = { enabled = true; mode = "flash"; - flash_opacity = 1.8; # Flash brighter instead of dimmer + flash_opacity = 0.8; # Flash brighter instead of dimmer }; overview = { autoDrag = true; @@ -129,6 +131,7 @@ in "exec-once" = [ "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" "nm-applet" + "hyprpaper" "hyprsunset" "nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended" ]; diff --git a/home/common/programs/hyprland/wallpapers.nix b/home/common/programs/hyprland/wallpapers.nix new file mode 100644 index 0000000..d2adc55 --- /dev/null +++ b/home/common/programs/hyprland/wallpapers.nix @@ -0,0 +1,175 @@ +{ pkgs, ... }: +let + # Horizontal wallpapers (3840x2160) for HDMI-A-1 and DP-1 + # Just add any image URL you want here + horizontal = [ + "https://images.hdqwalls.com/download/black-red-square-rectangle-rq-3840x2160.jpg" + "https://images.hdqwalls.com/download/metals-shapes-abstract-8k-8c-3840x2160.jpg" + "https://images.hdqwalls.com/download/vertical-lines-colorful-abstract-5k-hu-3840x2160.jpg" + "https://images.hdqwalls.com/download/cyberpunk-drive-neon-metropolis-if-3840x2160.jpg" + "https://images.hdqwalls.com/download/horizon-zero-dawn-abstract-m2-3840x2160.jpg" + "https://images.hdqwalls.com/download/pcb-circuit-board-abstract-x3-3840x2160.jpg" + "https://images.hdqwalls.com/download/upcoming-stars-6h-3840x2160.jpg" + "https://images.hdqwalls.com/download/abstract-colors-glitter-4k-8m-3840x2160.jpg" + "https://images.hdqwalls.com/download/rainbow-spectrum-4k-h2-3840x2160.jpg" + "https://images.hdqwalls.com/download/time-lapse-photography-tf-3840x2160.jpg" + "https://images.hdqwalls.com/download/women-bokeh-rain-7q-3840x2160.jpg" + "https://images.hdqwalls.com/download/fire-bokeh-5k-vm-3840x2160.jpg" + "https://images.hdqwalls.com/download/train-track-ocean-beach-mountain-photography-5k-mh-3840x2160.jpg" + "https://images.hdqwalls.com/download/bullet-train-motion-view-from-inside-ld-3840x2160.jpg" + "https://images.hdqwalls.com/download/long-exposure-photo-of-a-highway-gf-3840x2160.jpg" + "https://images.hdqwalls.com/download/hohenschwangau-castle-in-germany-5k-tb-3840x2160.jpg" + "https://images.hdqwalls.com/download/girl-watching-glowing-metropolis-tg-3840x2160.jpg" + "https://images.hdqwalls.com/download/cosmic-storm-over-alien-metropolis-dl-3840x2160.jpg" + "https://images.hdqwalls.com/download/win-11-abstract-5k-7o-3840x2160.jpg" + "https://images.hdqwalls.com/download/windows-11-5k-zz-3840x2160.jpg" + "https://images.hdqwalls.com/download/localhost-lab-where-ideas-take-shape-ij-3840x2160.jpg" + "https://images.hdqwalls.com/download/ipad-os18-purple-dark-jf-3840x2160.jpg" + "https://images.hdqwalls.com/download/linux-nixos-7q-3840x2160.jpg" + "https://images.hdqwalls.com/download/macbook-pro-m2-js-3840x2160.jpg" + "https://images.hdqwalls.com/download/0101-dw-3840x2160.jpg" + "https://images.hdqwalls.com/download/apple-studio-display-wwdc-qg-3840x2160.jpg" + "https://images.hdqwalls.com/download/starfield-i-mac-ie-3840x2160.jpg" + ]; + + # Vertical wallpapers (2160x3840) for DP-2 + # Same images in vertical resolution + vertical = [ + "https://images.hdqwalls.com/download/black-red-square-rectangle-rq-2160x3840.jpg" + "https://images.hdqwalls.com/download/metals-shapes-abstract-8k-8c-2160x3840.jpg" + "https://images.hdqwalls.com/download/vertical-lines-colorful-abstract-5k-hu-2160x3840.jpg" + "https://images.hdqwalls.com/download/cyberpunk-drive-neon-metropolis-if-2160x3840.jpg" + "https://images.hdqwalls.com/download/horizon-zero-dawn-abstract-m2-2160x3840.jpg" + "https://images.hdqwalls.com/download/pcb-circuit-board-abstract-x3-2160x3840.jpg" + "https://images.hdqwalls.com/download/upcoming-stars-6h-2160x3840.jpg" + "https://images.hdqwalls.com/download/abstract-colors-glitter-4k-8m-2160x3840.jpg" + "https://images.hdqwalls.com/download/rainbow-spectrum-4k-h2-2160x3840.jpg" + "https://images.hdqwalls.com/download/time-lapse-photography-tf-2160x3840.jpg" + "https://images.hdqwalls.com/download/women-bokeh-rain-7q-2160x3840.jpg" + "https://images.hdqwalls.com/download/fire-bokeh-5k-vm-2160x3840.jpg" + "https://images.hdqwalls.com/download/train-track-ocean-beach-mountain-photography-5k-mh-2160x3840.jpg" + "https://images.hdqwalls.com/download/bullet-train-motion-view-from-inside-ld-2160x3840.jpg" + "https://images.hdqwalls.com/download/long-exposure-photo-of-a-highway-gf-2160x3840.jpg" + "https://images.hdqwalls.com/download/hohenschwangau-castle-in-germany-5k-tb-2160x3840.jpg" + "https://images.hdqwalls.com/download/girl-watching-glowing-metropolis-tg-2160x3840.jpg" + "https://images.hdqwalls.com/download/cosmic-storm-over-alien-metropolis-dl-2160x3840.jpg" + "https://images.hdqwalls.com/download/win-11-abstract-5k-7o-2160x3840.jpg" + "https://images.hdqwalls.com/download/windows-11-5k-zz-2160x3840.jpg" + "https://images.hdqwalls.com/download/localhost-lab-where-ideas-take-shape-ij-2160x3840.jpg" + "https://images.hdqwalls.com/download/ipad-os18-purple-dark-jf-2160x3840.jpg" + "https://images.hdqwalls.com/download/linux-nixos-7q-2160x3840.jpg" + "https://images.hdqwalls.com/download/macbook-pro-m2-js-2160x3840.jpg" + "https://images.hdqwalls.com/download/0101-dw-2160x3840.jpg" + "https://images.hdqwalls.com/download/apple-studio-display-wwdc-qg-2160x3840.jpg" + "https://images.hdqwalls.com/download/starfield-i-mac-ie-2160x3840.jpg" + ]; + + # Create wallpaper rotation script + rotateScript = pkgs.writeShellScript "hyprpaper-rotate" '' + set -euo pipefail + + # Check if hyprpaper is running + if ! pgrep -x hyprpaper > /dev/null; then + echo "Error: hyprpaper is not running" + echo "Start it with: hyprpaper &" + exit 1 + fi + + CACHE_DIR="$HOME/.cache/wallpapers" + mkdir -p "$CACHE_DIR" + + # Arrays of wallpaper URLs + HORIZONTAL=(${builtins.concatStringsSep " " (map (url: ''"${url}"'') horizontal)}) + VERTICAL=(${builtins.concatStringsSep " " (map (url: ''"${url}"'') vertical)}) + + # Function to download wallpaper if not cached + get_wallpaper() { + local url="$1" + local filename=$(basename "$url") + local filepath="$CACHE_DIR/$filename" + + if [ ! -f "$filepath" ]; then + echo "Downloading $filename..." >&2 + ${pkgs.curl}/bin/curl -sSL -o "$filepath" "$url" || { + echo "Failed to download $url" >&2 + return 1 + } + fi + + echo "$filepath" + } + + # Function to get random element from array + random_choice() { + local arr=("$@") + local size=''${#arr[@]} + local idx=$((RANDOM % size)) + echo "''${arr[$idx]}" + } + + # Get list of connected monitors and their orientations + readarray -t MONITORS < <(${pkgs.hyprland}/bin/hyprctl monitors -j | \ + ${pkgs.jq}/bin/jq -r '.[] | "\(.name)|\(.width)|\(.height)|\(.transform)"') + + # Apply wallpapers to each monitor + for monitor_info in "''${MONITORS[@]}"; do + IFS='|' read -r name width height transform <<< "$monitor_info" + + # Determine if monitor is vertical (considering transform) + # transform 1 or 3 means 90/270 degree rotation + if [[ "$transform" == "1" || "$transform" == "3" ]]; then + # Transform swaps width/height, so check original dimensions + if [ "$width" -lt "$height" ]; then + # After transform, it's horizontal + wallpaper_url=$(random_choice "''${HORIZONTAL[@]}") + else + # After transform, it's vertical + wallpaper_url=$(random_choice "''${VERTICAL[@]}") + fi + else + # No rotation or 180 degree rotation + if [ "$width" -lt "$height" ]; then + wallpaper_url=$(random_choice "''${VERTICAL[@]}") + else + wallpaper_url=$(random_choice "''${HORIZONTAL[@]}") + fi + fi + + # Download and apply wallpaper + wallpaper_path=$(get_wallpaper "$wallpaper_url") + if [ -n "$wallpaper_path" ]; then + echo "Setting $name to $wallpaper_path" >&2 + ${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper "$name,$wallpaper_path,cover" + fi + done + ''; +in +{ + # Export for use in monitors.nix + home.file.".local/bin/hyprpaper-rotate".source = rotateScript; + + # Systemd service and timer for rotation + systemd.user.services.hyprpaper-rotate = { + Unit = { + Description = "Rotate Hyprland wallpapers"; + After = [ "graphical-session.target" ]; + }; + Service = { + Type = "oneshot"; + ExecStart = "${rotateScript}"; + }; + }; + + systemd.user.timers.hyprpaper-rotate = { + Unit = { + Description = "Rotate Hyprland wallpapers every 12 hours"; + }; + Timer = { + OnUnitActiveSec = "12h"; + Persistent = true; + }; + Install = { + WantedBy = [ "timers.target" ]; + }; + }; +} diff --git a/home/desktop/default.nix b/home/desktop/default.nix index 7c8f8f9..e58e826 100644 --- a/home/desktop/default.nix +++ b/home/desktop/default.nix @@ -45,6 +45,7 @@ exec-once = [ "hyprctl setcursor Nordzy-cursors 42" + "$HOME/.local/bin/hyprpaper-rotate" ]; windowrule = [ diff --git a/home/desktop/monitors.nix b/home/desktop/monitors.nix index dede8ff..4833ff7 100644 --- a/home/desktop/monitors.nix +++ b/home/desktop/monitors.nix @@ -5,20 +5,6 @@ config, ... }: -let - wallpaper1 = pkgs.fetchurl { - url = "https://images.hdqwalls.com/download/black-red-square-rectangle-rq-3840x2160.jpg"; - hash = "sha256-ZWJKHHye6Ukjd+v4bwmidJim4z+6woM8e7n3bExf6kc="; - }; - wallpaper2 = pkgs.fetchurl { - url = "https://images.hdqwalls.com/download/metals-shapes-abstract-8k-8c-3840x2160.jpg"; - hash = "sha256-EYG89NfMjylnNXNFtmEYYjEFq/j22ORvnw/OTcY0BVs="; - }; - wallpaper-vertical = pkgs.fetchurl { - url = "https://images.hdqwalls.com/download/horizon-zero-dawn-abstract-m2-2160x3840.jpg"; - hash = "sha256-zwMnHigZhqeDSrtpyxC0hpn8p9Z7bI8tXx/uNxhSa60="; - }; -in { wayland.windowManager.hyprland.settings = { monitor = [ @@ -37,15 +23,4 @@ in "6, monitor:DP-1" # top-left ]; }; - - services.hyprpaper.settings.preload = [ - (builtins.toString wallpaper1) - (builtins.toString wallpaper2) - (builtins.toString wallpaper-vertical) - ]; - services.hyprpaper.settings.wallpaper = [ - "HDMI-A-1,${builtins.toString wallpaper1}" - "DP-1,${builtins.toString wallpaper2}" - "DP-2,${builtins.toString wallpaper-vertical}" - ]; }