summaryrefslogtreecommitdiff
path: root/home/wayland/pkgs/wayland-scripts/src/bin/cwall
diff options
context:
space:
mode:
Diffstat (limited to 'home/wayland/pkgs/wayland-scripts/src/bin/cwall')
-rwxr-xr-xhome/wayland/pkgs/wayland-scripts/src/bin/cwall106
1 files changed, 106 insertions, 0 deletions
diff --git a/home/wayland/pkgs/wayland-scripts/src/bin/cwall b/home/wayland/pkgs/wayland-scripts/src/bin/cwall
new file mode 100755
index 0000000..6268390
--- /dev/null
+++ b/home/wayland/pkgs/wayland-scripts/src/bin/cwall
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+
+bgroot="$XDG_DATA_HOME/wayland"
+bgdesk="$bgroot/desktop"
+bglock="$bgroot/lockscreen"
+walldir="$HOME/pix/wall"
+
+die()
+{
+ command -v notify-send > /dev/null &&
+ notify-send " cwall" "$1"
+
+ printf "\033[31;1merr: %b\033[0m\n" "$1" 1>&2
+ exit "${2:-1}"
+}
+
+usage()
+{
+ echo 'Usage: cwall [wallpaper.img|directory]'
+}
+
+mimetype()
+{
+ file --brief --dereference --mime-type "$1"
+}
+
+randimg()
+{
+ # usage: randbg dir
+ : "${1:?}"
+ maxattempts=10
+ attempt=0
+
+ img=
+ while :; do
+ img="$(find "$1" \
+ -iname "*.avif" \
+ -o -iname "*.heic" \
+ -o -iname "*.heif" \
+ -o -iname "*.jpeg" \
+ -o -iname "*.jpg" \
+ -o -iname "*.jxl" \
+ -o -iname "*.png" \
+ -o -iname "*.webp" | shuf -n1)"
+
+ [ -z "$img" ] &&
+ return 1
+
+ # make sure the file is an actual image
+ case "$(mimetype "$img")" in
+ "image/"*)
+ echo "$img"
+ break
+ ;;
+ *)
+ attempt=$((attempt + 1))
+ [ "$attempt" -gt "$maxattempts" ] &&
+ return 1
+ esac
+ done
+}
+
+updatewall()
+{
+ : "${1:?}"
+
+ rm -f "$bgdesk" "$bglock"
+ cp "$1" "$bgdesk"
+ swaymsg "output * background '${bgdesk}' fill"
+ ffmpeg -loglevel quiet -i "$bgdesk" -vf "boxblur=50" -f mjpeg "$bglock"
+}
+
+########
+# MAIN #
+########
+
+if [ "$#" -eq 0 ]; then
+ input="$walldir"
+elif [ "$1" = "-h" ]; then
+ usage && exit 0
+else
+ input="$1"
+fi
+
+if [ ! -r "$input" ]; then
+ die "can't read $input"
+fi
+if [ ! -d "$bgroot" ]; then
+ mkdir -p "$bgroot"
+fi
+
+case "$(mimetype "$input")" in
+"image/"*)
+ updatewall "$input"
+ ;;
+"inode/directory")
+ if ! img=$(randimg "$input"); then
+ die "no image file in $input"
+ fi
+
+ updatewall "$img"
+ ;;
+*)
+ die "invalid input $input"
+ ;;
+esac