Dunst

出自 ArchWiki

Dunst 是大多数桌面环境提供的通知守护进程的轻量级替代品。

安装

安装 dunst 软件包。

示例配置文件包含在 /etc/dunst/dunstrc。将此文件复制到 ~/.config/dunst/dunstrc 并根据需要进行编辑。

启动 /usr/bin/dunst 并确保您的窗口管理器或桌面环境在启动/登录时启动它。

注意: 似乎没有必要手动启动 dunst,因为它可能会在程序通过 D-Bus 发送通知时被 dbus-daemon 自动启动。但是,通知服务通常安装了多个守护进程,并且无法知道哪个守护进程将被自动启动。 dbus-daemon 维护人员明确警告不要依赖自动启动来提供多提供商服务。

外观

通知中的文本可以设置样式。一些示例包括粗体、斜体、删除线和下划线。有关完整参考,请参阅 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
提示: 这会作为 systemd 的最新版本附带的 /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。