... | ... |
@@ -6,6 +6,32 @@ Set [X Window System][] [background][] image/video. |
6 | 6 |
[X Window System]: https://en.wikipedia.org/wiki/X_Window_System |
7 | 7 |
[background]: https://en.wikipedia.org/wiki/Wallpaper_(computing) |
8 | 8 |
|
9 |
+## Usage |
|
10 |
+ |
|
11 |
+`background --help`: |
|
12 |
+ |
|
13 |
+``` |
|
14 |
+background 1.0 |
|
15 |
+ |
|
16 |
+Set X Window System background image/video. |
|
17 |
+ |
|
18 |
+usage: |
|
19 |
+ background [-v|--video] [--] [<path>] |
|
20 |
+ background -h|--help |
|
21 |
+ background --version |
|
22 |
+ |
|
23 |
+options: |
|
24 |
+ -v, --video |
|
25 |
+ Changes the default <path> to |
|
26 |
+ ${XDG_DATA_HOME:-$HOME/.local/share}/backgrounds-video. |
|
27 |
+arguments: |
|
28 |
+ <path> |
|
29 |
+ If not a directory, set it as background. If a directory, search |
|
30 |
+ recursively in it (resolving symlinks) and set a random file as |
|
31 |
+ background. |
|
32 |
+ [default: ${XDG_DATA_HOME:-$HOME/.local/share}/backgrounds] |
|
33 |
+``` |
|
34 |
+ |
|
9 | 35 |
## License |
10 | 36 |
|
11 | 37 |
Licensed under the [ISC License][] unless otherwise noted, see the |
... | ... |
@@ -6,10 +6,14 @@ set -euC |
6 | 6 |
#//// Set X Window System background image/video. |
7 | 7 |
#//// |
8 | 8 |
###// usage: |
9 |
-#//// background [<path>] |
|
9 |
+#//// background [-v|--video] [--] [<path>] |
|
10 | 10 |
#//// background -h|--help |
11 | 11 |
#//// background --version |
12 | 12 |
#//// |
13 |
+###// options: |
|
14 |
+####/ -v, --video |
|
15 |
+#//// Changes the default <path> to |
|
16 |
+#//// ${XDG_DATA_HOME:-$HOME/.local/share}/backgrounds-video. |
|
13 | 17 |
###// arguments: |
14 | 18 |
####/ <path> |
15 | 19 |
#//// If not a directory, set it as background. If a directory, search |
... | ... |
@@ -37,9 +41,44 @@ in |
37 | 41 |
'--version') version; ;; |
38 | 42 |
esac |
39 | 43 |
|
44 |
+## Parse options |
|
45 |
+suffix='' |
|
46 |
+while [ $# -gt 0 ] |
|
47 |
+do |
|
48 |
+ case "$1" |
|
49 |
+ in |
|
50 |
+ '-v'|'--video') suffix='-video'; shift; ;; |
|
51 |
+ '--') shift; break; ;; |
|
52 |
+ *) break; ;; |
|
53 |
+ esac |
|
54 |
+done |
|
55 |
+ |
|
40 | 56 |
## Parse optional arguments |
41 |
-path="${XDG_DATA_HOME:-"$HOME/.local/share"}/backgrounds" |
|
57 |
+path="${XDG_DATA_HOME:-"$HOME/.local/share"}/backgrounds${suffix}" |
|
42 | 58 |
[ $# -eq 0 ] || { path="$1"; shift; } |
43 | 59 |
|
44 | 60 |
## Parse unrecognized arguments |
45 | 61 |
argend "$@" |
62 |
+ |
|
63 |
+## Convert `path` from directory to file if needed |
|
64 |
+if [ -d "$path" ] |
|
65 |
+then |
|
66 |
+ path="$(find -L "$path" \! -type d | shuf -n 1)" |
|
67 |
+fi |
|
68 |
+ |
|
69 |
+## Set `daemon` |
|
70 |
+daemon="$(dirname "$0")/../libexec/background/daemon" |
|
71 |
+ |
|
72 |
+## Opportunistically use `hsetroot` for images |
|
73 |
+if [ "$(command -v xdg-mime)" ] && [ "$(command -v hsetroot)" ] |
|
74 |
+then |
|
75 |
+ if xdg-mime query filetype "$path" | grep -q '^image/' |
|
76 |
+ then |
|
77 |
+ "$daemon" --kill |
|
78 |
+ hsetroot -cover "$path" |
|
79 |
+ exit 0 |
|
80 |
+ fi |
|
81 |
+fi |
|
82 |
+ |
|
83 |
+## Run daemon |
|
84 |
+setsid "$daemon" "$path" & |
46 | 85 |
new file mode 100755 |
... | ... |
@@ -0,0 +1,37 @@ |
1 |
+#!/bin/sh |
|
2 |
+set -euC |
|
3 |
+ |
|
4 |
+## Set `pidfile` |
|
5 |
+pidfile="${XDG_RUNTIME_DIR:-"/var/run/user/$(id -u)"}/background.pid" |
|
6 |
+ |
|
7 |
+## Kill any running daemon |
|
8 |
+if [ -r "$pidfile" ] |
|
9 |
+then |
|
10 |
+ pid="$(cat "$pidfile")" |
|
11 |
+ kill -- "-$pid" |
|
12 |
+ while kill -0 "$pid" 2> '/dev/null' ; do : ; done |
|
13 |
+fi |
|
14 |
+ |
|
15 |
+## Exit early if only killing |
|
16 |
+if [ "$1" = '--kill' ] |
|
17 |
+then |
|
18 |
+ exit 0 |
|
19 |
+fi |
|
20 |
+ |
|
21 |
+## Set up `pidfile` |
|
22 |
+printf '%s' "$$" >| "$pidfile" |
|
23 |
+trap 'rm "$pidfile"' EXIT |
|
24 |
+trap 'exit 0' INT TERM |
|
25 |
+ |
|
26 |
+## Set background |
|
27 |
+nice \ |
|
28 |
+ xwinwrap -fs -fdt -ov -un -b -s -st -sp -ni -nf -- \ |
|
29 |
+ mpv \ |
|
30 |
+ -wid WID \ |
|
31 |
+ --really-quiet \ |
|
32 |
+ --no-audio \ |
|
33 |
+ --panscan=1 \ |
|
34 |
+ --loop-file=inf \ |
|
35 |
+ --ytdl-format='bestvideo[height<=?720][fps<=?30]' \ |
|
36 |
+ "$@" \ |
|
37 |
+ 2> '/dev/null' |