Dunst
Dunst 是大多数桌面环境提供的通知守护进程的轻量级替代品。
安装
示例配置文件包含在 /etc/dunst/dunstrc
。将此文件复制到 ~/.config/dunst/dunstrc
并根据需要进行编辑。
启动 /usr/bin/dunst
并确保您的窗口管理器或桌面环境在启动/登录时启动它。
外观
通知中的文本可以设置样式。一些示例包括粗体、斜体、删除线和下划线。有关完整参考,请参阅 Pango 标记。如果将 markup
设置为 none
,则可以从通知中剥离 Pango。
可以指定通知的格式。选项如下
%a appname %s summary %b body %i iconname (including its path) %I iconname (without its path) %p progress value if set ([ 0%] to [100%]) or nothing
这些可以与 HTML 标记结合使用。例如,可以将 format
设置为 <b>%s</b>\n%b
,以获得粗体的通知摘要、换行符和未格式化的正文。
图标集
图标在配置文件 global
部分的 icon_path
选项中设置。需要状态、设备和旧版图标。默认情况下,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
快捷键
Dunst 可以使用 dunstctl 控制。您可以更新您的键盘快捷键以调用 dunstctl。
例如,要关闭所有通知
$ dunstctl close-all
要显示历史记录
$ dunstctl history-pop
规则
您可以在您的 dunstrc 文件中创建规则,这些规则匹配某些通知,然后对其执行操作,例如执行脚本。
过滤
要创建新规则,请在您的配置文件中创建一个具有自定义名称的新部分。在该部分中,您现在可以使用属性 appname、summary、body、icon、category、match_transient 和 msg_urgency 来匹配通知。支持 Globbing。有关示例,请参见脚本。使用 -print
选项启动 dunst,以找出有关通知的有用信息,从而编写正确的规则。
修改
当通知匹配时,您可以对其执行某些操作,例如修改格式字符串,如果您想完全忽略某些通知,这将特别有用。在这种情况下,只需将 format=""
行添加到您的规则中即可。
另一个有用的功能是,如果您想将某些通知保留在历史记录之外,例如,如果您将 dunst 用作音量指示器。要实现此目的,只需将 history_ignore=yes
添加到您的规则中即可。
脚本
可以将 Dunst 配置为根据某些通知内容运行脚本。这是一个使用 Dunst 在 pidgin 中的某人登录时运行脚本的示例
[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 和动作。
替换通知
您可以通过使用 -r ID
选项调用 dunstify 来为通知分配 ID,其中 ID
必须是整数。如果已存在具有该 ID 的通知,它将被新的通知替换。您也可以使用 dunstify -C ID
关闭通知。
但是,对于大多数用例,与微观管理 ID 相比,实现标签是首选,因为后者选项有许多隐藏的陷阱 [1]。替换 ID 可以被认为是用于调试和用于非常复杂的通知发送者,而不是通用做法 [2]。
具有相同标签(本例中为“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,如果通知被手动关闭,则返回 2 [3]。在后一种情况下,它返回由 Dunst 上下文菜单选择的动作。
除了使用上下文菜单调用动作外,您还可以定义鼠标事件如何调用动作 [4]。这允许 Dunst 以交互方式使用,正如 [5] 中建议的那样。当通知只有一个动作,或者当动作被命名为“default”时,可以通过鼠标中键单击通知来调用该动作(默认情况下或当 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 功能来实现简单的音量或亮度指示器通知,如这张图片 [6] 中所示。
要实现该音量指示器,请将以下脚本放在您的 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
环境变量可能未正确设置。[7]
要解决此问题,请将以下内容添加到您的 .xinitrc
systemctl --user import-environment DISPLAY
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh
的一部分自动完成。字体大小不匹配 (Emoji 比文本大得多)
这是由 fontconfig 未重新缩放位图字体引起的。这通常仅在使用某些 emoji 字体(例如 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。