"알림 전송" 스택 방지

"알림 전송" 스택 방지

볼륨 높이기 버튼을 눌렀을 때 "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)

관련 정보