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';; | |
2953aaf3 SK |
20 | *) echo 'CMD_UKNOWN';; |
21 | esac | |
22 | } | |
23 | ||
cdc33eec | 24 | paths_set() { |
2953aaf3 SK |
25 | local path |
26 | ||
cdc33eec | 27 | while read -r path |
2953aaf3 SK |
28 | do |
29 | if file "$path" | grep 'image data' > /dev/null | |
30 | then | |
31 | (( n++ )) | |
32 | # \r jumps to the beginning of the line: | |
33 | printf '\rFound %d images.' "$n" >&2 | |
55b6848c | 34 | paths["$(( n - 1 ))"]="$path" |
2953aaf3 SK |
35 | fi |
36 | done | |
2953aaf3 SK |
37 | printf '\n' >&2 |
38 | } | |
39 | ||
cdc33eec SK |
40 | paths_set_from_dir_find() { |
41 | paths_set < <(find "$1" -type f) | |
42 | } | |
43 | ||
44 | paths_set_from_favs() { | |
45 | paths_set < <(sort -k 2 "$FILE_WALLPAPER_FAVS" | awk '{sub("^" $1 " +", ""); print}') | |
46 | } | |
47 | ||
55b6848c SK |
48 | set_wallpaper() { |
49 | local -ri i="$1" | |
50 | local -r path="$2" | |
51 | ||
52 | printf '%d of %d %s\n' "$(( i + 1 ))" "$n" "$path" | |
53 | feh --bg-scale "$path" | |
54 | } | |
55 | ||
2953aaf3 | 56 | paths_preview() { |
55b6848c SK |
57 | local -i i=0 |
58 | local path="${paths[$i]}" | |
2953aaf3 | 59 | |
55b6848c | 60 | set_wallpaper "$i" "$path" |
2953aaf3 | 61 | |
55b6848c SK |
62 | while : |
63 | do | |
64 | if [[ "${paths[$i]}" != "$path" ]] | |
65 | then | |
66 | path="${paths[$i]}" | |
67 | set_wallpaper "$i" "$path" | |
68 | fi | |
2953aaf3 SK |
69 | |
70 | case "$(read_command)" in | |
71 | CMD_QUIT) | |
72 | exit 0;; | |
73 | CMD_MOVE_BACK) | |
55b6848c | 74 | (( i = i == 0 ? (n - 1) : i - 1));; |
2953aaf3 | 75 | CMD_MOVE_FORWARD) |
55b6848c | 76 | (( i = (i + 1) % n ));; |
0e76831b SK |
77 | CMD_FAVORITE_ADD) |
78 | printf 'Adding to favorites set: "%s"\n' "$path" >&2 | |
55b6848c | 79 | wallpaper_fav;; |
0e76831b SK |
80 | CMD_FAVORITE_REMOVE) |
81 | printf 'Removing from favorites set: "%s"\n' "$path" >&2 | |
82 | digest=$(sha256sum "$path" | awk '{print $1}') | |
83 | grep -v "$digest" "$FILE_WALLPAPER_FAVS" \ | |
84 | | sort -u \ | |
85 | | sponge "$FILE_WALLPAPER_FAVS" | |
86 | ;; | |
2953aaf3 | 87 | CMD_UKNOWN) |
55b6848c | 88 | continue;; |
2953aaf3 SK |
89 | esac |
90 | done | |
91 | } | |
92 | ||
93 | main() { | |
2953aaf3 | 94 | case "$1" in |
cdc33eec SK |
95 | f | fav) paths_set_from_favs;; |
96 | d | dir) paths_set_from_dir_find "$2";; | |
97 | a | all) paths_set_from_dir_find "$DIR_WALLPAPERS";; | |
98 | '') | |
99 | paths_set_from_dir_find "$DIR_WALLPAPERS";; | |
100 | *) | |
101 | printf 'Error: unknown source "%s"\n' "$1" >&2 | |
102 | exit 1;; | |
2953aaf3 SK |
103 | esac |
104 | ||
2953aaf3 SK |
105 | paths_preview |
106 | } | |
107 | ||
108 | main "$@" |