이전 libnotify 알림을 지우거나 수정하시겠습니까?

이전 libnotify 알림을 지우거나 수정하시겠습니까?

다음과 같은 알림을 생성하는 스크립트를 작성했습니다.

notify-send -i audio-card "Transferring audio playback to speakers." \
    "Audio playback has been transferred to the analog output speaker system."

명령줄이나 Python에서 이러한 알림을 지우거나 바꿀 수 있는 방법이 있습니까? 기본적으로 두 개의 PulseAudio 수신기 사이를 전환하는 스크립트가 있으며 사용자가 빠르게 전환하는 경우 이전 알림을 지워 업데이트된 텍스트로 바꾸고 싶습니다.

답변1

gdbusCLI에서는 / 를 통해 알림 팝업을 표시하고 닫을 수 있습니다 qdbus.
수행 방법은 다음과 같습니다 gdbus.

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20

그러면 다음과 같이 출력됩니다.

(uint32 72,)

72알림입니다 ID. 이제 알았으니 다음을 ID사용하여 팝업을 닫을 수 있습니다.

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification 72 

이제 ID나중에 필요할 경우 호출 시 파일에 작성하면 됩니다 Notify.

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20  | sed 's/[^ ]* //; s/,.//' > /tmp/last_id

팝업을 닫고 싶을 때 여기에서 가져오세요.

gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $(cat /tmp/last_id)

PS 저는 Gnome 3를 사용하고 있으며 등을 통해 전송된 알림은 옵션 에 관계없이 5초 notify-send동안만 pynotify지속됩니다 (이것은 Gnome 3의 기본 동작입니다. 이유는 묻지 마세요). 또한 스택되지 않습니다. Gnome은 한 번에 하나의 알림만 표시합니다. 따라서 여러 팝업을 테스트할 수는 없지만 작동할 것입니다.libnotifytime

답변2

update메소드를 사용 하고 show메소드를 다시 호출하십시오.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pynotify
import time

pynotify.init("Basic")

n = pynotify.Notification("Title1", "body1", "dialog-warning")
n.show()

time.sleep(1)

n.update("Title2", "body2", "dialog-warning")
n.show()

고쳐 쓰다:

방법이 있지만 close... 전혀 작동하지 않습니다. 분명히 나에게만 해당되는 것은 아닙니다.

바인딩 오류로 인해 발생한 것일 수 있다고 생각하여 다음 C++ 프로그램을 만들었습니다.

#include <libnotify/notify.h>
#include <unistd.h>

int main(int argc, char **argv) {

    GError *error = NULL;
    notify_init("basic");

    NotifyNotification *example;
    example = notify_notification_new("Ttile1", "Body1", NULL);

    notify_notification_show(example, &error);
    usleep(1000000);

    notify_notification_update(example, "Ttile2", "Body2", NULL);
    notify_notification_show(example, &error);

    usleep(1000000);
    notify_notification_close(example, &error);
}

그리고 컴파일하세요:

g++ test.cpp -o test $(pkg-config --libs --cflags libnotify)

하지만 효과는 좋지 않습니다. 여기에 뭔가 문제가 있는 것 같습니다.

다음으로 참조를 저장하기 위해 모듈을 사용해 보았지만 pickle역시 작동하지 않았습니다. 이에 대한 참조는 저장할 수 없습니다.

그래서 제가 생각할 수 있는 유일한 것은 스크립트를 데몬과 클라이언트라는 두 부분으로 나누는 것입니다. 일단 실행되면 클라이언트는 알림 인스턴스를 참조하여 백그라운드에서 실행 중인 데몬과 통신해야 합니다.

관련 정보