Python-libnotify, показывающий странное поведение с xfce4-notifyd и notify-osd
Я пытаюсь поиграть с libnotify python bindings
, Я получил этот код от /usr/share/doc/python-notify/examples
и это показывает другое поведение с xfce4-notifyd
а также notify-osd
,
Дело-1 с xfce4-notifyd
Дело-2 с уведомлением-OSD
Вы можете увидеть разницу в обоих случаях. В 1-м случае action
интегрирован в виде button
в xfce4-notifyd
тогда как во 2-м случае этого не происходит. Во втором случае это просто проявляется как new window
,
Итак, может кто-нибудь сказать мне, почему я наблюдаю это странное поведение и как мне добавить кнопки действий к notify-osd
уведомления.
PS: я использую patched
версия notify-osd. Мои уведомления по умолчанию с notify-osd выглядят так
1 ответ
Notify-osd не обрабатывает действия. Это явное дизайнерское решение разработчиков. Как говорится в спецификации проекта, "кроме этого эффекта зависания, пузырьки не должны напрямую реагировать на устройства ввода". Он также утверждает, что когда запрашиваются действия, он возвращается к окну предупреждения:
В случаях, когда приложения ожидали, что система уведомлений разрешит интерактивность, не проверяя, действительно ли она это делает, и в тех случаях, когда приложения ожидали, что система уведомлений будет отображать уведомление в течение неопределенного времени, OSD Notify должно показывать окно оповещения как запасной вариант.
В то время как спорным является вопрос о том, является ли это хорошим решением, 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()