如何使用“notify-send”立即替换现有通知?

如何使用“notify-send”立即替换现有通知?

当我使用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 的回答

tvpowered 音量.gif

利用这种方法确认气泡与顶部面板栏重叠发送。传统上通知气泡出现在顶部面板栏的下方。

通知气泡通常持续几秒钟,但上面的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

相关内容