Dunst 是大多数桌面环境提供的通知守护程序的轻量级替代品。
dunst 可以在 X11 或 Wayland 下运行。
安装
安装 dunst包 软件包。
示例配置文件位于 /etc/dunst/dunstrc。将其复制到 ~/.config/dunst/dunstrc 并进行编辑。
启动 /usr/bin/dunst,确保您的窗口管理器或桌面环境在启动/登录时启动 Dunst 。
外观
可为通知内的文本添加样式如粗体、斜体、删除线或下划线。完整参考见 Pango 标记。若 markup 被设为 none,Pango 就会从通知中被移除。
通知的格式可被明确规定,选项如下:
%a 应用名称 %s 摘要 %b 主体内容 %i 图标名称(包含路径) %I 图标名称(无需路径) %p 进度(需要另外设定,[0%] - [100%])
它们可以与 HTML 标签结合起来使用。例如将 format 设为 <b>%s</b>\n%b 来显示加粗的摘要、换行和无格式的主体内容。
设定图标
在配置文件的 global 节 icon_path 项中设定图标。需要状态(status)、设备(device)和传统(legacy)图标。默认情况下,Dunst 会查找 gnome-icon-themeAUR 图标。若要使用 adwaita-icon-theme包替换 gnome-icon-theme,请改为:
icon_path = /usr/share/icons/Adwaita/16x16/status/:/usr/share/icons/Adwaita/16x16/devices/:/usr/share/icons/Adwaita/16x16/legacy/
除了直接指定图标文件夹的路径,您也可以在 global 节中直接指定图标主题。若如此,您需要设置 enable_recursive_icon_lookup=true 以在主题主文件夹的子文件夹中进行搜索。
例如:
icon_theme = Papirus enable_recursive_icon_lookup = true
快捷键
使用 dunstctl 控制 Dunst。您可以更新您的快捷键来使用 dunstctl。
例如,关闭所有通知:
$ dunstctl close-all
显示历史记录:
$ dunstctl history-pop
规则
你可以在你的 dunstrc 文件中创建匹配某些通知的规则,然后执行某些操作比如运行一个脚本。
匹配通知
要创建新的规则,请在您的配置文件中创建一个自定义命名的节,
您可以使用属性 appname(应用名)、summary(摘要)、body(主体)、icon(图标)、category(类别)、match_transient(瞬态通知)和 msg_urgency(紧急程度)来匹配通知。
支持通配符。请在#脚本查看示例。
用 -print 选项启动 Dunst 以在通知中寻找有用的信息来编写合适的规则。关于各属性的详细解释,请参阅 dunst(5) § filtering。
修改格式
当匹配到一条通知时,您可以对其格式进行修改,只需修改 format 选项。这在您想完全忽略某些特定的通知时尤其有用。若如此做,您只需将 format="" 行添加到您的规则(该规则会把匹配到的通知改成空的)。
另一个有用的特性是您可以完全将某些通知从历史记录中排除,例如您想将 Dunst 用作音量指示器,只需将 history_ignore=yes 行添加到相应的规则。
脚本
Dunst 可以根据某些通知内容来运行脚本,以下是一个当某来自 pidgin包 的人登录时,Dunst 运行脚本的示例:
[signed_on] appname = Pidgin summary = "*signed on*" urgency = low script = do_something.sh
指定的脚本将按以下参数的顺序来匹配:appname(应用名)、summary(摘要)、body(主体内容)、icon(图标)、urgency(紧急程度)。
暂停 Dunst
有两种方法暂停 Dunst:
- 使用
dunstctl - 您可以执行
dunstctl set-paused true/false/toggle来禁用/重新启用/切换通知状态。执行dunstctl is-paused来查看 Dunst 是否在运行/暂停。
- 使用
killall - 执行
killall -SIGUSR1 dunst来禁用,执行killall -SIGUSR2 dunst来重新启用。
一旦暂停,Dunst 会保留所有通知。再次启用 Dunst 后,将显示所有保留的通知。
Dunstify
Dunstify 是 notify-send 命令的替代品, 它完全兼容 notify-send 且可以与其一起使用,但它提供了更多功能。
除了 notify-send 中可用的一些选项,Dunstify 还提供一些其他特性如 ID 和 action(行为)。
替换通知
您可以给 dunstify 加上 -r ID 选项来给一条通知分配 ID,其中 ID 必须是整数。
如果拥有某 ID 的通知已经存在,那么它将会被具有相同 ID 的新通知替换。
您亦可使用 dunstify -C ID 来关闭一条通知。
然而,在大部分情况下,使用标签(tag)比控制 ID 更可取,因为后者有很多陷阱[1]。在调试或面对非常复杂的通知发送者时,请考虑替换 ID[2]。
具有相同标签(tag,本例中的 tag 是 test)的通知会被替换且无视 ID。
$ dunstify -h string:x-dunst-stack-tag:test Test -A 'tested,default' $ dunstify -h string:x-dunst-stack-tag:test Testing
行为
您可以从一个或多个 --action=action,label 参数中定义可以直接调用的行为。
例如:
$ dunstify --action="replyAction,reply" "Message received"
然后用户可以通过 Dunst 的上下文菜单来做出某些行为,发送到 dunstify 的某些请求会被阻止除非通知消失或一个行为已被选择。在前一种情况下,若通知超时,则 Dunstify 会返回1;若通知被手动关闭,Dunstidy 会返回2[3]。而在后一种情况下,会返回在上下文菜单中选择的行为。
除了通过上下文菜单调用行为,您也可以通过鼠标事件调用行为[4]。这可使 Dunst 更具交互性,这里也建议这样做。当通知只有一个行为或一个行为被命名为 “default” 时,您可以单击鼠标中键来调用这个行为。(Dunst 默认如此,当然您也可以在 dunstrc 中定义 mouse_middle_click = do_action).
reply_action () {}
forward_action () {}
handle_dismiss () {}
ACTION=$(dunstify --action="default,Reply" --action="forwardAction,Forward" "Message Received")
case "$ACTION" in
"default")
reply_action
;;
"forwardAction")
forward_action
;;
"2")
handle_dismiss
;;
esac
提示与技巧
将 dunstify 用作音量/亮度水平指示器
您可以使用替换 ID 功能来实现简单的音量或亮度指示器通知,如图所示 [5]。
要实现音量指标,请将以下脚本放在 PATH 中的某个位置。
#!/bin/bash
# changeVolume
# Arbitrary but unique message tag
msgTag="myvolume"
# Change the volume using alsa(might differ if you use pulseaudio)
amixer -c 0 set Master "$@" > /dev/null
# Query amixer for the current volume and whether or not the speaker is muted
volume="$(amixer -c 0 get Master | tail -1 | awk '{print $4}' | sed 's/[^0-9]*//g')"
mute="$(amixer -c 0 get Master | tail -1 | awk '{print $6}' | sed 's/[^a-z]*//g')"
if [[ $volume == 0 || "$mute" == "off" ]]; then
# Show the sound muted notification
dunstify -a "changeVolume" -u low -i audio-volume-muted -h string:x-dunst-stack-tag:$msgTag "Volume muted"
else
# Show the volume notification
dunstify -a "changeVolume" -u low -i audio-volume-high -h string:x-dunst-stack-tag:$msgTag \
-h int:value:"$volume" "Volume: ${volume}%"
fi
# Play the volume changed sound
canberra-gtk-play -i audio-volume-change -d "changeVolume"
现在只需将 changeVolume 2dB+ unmute 等绑定到某个热键上即可。您可能还想让 dunst 在历史记录中忽略此类通知,请参阅#修改格式。
覆盖以前的通知
对于某些通知(例如声音或亮度),你可能希望覆盖之前的通知。你可以使用#替换通知中的 Dunst 方法,也可以参考桌面通知程序#替换之前的通知,了解更一般的示例。
疑难解答
Dunst 无法通过 systemd 启动
在无登录管理器的情况下使用 Dunst 时,DISPLAY 环境变量可能不会被正确设置[6]。
欲修复,请添加以下行到您的 .xinitrc 文件:
systemctl --user import-environment DISPLAY
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh 的一部分被执行。字体大小不匹配(表情比字大)
这是因为 fontconfig包 没有重新调节位图字体。您通常会在某些表情符号上注意到这个问题。(例如:noto-fonts-emoji包 )
要解决这个问题,只需执行:
# ln -s /etc/fonts/conf.avail/10-scale-bitmap-fonts.conf /etc/fonts/conf.d/
并重启 Dunst。
部分应用程序的通知不遵守超时规则
这个问题具体表现为所有紧急级别的通知超时配置为 30 秒,但是来自特定应用如 Discord 、Mattermost 和 GitLab 的通知消失得很快(典型表现为3秒)。
您可以在上游找到更多细节:issue #276。
这是由于通知被强制关闭而发生的。要解决这个问题,您需要引入一个名为 ignore_dbusclose 的特殊参数。您可以通过启用该参数来忽略通过 D-Bus 发送的 closeNotification 消息。启用该参数可以确保应用程序通知遵循 Dunst 的配置。默认情况下,该参数是关闭(被设定为 false)的。