diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-17 16:18:16 +1100 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-17 16:18:16 +1100 |
| commit | 7205226e5f2f17c2ffa4cf16efa25a36d3e91125 (patch) | |
| tree | 928e453739ce25b4676484a4bc8ff5598044c565 | |
| download | caelestia-cli-7205226e5f2f17c2ffa4cf16efa25a36d3e91125.tar.gz caelestia-cli-7205226e5f2f17c2ffa4cf16efa25a36d3e91125.tar.bz2 caelestia-cli-7205226e5f2f17c2ffa4cf16efa25a36d3e91125.zip | |
Initial commit
| -rwxr-xr-x | change-wallpaper.fish | 104 | ||||
| -rwxr-xr-x | main.fish | 18 | ||||
| -rw-r--r-- | util.fish | 20 |
3 files changed, 142 insertions, 0 deletions
diff --git a/change-wallpaper.fish b/change-wallpaper.fish new file mode 100755 index 0000000..f590013 --- /dev/null +++ b/change-wallpaper.fish @@ -0,0 +1,104 @@ +#!/bin/fish + +set script_name (basename (status filename)) +set wallpapers_dir (xdg-user-dir PICTURES)/Wallpapers/ +set threshold 80 + +# Max 0 non-option args | h, f and d are exclusive | F and t are also exclusive +argparse -n 'caelestia-wallpaper' -X 0 -x 'h,f,d' -x 'F,t' \ + 'h/help' \ + 'f/file=!test -f "$_flag_value"' \ + 'd/directory=!test -d "$_flag_value"' \ + 'F/no-filter' \ + 't/threshold=!_validate_int --min 0' \ + -- $argv +or exit + +. (dirname (status filename))/util.fish + +if set -q _flag_h + echo 'Usage:' + echo ' caelestia wallpaper' + echo ' caelestia wallpaper [ -h | --help ]' + echo ' caelestia wallpaper [ -f | --file ]' + echo ' caelestia wallpaper [ -d | --directory ] [ -F | --no-filter ]' + echo ' caelestia wallpaper [ -d | --directory ] [ -t | --threshold ]' + echo + echo 'Options:' + echo ' -h, --help Print this help message and exit' + echo ' -f, --file <file> The file to change wallpaper to' + echo ' -d, --directory <directory> The folder to select a random wallpaper from (default '$wallpapers_dir')' + echo ' -F, --no-filter Do not filter by size' + echo ' -t, --threshold <threshold> The minimum percentage of the size the image must be greater than to be selected (default '$threshold')' +else + set -q XDG_CACHE_HOME && set cache_dir $XDG_CACHE_HOME/caelestia/wallpaper || set cache_dir ~/.cache/caelestia/wallpaper + + # The path to the last chosen wallpaper + set last_wallpaper_path "$cache_dir/last.txt" + + # Use wallpaper given as argument else choose random + if set -q _flag_f + set chosen_wallpaper "$(cd $(dirname $_flag_f) && pwd)/$(basename $_flag_f)" + + # Set last wallpaper if not same as given + if [ -f "$last_wallpaper_path" ] + set last_wallpaper (cat $last_wallpaper_path) + [ -z "$last_wallpaper" -o "$last_wallpaper" = "$chosen_wallpaper" ] && set -e last_wallpaper + end + else + # The path to the directory containing the selection of wallpapers + set -q _flag_d && set wallpapers_dir $_flag_d + + # Get all files in $wallpapers_dir and exclude the last wallpaper (if it exists) + if [ -f "$last_wallpaper_path" ] + set last_wallpaper (cat $last_wallpaper_path) + [ -n "$last_wallpaper" ] && set unfiltered_wallpapers (find $wallpapers_dir -type f | grep -v $last_wallpaper) + end + set -q unfiltered_wallpapers || set unfiltered_wallpapers (find $wallpapers_dir -type f) + + # Filter by resolution if no filter option is not given + if set -q _flag_F + set wallpapers $unfiltered_wallpapers + else + set -l screen_size (hyprctl monitors -j | jq -r 'max_by(.width * .height) | "\(.width)\n\(.height)"') + set -l wall_sizes (identify -ping -format '%w %h\n' $unfiltered_wallpapers) + + # Apply threshold + set -q _flag_t && set threshold $_flag_t + set screen_size[1] (math $screen_size[1] x $threshold / 100) + set screen_size[2] (math $screen_size[2] x $threshold / 100) + + # Add wallpapers that are larger than the screen size * threshold to list to choose from ($wallpapers) + for i in (seq 1 (count $wall_sizes)) + set -l wall_size (string split ' ' $wall_sizes[$i]) + if [ $wall_size[1] -ge $screen_size[1] -a $wall_size[2] -ge $screen_size[2] ] + set -a wallpapers $unfiltered_wallpapers[$i] + end + end + end + + # Check if the $wallpapers list is unset or empty + if ! set -q wallpapers || [ -z "$wallpapers" ] + echo "No eligible files found in $wallpapers_dir" + exit 1 + end + + # Choose a random wallpaper from the $wallpapers list + set chosen_wallpaper (random choice $wallpapers) + end + + # Change the wallpaper and output change if success + hyprctl hyprpaper preload $chosen_wallpaper > /dev/null + for monitor in (hyprctl -j monitors | jq -r '.[].name') + hyprctl hyprpaper wallpaper "$monitor,$chosen_wallpaper" && log "Changed wallpaper on $monitor to $chosen_wallpaper" > /dev/null + end + + # Unload unused wallpapers to preserve memory + hyprctl hyprpaper unload unused > /dev/null + + # Store the wallpaper chosen + mkdir -p $cache_dir + echo $chosen_wallpaper > $last_wallpaper_path + ln -sf $chosen_wallpaper "$cache_dir/current" + magick $chosen_wallpaper -fill black -colorize 10% -blur 0x10 "$cache_dir/blur" +end diff --git a/main.fish b/main.fish new file mode 100755 index 0000000..3292e65 --- /dev/null +++ b/main.fish @@ -0,0 +1,18 @@ +#!/bin/fish + +cd (dirname (status filename)) || exit + +. ./util.fish + +if test "$argv[1]" = change-wallpaper + ./change-wallpaper.fish $argv[2..] +end + +test "$argv[1]" != help && error "Unknown command: $argv[1]" + +echo 'Usage: caelestia COMMAND' +echo +echo 'COMMAND := help | change-wallpaper' +echo +echo ' help: show this help message' +echo ' change-wallpaper: change the wallpaper' diff --git a/util.fish b/util.fish new file mode 100644 index 0000000..4fe4444 --- /dev/null +++ b/util.fish @@ -0,0 +1,20 @@ +function log -a text + set_color cyan + # Pass arguments other than text to echo + echo $argv[2..] -- ":: $text" + set_color normal +end + +function warn -a text + set_color yellow + # Pass arguments other than text to echo + echo $argv[2..] -- ":: $text" + set_color normal +end + +function error -a text + set_color red + # Pass arguments other than text to echo + echo $argv[2..] -- ":: $text" + set_color normal +end |