跳转至内容

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 属性来匹配通知。支持全局匹配。有关示例,请参阅 脚本。使用 -print 选项启动 dunst 以查找有关通知的有用信息,以便编写正确的规则。

修改

当匹配到通知时,您可以对其执行某些操作,例如修改格式字符串,这在您希望完全忽略某些通知时特别有用。在这种情况下,只需将 format="" 行添加到您的规则中。

另一个有用的功能是,如果您想将某些通知排除在历史记录之外,例如,如果您将 dunst 用作 音量指示器。为此,只需将 history_ignore=yes 添加到您的规则中。

脚本

Dunst 可以配置为根据特定的通知内容运行脚本。以下是一个使用 Dunst 在有人从 pidginAUR 登录时运行脚本的示例。

[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 的一部分自动完成,该文件随较新版本的 systemd 一起提供。

字体大小不匹配(表情符号比文本大得多)

这是由 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。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.