Commit | Line | Data |
---|---|---|
2953aaf3 | 1 | #! /bin/bash |
31df3021 | 2 | |
55b6848c SK |
3 | ### XXX Chose not to 'set -e' because arithmetic evaluation can cause a non-zero exit. |
4 | ### XXX Chose not to 'set -u' because unset params ($1, $2, ...) cause failures. | |
5 | ### Solutions to the above are ugly. | |
6 | ||
2953aaf3 SK |
7 | declare -a paths |
8 | declare -i n=0 | |
31df3021 | 9 | |
2953aaf3 SK |
10 | read_command() { |
11 | local char | |
12 | ||
13 | read -rsn 1 char | |
14 | case "$char" in | |
15 | q | Q) echo 'CMD_QUIT';; | |
16 | h | H) echo 'CMD_MOVE_BACK';; | |
17 | l | L) echo 'CMD_MOVE_FORWARD';; | |
0e76831b SK |
18 | f | F) echo 'CMD_FAVORITE_ADD';; |
19 | r | R) echo 'CMD_FAVORITE_REMOVE';; | |
ddd3f251 | 20 | s | S) echo 'CMD_SET_CURRENT';; |
2953aaf3 SK |
21 | *) echo 'CMD_UKNOWN';; |
22 | esac | |
23 | } | |
24 | ||
cdc33eec | 25 | paths_set() { |
2953aaf3 SK |
26 | local path |
27 | ||
cdc33eec | 28 | while read -r path |
2953aaf3 SK |
29 | do |
30 | if file "$path" | grep 'image data' > /dev/null | |
31 | then | |
32 | (( n++ )) | |
33 | # \r jumps to the beginning of the line: | |
34 | printf '\rFound %d images.' "$n" >&2 | |
55b6848c | 35 | paths["$(( n - 1 ))"]="$path" |
2953aaf3 SK |
36 | fi |
37 | done | |
2953aaf3 SK |
38 | printf '\n' >&2 |
39 | } | |
40 | ||
cdc33eec SK |
41 | paths_set_from_dir_find() { |
42 | paths_set < <(find "$1" -type f) | |
43 | } | |
44 | ||
45 | paths_set_from_favs() { | |
46 | paths_set < <(sort -k 2 "$FILE_WALLPAPER_FAVS" | awk '{sub("^" $1 " +", ""); print}') | |
47 | } | |
48 | ||
55b6848c SK |
49 | set_wallpaper() { |
50 | local -ri i="$1" | |
51 | local -r path="$2" | |
52 | ||
53 | printf '%d of %d %s\n' "$(( i + 1 ))" "$n" "$path" | |
54 | feh --bg-scale "$path" | |
55 | } | |
56 | ||
2953aaf3 | 57 | paths_preview() { |
55b6848c SK |
58 | local -i i=0 |
59 | local path="${paths[$i]}" | |
2953aaf3 | 60 | |
55b6848c | 61 | set_wallpaper "$i" "$path" |
2953aaf3 | 62 | |
55b6848c SK |
63 | while : |
64 | do | |
65 | if [[ "${paths[$i]}" != "$path" ]] | |
66 | then | |
67 | path="${paths[$i]}" | |
68 | set_wallpaper "$i" "$path" | |
69 | fi | |
2953aaf3 SK |
70 | |
71 | case "$(read_command)" in | |
72 | CMD_QUIT) | |
73 | exit 0;; | |
74 | CMD_MOVE_BACK) | |
55b6848c | 75 | (( i = i == 0 ? (n - 1) : i - 1));; |
2953aaf3 | 76 | CMD_MOVE_FORWARD) |
55b6848c | 77 | (( i = (i + 1) % n ));; |
0e76831b SK |
78 | CMD_FAVORITE_ADD) |
79 | printf 'Adding to favorites set: "%s"\n' "$path" >&2 | |
55b6848c | 80 | wallpaper_fav;; |
0e76831b SK |
81 | CMD_FAVORITE_REMOVE) |
82 | printf 'Removing from favorites set: "%s"\n' "$path" >&2 | |
83 | digest=$(sha256sum "$path" | awk '{print $1}') | |
84 | grep -v "$digest" "$FILE_WALLPAPER_FAVS" \ | |
85 | | sort -u \ | |
86 | | sponge "$FILE_WALLPAPER_FAVS" | |
87 | ;; | |
ddd3f251 SK |
88 | CMD_SET_CURRENT) |
89 | printf 'Setting as current: "%s"\n' "$path" >&2 | |
90 | echo "$path" > "$FILE_WALLPAPER_CURR";; | |
2953aaf3 | 91 | CMD_UKNOWN) |
55b6848c | 92 | continue;; |
2953aaf3 SK |
93 | esac |
94 | done | |
95 | } | |
96 | ||
97 | main() { | |
2953aaf3 | 98 | case "$1" in |
cdc33eec SK |
99 | f | fav) paths_set_from_favs;; |
100 | d | dir) paths_set_from_dir_find "$2";; | |
101 | a | all) paths_set_from_dir_find "$DIR_WALLPAPERS";; | |
102 | '') | |
103 | paths_set_from_dir_find "$DIR_WALLPAPERS";; | |
104 | *) | |
105 | printf 'Error: unknown source "%s"\n' "$1" >&2 | |
106 | exit 1;; | |
2953aaf3 SK |
107 | esac |
108 | ||
2953aaf3 SK |
109 | paths_preview |
110 | } | |
111 | ||
112 | main "$@" |