| 1 | 1 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,45 @@ |
| 1 |
+#!/bin/sh |
|
| 2 |
+set -euC |
|
| 3 |
+ |
|
| 4 |
+##/// background 1.0 |
|
| 5 |
+#//// |
|
| 6 |
+#//// Set X Window System background image/video. |
|
| 7 |
+#//// |
|
| 8 |
+###// usage: |
|
| 9 |
+#//// background [<path>] |
|
| 10 |
+#//// background -h|--help |
|
| 11 |
+#//// background --version |
|
| 12 |
+#//// |
|
| 13 |
+###// arguments: |
|
| 14 |
+####/ <path> |
|
| 15 |
+#//// If not a directory, set it as background. If a directory, search |
|
| 16 |
+#//// recursively in it (resolving symlinks) and set a random file as |
|
| 17 |
+#//// background. |
|
| 18 |
+#//// [default: ${XDG_DATA_HOME:-$HOME/.local/share}/backgrounds]
|
|
| 19 |
+ |
|
| 20 |
+## Messages |
|
| 21 |
+prog="$(basename "$0")" |
|
| 22 |
+help() { sed -n 's|^#[#/]*/ \?||p' "$0"; exit 0; }
|
|
| 23 |
+version() { help | awk '/^$/{++p;next}p==0'; exit 0; }
|
|
| 24 |
+usage() { help | awk '/^$/{++p;next}p==2'; exit 0; }
|
|
| 25 |
+parse() { printf '%s: error: %s\n' "$prog" "$1"; usage; exit 1; } >&2
|
|
| 26 |
+error() { printf '%s: error: %s\n' "$prog" "$1"; exit 1; } >&2
|
|
| 27 |
+warning() { printf '%s: warning: %s\n' "$prog" "$1"; } >&2
|
|
| 28 |
+opt() { [ $# -gt 1 ] || parse "option '$1' value not provided"; }
|
|
| 29 |
+arg() { [ $# -gt 1 ] || parse "argument '$1' not provided"; }
|
|
| 30 |
+argend() { [ $# -eq 0 ] || parse "argument '$1' not recognized"; }
|
|
| 31 |
+dep() { [ "$(command -v "$1")" ] || error "'$1' not available"; }
|
|
| 32 |
+ |
|
| 33 |
+## Parse special options |
|
| 34 |
+case "${1:-}"
|
|
| 35 |
+in |
|
| 36 |
+ '-h'|'--help') help; ;; |
|
| 37 |
+ '--version') version; ;; |
|
| 38 |
+esac |
|
| 39 |
+ |
|
| 40 |
+## Parse optional arguments |
|
| 41 |
+path="${XDG_DATA_HOME:-"$HOME/.local/share"}/backgrounds"
|
|
| 42 |
+[ $# -eq 0 ] || { path="$1"; shift; }
|
|
| 43 |
+ |
|
| 44 |
+## Parse unrecognized arguments |
|
| 45 |
+argend "$@" |