summaryrefslogtreecommitdiff
path: root/home/wayland/pkgs/wayland-scripts
diff options
context:
space:
mode:
Diffstat (limited to 'home/wayland/pkgs/wayland-scripts')
-rw-r--r--home/wayland/pkgs/wayland-scripts/default.nix46
-rwxr-xr-xhome/wayland/pkgs/wayland-scripts/src/bin/cwall106
2 files changed, 152 insertions, 0 deletions
diff --git a/home/wayland/pkgs/wayland-scripts/default.nix b/home/wayland/pkgs/wayland-scripts/default.nix
new file mode 100644
index 0000000..bded5e7
--- /dev/null
+++ b/home/wayland/pkgs/wayland-scripts/default.nix
@@ -0,0 +1,46 @@
+{
+ stdenvNoCC,
+ lib,
+ makeWrapper,
+
+ bash,
+ sway,
+ ffmpeg,
+ libnotify,
+}:
+
+stdenvNoCC.mkDerivation {
+ pname = "wayland-scipts";
+ version = "1717572072";
+ src = ./src;
+
+ strictDeps = true;
+ outputs = [ "out" ];
+ buildInputs = [ bash ];
+ nativeBuildInputs = [ makeWrapper ];
+
+ postPatch = ''
+ for sh in bin/*; do
+ patchShebangs --host "$sh"
+ done
+ '';
+
+ installPhase = ''
+ runHook preInstall
+ cp -r ./ $out
+ runHook postInstall
+ '';
+
+ postInstall = ''
+ wrapProgram $out/bin/cwall \
+ --prefix PATH : ${lib.makeBinPath [ ffmpeg libnotify sway ]}
+ '';
+
+ meta = {
+ description = "Wayland scripts for sway";
+ homepage = "https://www.sinanmohd.com";
+ license = lib.licenses.gpl3;
+ platforms = lib.platforms.unix;
+ maintainers = with lib.maintainers; [ sinanmohd ];
+ };
+}
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