You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.0 KiB
70 lines
2.0 KiB
#!/usr/bin/env bash |
|
|
|
# Taken from here: https://raw.githubusercontent.com/vlevit/notify-send.sh/master/notify-action.sh |
|
|
|
GDBUS_MONITOR_PID=/tmp/notify-action-dbus-monitor.$$.pid |
|
GDBUS_MONITOR=(gdbus monitor --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications) |
|
|
|
NOTIFICATION_ID="$1" |
|
if [[ -z "$NOTIFICATION_ID" ]]; then |
|
echo "no notification id passed: $@" |
|
exit 1; |
|
fi |
|
shift |
|
|
|
ACTION_COMMANDS=("$@") |
|
if [[ -z "$ACTION_COMMANDS" ]]; then |
|
echo "no action commands passed: $@" |
|
exit 1; |
|
fi |
|
|
|
cleanup() { |
|
rm -f "$GDBUS_MONITOR_PID" |
|
} |
|
|
|
create_pid_file(){ |
|
rm -f "$GDBUS_MONITOR_PID" |
|
umask 077 |
|
touch "$GDBUS_MONITOR_PID" |
|
} |
|
|
|
invoke_action() { |
|
invoked_action_id="$1" |
|
local action="" cmd="" |
|
for index in "${!ACTION_COMMANDS[@]}"; do |
|
if [[ $((index % 2)) == 0 ]]; then |
|
action="${ACTION_COMMANDS[$index]}" |
|
else |
|
cmd="${ACTION_COMMANDS[$index]}" |
|
if [[ "$action" == "$invoked_action_id" ]]; then |
|
bash -c "${cmd}" & |
|
fi |
|
fi |
|
done |
|
} |
|
|
|
monitor() { |
|
|
|
create_pid_file |
|
( "${GDBUS_MONITOR[@]}" & echo $! >&3 ) 3>"$GDBUS_MONITOR_PID" | while read -r line |
|
do |
|
local closed_notification_id="$(sed '/^\/org\/freedesktop\/Notifications: org.freedesktop.Notifications.NotificationClosed (uint32 \([0-9]\+\), uint32 [0-9]\+)$/!d;s//\1/' <<< "$line")" |
|
if [[ -n "$closed_notification_id" ]]; then |
|
if [[ "$closed_notification_id" == "$NOTIFICATION_ID" ]]; then |
|
invoke_action close |
|
break |
|
fi |
|
else |
|
local action_invoked="$(sed '/\/org\/freedesktop\/Notifications: org.freedesktop.Notifications.ActionInvoked (uint32 \([0-9]\+\), '\''\(.*\)'\'')$/!d;s//\1:\2/' <<< "$line")" |
|
IFS=: read invoked_id action_id <<< "$action_invoked" |
|
if [[ "$invoked_id" == "$NOTIFICATION_ID" ]]; then |
|
invoke_action "$action_id" |
|
break |
|
fi |
|
fi |
|
done |
|
kill $(<"$GDBUS_MONITOR_PID") |
|
cleanup |
|
} |
|
|
|
monitor
|
|
|