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 以在通知中尋找有用的信息來編寫合適的規則。
限定
- 譯者按:本小節原英文標題 「Modifying」 在譯為中文時,使用「修改」、「修飾」、「限定」等詞似乎不夠貼切。若存在更恰當的翻譯,請對本小節標題及內容進行相應修改。
當匹配到一條通知時,您可以對它執行某些特定操作如修改(modifying)格式字符串,這在您想完全忽略某些特定的通知時尤其有用。若如此做,您只需將 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)的。