防止“通知发送”堆叠

防止“通知发送”堆叠

我编写了这个脚本,当按下增加音量按钮时,将显示带有“notify-send”的桌面通知。

当按钮被按下时:
notify-send "Current volume 'pamixer --get-volume'"

问题是通知堆积如山在此输入图像描述

有没有办法防止通知堆叠并只显示最新的通知?

答案1

通知 API 有一种方法可以指定应更新的当前通知的 id,而不是创建新的弹出窗口,但notify-send没有提供此方法。如果您愿意使用少量Python,则可以在创建通知时检索通知的ID,然后尝试稍后更新该ID。将以下 python2 代码放入 PATH 目录中的文件中,说mynotify-send并执行chmod +x mynotify-send

#!/usr/bin/python
import argparse, gi
#gi.require_version('Notify', '0.7')
from gi.repository import Notify

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('-m', '--message', default="body")
    parser.add_argument('-i', '--id', type=int)
    return parser.parse_args()

def run(myid,message):
    Notify.init("mynote")
    obj = Notify.Notification.new("my summary", message)
    obj.set_timeout(60*1000)
    if myid:
        obj.set_property('id', myid)
        obj.show()
        newid = obj.get_property('id')
        print newid
    else:
        obj.show()
        myid = obj.get_property('id')
        print myid

def main():
    options = parse_args()
    run(options.id, options.message)

main()

python-gobject也必须安装。当你跑步时

mynotify-send -m 'message 1'

它应该弹出通知,但也会在标准输出上打印一个 id。通常这只是通知数量的一小部分,例如6。然后,您可以通过添加此 id 来更改现有弹出窗口中的消息:

mynotify-send --id 6 -m 'message 2'

只要弹出窗口存在,您就可以执行此操作。弹出窗口消失后,下一条消息将获得一个新的 id,例如7,程序会打印该 ID,您必须在以后的消息中使用它。因此基本上在 shell 脚本中,您只需记住程序的输出并每次重复使用它。

答案2

提到了notify-send的id机制,并给出了一个引用描述的脚本,该脚本打印出上次的id以及下次需要将id包含在命令行选项中的情况。我编辑了脚本,以便它记住 id。

通知 API 有一种方法可以指定应更新的当前通知的 id,而不是创建新的弹出窗口,但notify-send没有提供此方法。如果您愿意使用少量Python,则可以在创建通知时检索通知的ID,然后尝试稍后更新该ID。

#!/usr/bin/python3
# sudo pip3 install fcache

import argparse, gi
gi.require_version('Notify', '0.7')
from gi.repository import Notify

from fcache.cache import FileCache

APPNAME = 'notify-send-nostack'
SLOT = 'id'

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('header')
    parser.add_argument('body')
    return parser.parse_args()

def run(header, body):
    Notify.init(APPNAME)
    obj = Notify.Notification.new(header, body)
    obj.set_timeout(5) # seems has no effect to me
                       # number chosen at random

    mycache = FileCache(APPNAME)
    if SLOT in mycache:
        obj.set_property('id', mycache[SLOT])
    obj.show()
    newid = obj.get_property('id')
    mycache[SLOT] = newid
    mycache.close()

if __name__ == '__main__':
    options = parse_args()
    run(options.header, options.body)

相关内容