blob: 95e40a7764479699af00f8f8dafca1f6410d2133 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#!/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=' \
'd/directory=' \
'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 cache_dir $CACHE/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 (realpath $_flag_f)
if ! test -f $chosen_wallpaper
echo "$chosen_wallpaper does not exist"
exit 1
end
# 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 (realpath $_flag_d)
if ! test -d $wallpapers_dir
echo "$wallpapers_dir does not exist"
exit 1
end
# 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" > /dev/null && log "Changed wallpaper on $monitor to $chosen_wallpaper"
end
# Unload unused wallpapers to preserve memory
hyprctl hyprpaper unload unused > /dev/null
# Generate colour scheme for wallpaper
set -l src (dirname (status filename))
$src/scheme/apply-scheme.fish $chosen_wallpaper
# 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
|