107 lines
3.5 KiB
Bash
Executable File
107 lines
3.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -u
|
|
|
|
DBUS_NAME="org.freedesktop.Notifications"
|
|
DBUS_PATH="/org/freedesktop/Notifications"
|
|
DBUS_IFAC_DUNST="org.dunstproject.cmd0"
|
|
DBUS_IFAC_PROP="org.freedesktop.DBus.Properties"
|
|
DBUS_IFAC_FDN="org.freedesktop.Notifications"
|
|
|
|
die(){ printf "%s\n" "${1}" >&2; exit 1; }
|
|
|
|
show_help() {
|
|
cat <<-EOH
|
|
Usage: dunstctl <command> [parameters]"
|
|
Commands:
|
|
action Perform the default action, or open the
|
|
context menu of the notification at the
|
|
given position
|
|
close Close the last notification
|
|
close-all Close the all notifications
|
|
context Open context menu
|
|
history-pop Pop one notification from history
|
|
status Check if
|
|
status-set [true|false] Set the status
|
|
debug Print debugging information
|
|
help Show this help
|
|
EOH
|
|
}
|
|
dbus_send_checked() {
|
|
dbus-send "$@"
|
|
rc="$?"
|
|
if [ "$rc" -eq "1" ]; then
|
|
echo "Failed to communicate with dunst, is it running? Or maybe the version is outdated." >&2
|
|
echo "Hint: You can try 'dunstctl debug' as a next debugging step." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
method_call() {
|
|
dbus_send_checked --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "$@"
|
|
}
|
|
|
|
property_get() {
|
|
dbus_send_checked --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "${DBUS_IFAC_PROP}.Get" "string:${DBUS_IFAC_DUNST}" "string:${1}"
|
|
}
|
|
|
|
property_set() {
|
|
dbus_send_checked --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "${DBUS_IFAC_PROP}.Set" "string:${DBUS_IFAC_DUNST}" "string:${1}" "${2}"
|
|
}
|
|
|
|
command -v dbus-send >/dev/null 2>/dev/null || \
|
|
die "Command dbus-send not found"
|
|
|
|
|
|
case "${1:-}" in
|
|
"action")
|
|
method_call "${DBUS_IFAC_DUNST}.NotificationAction" "int32:${2:-0}" >/dev/null
|
|
;;
|
|
"close")
|
|
method_call "${DBUS_IFAC_DUNST}.NotificationCloseLast" >/dev/null
|
|
;;
|
|
"close-all")
|
|
method_call "${DBUS_IFAC_DUNST}.NotificationCloseAll" >/dev/null
|
|
;;
|
|
"context")
|
|
method_call "${DBUS_IFAC_DUNST}.ContextMenuCall" >/dev/null
|
|
;;
|
|
"history-pop")
|
|
method_call "${DBUS_IFAC_DUNST}.NotificationShow" >/dev/null
|
|
;;
|
|
"status")
|
|
property_get running | ( read -r _ _ status; printf "%s\n" "${status}"; )
|
|
;;
|
|
"status-set")
|
|
[ "${2:-}" ] \
|
|
|| die "No status parameter specified. Please give either 'true' or 'false' as running parameter."
|
|
[ "${2}" = "true" ] || [ "${2}" = "false" ] \
|
|
|| die "Please give either 'true' or 'false' as running parameter."
|
|
property_set running variant:boolean:"${2}"
|
|
;;
|
|
"help"|"--help"|"-h")
|
|
show_help
|
|
;;
|
|
"debug")
|
|
dbus-send --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "${DBUS_IFAC_FDN}.GetServerInformation" >/dev/null 2>/dev/null \
|
|
|| die "Dunst is not running."
|
|
|
|
dbus-send --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "${DBUS_IFAC_FDN}.GetServerInformation" \
|
|
| (
|
|
read -r name _ version _
|
|
[ "${name}" = "dunst" ]
|
|
printf "dunst version: %s\n" "${version}"
|
|
) \
|
|
|| die "Another notification manager is running. It's not dunst"
|
|
|
|
dbus-send --print-reply=literal --dest="${DBUS_NAME}" "${DBUS_PATH}" "${DBUS_IFAC_DUNST}.Ping" >/dev/null 2>/dev/null \
|
|
|| die "Dunst controlling interface not available. Is the version too old?"
|
|
;;
|
|
"")
|
|
die "dunstctl: No command specified. Please consult the usage."
|
|
;;
|
|
*)
|
|
die "dunstctl: unrecognized command '${1:-}'. Please consult the usage."
|
|
;;
|
|
esac
|