当我使用notify-send
它在桌面上显示通知,然后再次使用它来显示不同的通知时,我注意到第二个通知仅显示后第一个已经消失了。
有没有办法可以notify-send
立即用其他通知替换现有通知?
答案1
你可以,但你必须使用打过补丁的通知库这样做(更新:自 22.10 起不再需要)
notify-send
无法在现有通知超时(或消失)之前替换它们。这是已知错误。然而,错误报告的评论者已发布补丁要解决这个问题。
更新:该补丁已合并到 libnotify 0.7.10 中,该版本于 2022 年 4 月 27 日发布,并首次包含在 Ubuntu 22.10 中。
安装补丁libnotify-bin来自 PPA
我已经创建了一个修补版本libnotify-bin允许在我的 PPA 中进行替换的软件包。目前它仅适用于 Ubuntu 12.04,但如果您需要它用于任何其他当前支持的版本,请发表评论,我会尽力提供它。
要安装,请打开终端并:
sudo apt-add-repository ppa:izx/askubuntu
sudo apt-get update
sudo apt-get install libnotify-bin
如何使用替换功能
补丁中notify-send
包含两个新开关,-p
(或--print-id
)和-r
(或--replace-id
)。 补丁--help
对它们的描述如下:
-p, --print-id Print the notification ID.
-r, --replace-id=REPLACE_ID The ID of the notification to replace.
使用
-p
,每个notify-send
都会输出一个ID否(数字/整数)。notify-send
再次发出-r N
通知将取代之前的通知立即地。例如,对于 bash,您可以
notify-send -p ...
使用以下命令保存 ID:NID=$(notify-send -p "MESSAGE-1")
然后将其替换为:
notify-send -r $NID "MESSAGE-2"
您可以在脚本中重复使用
-p
和-r
,只要-r
在开始时将ID初始化为0即可。这是一个简单的脚本,显示以半秒为间隔从 0 到 100 计数的通知:
#!/bin/bash NID=0 for i in {0..100..10}; do NID=$(notify-send -p -r $NID $i) sleep 0.5 done
答案2
您可以使用“同步”提示来创建“确认”通知,以取代之前的确认通知。例如:
notify-send "Message" -h string:x-canonical-private-synchronous:anything
“x-canonical-private-synchronous”提示在这个文件。要指定提示,请使用-h type:name:value
。这里的类型是string
,名称是x-canonical-private-synchronous
,并且值似乎可以是任何您想要的值。
因此如果您的第一个通知是使用该提示创建的和第二个也是如此,第二个将立即取代第一个。(见动画和持续时间在文档中,在“确认气泡”栏中。)
答案3
交叉引用:
如何强制在notify-osd中显示新的通知而不等待之前的通知退出?
没有补丁你可以简单地做
#!/bin/bash
for i in {0..100..10}
do
killall notify-osd
notify-send "testing" $i
sleep 1
done
书签:
如何使用“notify-send”立即替换现有通知?
发送错误“notify-osd(2592): 操作不允许”。这是什么意思?
这可能意味着权限不足,需要:
sudo killall notify-osd
答案4
这是一个工作示例Mark L 的回答:
利用这种方法确认气泡与顶部面板栏重叠发送。传统上通知气泡出现在顶部面板栏的下方。
通知气泡通常持续几秒钟,但上面的gif
确认气泡会立即被下一个气泡替换。方法是notify-send
循环调用命令:
# Make volume bar using progress bar methods
VolumeBar $CurrVolume
# Ask Ubuntu: https://askubuntu.com/a/871207/307523
notify-send --urgency=critical "tvpowered" \
-h string:x-canonical-private-synchronous:volume \
--icon=/usr/share/icons/gnome/48x48/devices/audio-speakers.png \
"Volume: $CurrVolume $Bar"
在上面的代码片段中,函数根据传入的值VolumeBar
设置带有进度条的变量。$Bar
$CurrVolume