清除/修改以前的 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

gdbus在 CLI 中,您可以通过/显示和关闭通知弹出窗口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,通过 、 等发送的通知notify-sendpynotify持续libnotify5 秒,无论time选项如何(这是 Gnome 3 中的默认行为,不要问我为什么)。而且,它们不会叠加:Gnome 一次仅显示一个通知。所以我无法测试多个弹出窗口,但它应该可以工作。

答案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模块来保存引用 - 它也不起作用。您无法存储对这些的引用。

所以我唯一能想到的就是将你的脚本分成两部分:守护进程和客户端。运行后,客户端应参考通知实例与一直在后台运行的守护进程进行通信。

相关内容