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 属性来匹配通知。支持全局匹配。有关示例,请参阅 脚本。使用 -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。