Может ли 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)
Другие вопросы по тегам