如何使用“通知发送”立即替换现有通知?


23

当我用来notify-send在桌面上显示通知,然后再次使用它显示另一个通知时,我注意到第二个通知仅第一个通知消失后才显示。

有没有一种方法可以notify-send立即将现有通知替换为其他通知?

Answers:


16

可以,但是必须使用修补的libnotify来这样做

notify-send无法在现有通知超时(或消失)之前替换现有通知。这是一个已知的错误。但是,有关错误报告的评论者已发布了补丁来对其进行修复。

从PPA 安装修补的libnotify-bin

我创建了libnotify-bin软件包的修补版本,该版本允许在我的PPA中进行替换。当前它仅适用于Ubuntu 12.04,但是如果您需要其他任何当前受支持的发行版,请发表评论,我会尽力使其可用。

要安装,请打开一个终端,然后:

须藤apt-add-repository ppa:izx / askubuntu
sudo apt-get更新
须藤apt-get install libnotify-bin

如何使用替换功能

该补丁notify-send包括两个新的开关-p(或--print-id)和-r(或--replace-id)。将--help它们描述为:

  -p,--print-id打印通知ID。
  -r,-replace-id = REPLACE_ID要替换的通知的ID。
  • 使用-p,每个notify-send将返回ID N(数字/整数)。
  • 发出另一个notify-send-r N将取代之前的通知,立即
  • 例如,对于bash,可以使用以下命令保存ID notify-send -p ...

    NID=$(notify-send -p "MESSAGE-1")

    然后将其替换为:

    notify-send -r $NID "MESSAGE-2"
  • 只要在开头将-r变量初始化为0,就可以在脚本中递归使用-p-r

  • 这是一个简单的脚本,它以半秒为间隔显示从0到100的通知计数:

    #!/ bin / bash 
    NID = 0
    为{0..100..10}中的i    做       NID = $(通知发送-p -r $ NID $ i)       睡0.5    完成


1
您可以使用我的python脚本,其工作方式类似于notify-send:github.com/phuhl/notify-send.py
user3637541 18/11/22

11

您可以使用“同步”提示来创建“确认”通知,该通知将替换以前的确认通知。例如:

notify-send "Message" -h string:x-canonical-private-synchronous:anything

本文档中指定了“ x-canonical-private-synchronous”提示。要指定提示,请使用-h type:name:value。这里的类型是string,名称是x-canonical-private-synchronous,似乎值可以是您想要的任何值。

所以,如果你的第一个通知与提示创建第二的为好,第二个会立即更换第一。(请参阅文档中的“ 动画和持续时间 ”,在“确认气泡”列中。)


string:x-canonical-private-synchronous:anything正是我所需要的。感谢您的回答。也用于链接到文档
2015年

它不与GNOME工作....
约翰内斯Lemonde

1
显然这仅适用于ubuntu。
bschlueter

10

X-ref:
如何强制在notify-osd中显示一个新的通知而无需等待较早的通知退出?

没有补丁,你可以简单地做

#!/bin/bash

for i in {0..100..10}
    do
          killall notify-osd
          notify-send "testing" $i
          sleep 1
    done

书签:
如何使用“通知发送”立即替换现有通知?


发送错误notify-osd(2592):不允许操作。这意味着什么?

这可能意味着特权不足,要求:

sudo killall notify-osd

发送错误notify-osd(2592): Operation not permitted。这意味着什么?
VedVals

5

我创建了一个简单的python脚本,其功能几乎与notify-send相同,但是支持--replaces-id

notify-send.py

网址: https //github.com/phuhl/notify-send.py

用于从Shell发送桌面通知的python脚本。

关于

Libnotify是Linux世界中许多脚本的一部分。它利用了桌面通知规范的许多指定功能,并使外壳脚本可以访问它们。它但是允许替换与现有通知replaces-id。自2008年以来这是一个已知的错误,自2012年以来具有一个补丁。尽管如此,该补丁仍不在上游(2018)。

该python脚本利用notify2包并将功能公开给shell。

notify-send.py和notify-send之间的区别

  • notify-send.py -h 显示帮助中,而不是作为提示的参数。对于提示使用--hint
  • notify-send.py -r IDnotify-send.py --replaces-id ID 存在。为了用要替换的通知notify-send.py 返回的ID 替换通知呼叫。
  • notify-send.py 返回新创建的通知的ID。
  • notify-send.py --replaces-process NAME存在。使用相同名称创建的每个通知将用相同名称替换之前的每个通知。如果使用此参数调用notify-send.py可能会阻塞,最好以尾随调用&

安装

需要python3。

git clone https://github.com/phuhl/notify-send.py
cd notify-send.py
sudo pip install notify2
sudo python setup.py install

用法

$ notify-send.py -h
usage: notify-send.py [-h] [-u LEVEL] [-t TIME] [-a APP_NAME]
                  [-i ICON[,ICON...]] [-c TYPE[,TYPE...]]
                  [--hint TYPE:NAME:VALUE] [-r ID]
                  [--replaces-process NAME]
                  SUMMERY [BODY]

positional arguments:
      SUMMERY
      BODY

optional arguments:
      -h, --help        show this help message and exit
      -u LEVEL, --urgency LEVEL
                        Specifies the urgency level (low, normal, critical).
      -t TIME, --expire-time TIME
                        Specifies the timeout in milliseconds at which to
                        expire the notification.
      -a APP_NAME, --app-name APP_NAME
                        Specifies the app name for the icon
      -i ICON[,ICON...], --icon ICON[,ICON...]
                        Specifies an icon filename or stock icon to display.
      -c TYPE[,TYPE...], --category TYPE[,TYPE...]
                        Specifies the notification category.
      --hint TYPE:NAME:VALUE
                        Specifies basic extra data to pass. Valid typesare
                        int, double, string and byte.
      -r ID, --replaces-id ID
                        Specifies the id of the notification that should be
                        replaced.
     --replaces-process NAME
                        Specifies the name of a process that should take care
                        of replacing notifications for this process.

以root用户身份通知-发送[.py]

为了显示通知,即使libnotify或

notify-send.py

由root用户使用,这两个脚本很有用。

#!/bin/bash
username=<your username here>
if [ "$(id -u)" != "1000" ] ; then
    sudo -u $username DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send.sh "$@"
else
    notify-send.sh "$@"
fi

有了 notify-send.sh这样的:

#!/bin/bash
notify-send.py "$@" &

也可以看看

还请看一下我受Dunst启发的通知守护程序,但它进行了一些改进,包括透明背景的可能性和存储通知的通知中心。


此解决方案在ubuntu 18.10上对我有效。其他解决方案似乎都没有效果。
Dreamcat4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.