「通知送信」スタックの防止

「通知送信」スタックの防止

音量を上げるボタンを押したときに「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を印刷するため、将来のメッセージでそれを使用する必要があります。したがって、デフォルトでは、シェルスクリプトはプログラムの出力を覚えて毎回再利用できます。

答え2

まあ通知 - 送信の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)

関連情報