Может ли org.freedesktop.Notifications.CloseNotification(uint id) быть запущен и вызван через DBus?
Ссылка :
Кнопка закрытия на уведомлении-OSD?
Закладка:
Может ли org.freedesktop.Notifications.CloseNotification (uint id) быть запущен и вызван через DBus?
В настоящее время этот скрипт
dbus-monitor "interface='org.freedesktop.Notifications'" | \
grep --line-buffered "member=Notify" | \
sed -u -e 's/.*/killall notify-osd/g' | \
bash
убьет все ожидающие уведомления.
Было бы лучше отточить конкретное целевое OSD-уведомление для отмены, используя org.freedesktop.Notifications.CloseNotification(uint id)
, Есть ли интерфейсный метод, который может поместить это в (в?) DBus для запуска, когда происходит определенное событие уведомления?
Метод должен получить PID уведомления для использования в качестве аргумента для CloseNotification(uint id)
, С другой стороны,
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification(uint id)
может быть использован из оболочки, если (uint id)
аргумент может быть определен. Фактический синтаксис команды будет использовать целое число вместо (uint id)
,
Возможно, лучший вопрос, который следует задать вначале: "Как найти адрес DBus уведомления?".
Ни один из них не идентифицирует это правильно:
gdbus monitor --session --dest org.freedesktop.Notifications
возвращается
The name org.freedesktop.Notifications is owned by :1.130
...
или же
dbus-monitor "interface='org.freedesktop.Notifications'"
возвращается
... string ":1.340" ...
Оглядываясь назад, предыдущий вопрос "Как это (uint id)
для найденного уведомления? ", является ли это реальным, учитывая этот предыдущий ответ на другой вопрос:
/questions/184089/kak-uznat-kakoe-prilozhenie-svyazano-so-znachkom-indikatora/184094#184094
предоставляет подробности, чтобы можно было использовать любой из следующих методов:
gdbus call --session --dest org.freedesktop.DBus \
--object-path / \
--method org.freedesktop.DBus.GetConnectionUnixProcessID :1.16
возвращения:
(uint32 8957,)
или же
qdbus --literal --session org.freedesktop.DBus \
/ \
org.freedesktop.DBus.GetConnectionUnixProcessID :1.16
возвращения:
8957
После этого всплывающее окно уведомления-OSD будет побеждено:
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(qdbus --literal --session \
org.freedesktop.DBus \
/ \
org.freedesktop.DBus.GetConnectionUnixProcessID :?.??? )
"Хитрость" заключается в том, чтобы найти :?.???
DBus адрес.
3 ответа
Откуда ты знаешь что (UINT32 id)
есть или нет?
Учитывая заявление You ... need a way to get that ID ...
В этом ответе и следующих эмпирических наблюдениях, возможно, следует изменить название вопроса на "Как можно gdbus ... -m org.freedesktop.Notifications.CloseNotification ...
закрыть уведомление?
Подразумевается ли это или подразумевается, что утверждение "... оно только указывает, что идентификатор должен быть уникальным, отличным от нуля и меньшим, чем MAXINT ...", найденным в описании к 9.1.2. org.freedesktop.Notifications.Notify, также относится к CloseNotification
параметр (UINT32 id)
? UINT32
процесс исключения является единственным распространенным фактором в качестве типа атрибута в документации, и подразумевается, что должен быть какой-то общий идентификатор "дескриптор", но...
Детали возвращаемого значения Notify
и его параметр UINT32 replaces_id
довольно явно, но не ясно, что CloseNotification
"s (UINT32 id)
имеет какое-либо отношение к этому, как показано с помощью эмпирического тестирования ниже.
Цитирование 9.1.3. org.freedesktop.Notifications.CloseNotification in toto:
9.1.3. org.freedesktop.Notifications.CloseNotification
void org.freedesktop.Notifications.CloseNotification (UINT32 id);
Causes a notification to be forcefully closed and removed from the user's view.
It can be used, for example, in the event that what the notification pertains to
is no longer relevant, or to cancel a notification with no expiration time.
The NotificationClosed signal is emitted by this method.
If the notification no longer exists, an empty D-BUS Error message is sent back.
Это не характеризует и не объясняет значение (UINT32 id)
,
Вопиющим упущением является отсутствие таблицы для описания NotificationClosed (UINT32 id)
параметр. Все остальные параметры для методов и сигналов определяются с помощью таких таблиц.
Эмпирические тесты показывают, что уведомления не закрываются с помощью Notify
возвращаемое значение:
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 0 "" "sigma-ry" "corpus" [] {} 200 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
или же
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 5 "" "sigma-ry" "corpus" [] {} 20 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
Уведомление не закрывается, что было бы в случае, если (UINT32 id)
идентифицируется с возвращенным значением Notify
,
Еще несколько тестов:
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 0 "" "sigma-ry" "corpus" [] {} 0 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
и даже принудительно установить постоянный идентификатор, установив UINT32 replaces_id
до 42 и expire_timeout
до 0 видно, что CloseNotification
не имеет никакого влияния
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.CloseNotification \
$(gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 42 "" "sigma-ry" "corpus" [] {} 0 \
| sed -e 's/(uint32\(.*\),)/\1/g' )
Уведомление не закрывается, даже если 42
совершает круговое путешествие по методам, что подтверждается
dbus-monitor "interface='org.freedesktop.Notifications'"
в выходной
отправитель вызова метода =:1.332 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; интерфейс =org.freedesktop.Notifications; Член = Уведомить строка "" uint32 42 строка "" строка "сигма-ры" строка "корпус" массив [ ] массив [ ] int32 0 отправитель вызова метода =:1.333 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; интерфейс =org.freedesktop.Notifications; Член = CloseNotification uint32 42
Также обратите внимание на ошибку уведомления об истечении времени ожидания -1 (документация противоречива):
gdbus call --session \
-d org.freedesktop.Notifications \
-o /org/freedesktop/Notifications \
-m org.freedesktop.Notifications.Notify \
"" 42 "" "sigma-ry" "corpus" [] {} -1
хотя это "работает"
notify-send "test" -t -1
ссылка:
Как называется программа, которая отображает уведомления? (документ противоречий)
Как заставить новое Уведомление в notify-osd появляться, не дожидаясь выхода предыдущего?
Как я могу использовать "уведомить-отправить", чтобы немедленно заменить существующее уведомление?
Закладка:
Может ли org.freedesktop.Notifications.CloseNotification(uint id) быть запущен и вызван через DBus?
CloseNotification
Метод определен как метод D-Bus согласно спецификации. Тем не менее, он только утверждает, что идентификатор должен быть уникальным, отличным от нуля и меньшим, чем MAXINT. Это не требует, чтобы ID был PID вызывающего процесса. Вам понадобится способ получить этот идентификатор, прежде чем вы сможете успешно вызвать метод.
Я знаю, что немного опоздал, но я столкнулся с этой проблемой сегодня, и это может быть полезно для других!
Прежде всего, установите патч libnotify-bin
который поддерживает опцию -p
распечатать идентификатор уведомления:
sudo apt-add-repository ppa:izx/askubuntu
sudo apt-get update
sudo apt-get install libnotify-bin
Теперь пример сценария, который отправляет уведомление без тайм-аута, а затем закрывает уведомление после завершения определенной команды (в этом случае, просто спать 5 секунд):
notify-send 'Message...' -i dialog-information \
-t 0 -h int:transient:1 \
-p >/tmp/notification_id
sleep 5
qdbus org.freedesktop.Notifications \
/org/freedesktop/Notifications \
org.freedesktop.Notifications.CloseNotification \
$(cat /tmp/notification_id)