我正在尝试使用 libnotify python bindings
。我得到了此代码来自/usr/share/doc/python-notify/examples
并且它表现出与xfce4-notifyd
和不同的行为notify-osd
。
使用 xfce4-notifyd 的案例 1
使用notify-osd的案例2
您可以看到两种情况下的区别。在第一种情况下,action
以 的形式集成button
,xfce4-notifyd
而在第二种情况下,情况并非如此。在第二种情况下,它只是显示为new window
。
那么,谁能告诉我为什么我会观察到这种奇怪的行为以及如何向notify-osd
通知添加操作按钮。
PS:我使用的是patched
notify-osd版本。我的默认通知是这样的
答案1
Notify-osd 不处理操作。这是开发人员的明确设计决定。设计规范指出, “除了悬停效果之外,气泡不应该以任何方式直接响应输入设备。”它还断言当请求操作时,它将返回到警告框:
对于应用程序期望通知系统允许交互但不检查其是否确实允许交互的情况,以及应用程序期望通知系统无限期地显示通知的情况,Notify OSD 应该显示一个警告框作为后备。
虽然这是否是一个好的决定还有待商榷,但 Notify-osd 是Freedesktop 通知规范,明确指出确保服务器支持所需的功能是客户端的责任:
客户端应尽量避免对通知服务器的呈现和能力做出假设。消息内容才是最重要的。
客户端可以使用 GetCapabilities 消息向服务器检查支持哪些功能。
您可以使用以下方法测试通知服务器功能:
import pynotify
pynotify.init("Test Capabilities")
caps = pynotify.get_server_caps()
if caps and 'actions' in caps:
# We support actions, so add a button.
notification = pynotify.Notification("Can we use actions?", \
"Yup, we sure do.")
notification.add_action("ignore", "Ignore", ignore_cb)
else:
notification = pynotify.Notification("Can we use actions?", \
"Nope, we don't support actions.")
notification.show()