跳至內容
出自 Arch Linux 中文维基

Dunst 是大多數桌面環境提供的通知守護程序的輕量級替代品。

dunst 可以在 X11 或 Wayland 下運行。

安裝

安裝 dunst 軟體包。

示例配置文件位於 /etc/dunst/dunstrc。將其複製到 ~/.config/dunst/dunstrc 並進行編輯。

啟動 /usr/bin/dunst,確保您的窗口管理器或桌面環境在啟動/登錄時啟動 Dunst 。

注意:您似乎無需手動啟動 Dunst,因為當應用程式向 D-Bus 發送通知時,dbus-daemon 會自動啟動 Dunst。然而,通知服務經常會安裝多個守護進程,且無法知曉應當自動啟動哪一個。dbus-daemon 的維護者曾明確警告不要依賴自動啟動多提供者服務。

外觀

可為通知內的文本添加樣式如粗體、斜體、刪除線或下劃線。完整參考見 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
提示:這在最近版本的 systemd 上會自動作為 /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)的。

參見