aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-15 13:55:43 +0200
committerDanilo M. <danix@danix.xyz>2026-09-15 13:55:43 +0200
commitcbe4f39ab8b81f247b587347343297631cc020dc (patch)
treef5d18bb6126999b0eac93167d5f23d76bcbe2eaa
parentbcf15590f9e43f2d8978cf7cccfbdf3bb66e376f (diff)
downloadnotifyd-cbe4f39ab8b81f247b587347343297631cc020dc.tar.gz
notifyd-cbe4f39ab8b81f247b587347343297631cc020dc.zip
feat: add notify-snooze.sh
Snooze is a file the balloon renderer reads, not daemon state: the notification still arrives, lists and files, only its balloon is withheld. The last used value is kept under XDG state so a reboot does not forget it.
-rwxr-xr-xscripts/notify-snooze.sh42
-rwxr-xr-xtest-notify-snooze.sh40
2 files changed, 82 insertions, 0 deletions
diff --git a/scripts/notify-snooze.sh b/scripts/notify-snooze.sh
new file mode 100755
index 0000000..1289a9f
--- /dev/null
+++ b/scripts/notify-snooze.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Suppress every notification balloon for a number of minutes. The balloon
+# renderer reads the file and withholds them; the daemon is untouched. This is
+# deliberate: the notification still arrives, still enters the drawer's list
+# and still reaches history, only its balloon is held back.
+#
+# notify-snooze.sh 30
+# notify-snooze.sh off
+
+set -u
+
+dir="${XDG_RUNTIME_DIR:-/tmp}/notifyd"
+last="${HOME}/.local/state/notify-snooze.minutes"
+
+case "${1:-}" in
+ off)
+ rm -f "$dir/snooze"
+ exit 0
+ ;;
+ ''|*[!0-9]*)
+ printf 'usage: %s <minutes|off>\n' "${0##*/}" >&2
+ exit 1
+ ;;
+esac
+
+mkdir -p "$dir" "$(dirname "$last")"
+printf '%s\n' "$(( $(date +%s) + $1 * 60 ))" > "$dir/snooze.tmp"
+mv "$dir/snooze.tmp" "$dir/snooze"
+printf '%s\n' "$1" > "$last.tmp"
+mv "$last.tmp" "$last"
diff --git a/test-notify-snooze.sh b/test-notify-snooze.sh
new file mode 100755
index 0000000..5e25240
--- /dev/null
+++ b/test-notify-snooze.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Usage: ./test-notify-snooze.sh
+
+set -u
+here="$(cd "$(dirname "$0")" && pwd)"
+tmp="$(mktemp -d)"
+trap 'rm -rf "$tmp"' EXIT
+export XDG_RUNTIME_DIR="$tmp"
+export HOME="$tmp/home"
+mkdir -p "$HOME/.local/state"
+
+pass=0; fail=0
+check() { if [[ "$2" == "$3" ]]; then echo "ok $1"; pass=$((pass+1)); else echo "FAIL $1: want $2 got $3"; fail=$((fail+1)); fi; }
+
+before=$(date +%s)
+bash "$here/scripts/notify-snooze.sh" 30
+snooze="$tmp/notifyd/snooze"
+check "writes the snooze file" "yes" "$([[ -f "$snooze" ]] && echo yes)"
+delta=$(( $(cat "$snooze") - before ))
+check "is about 30 minutes out" "yes" "$([[ $delta -ge 1700 && $delta -le 1900 ]] && echo yes)"
+check "remembers the minutes" "30" "$(cat "$HOME/.local/state/notify-snooze.minutes")"
+bash "$here/scripts/notify-snooze.sh" off
+check "off removes the file" "no" "$([[ -f "$snooze" ]] && echo yes || echo no)"
+bash "$here/scripts/notify-snooze.sh" nope >/dev/null 2>&1
+check "rejects a bad argument" "1" "$?"
+
+printf '\n%d passed, %d failed\n' "$pass" "$fail"
+[[ "$fail" -eq 0 ]]