Может org.freedesktop. Уведомления. CloseNotification (uint идентификатор) быть инициированным и вызванным через DBus?

касательно:
Близкая кнопка на уведомляет-osd?

Закладка:
Может org.freedesktop. Уведомления. CloseNotification (uint идентификатор) быть инициированным и вызванным через 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) для найденного уведомления? "rhe torical, учитывая этот предыдущий ответ на другой вопрос:
https://askubuntu.com/a/186311/89468
предоставляет подробную информацию, таким образом, любой метод ниже может использоваться:

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
задан 13 April 2017 в 15:23

3 ответа

Я знаю, что я - бит поздно, но я столкнулся с этой проблемой сам сегодня, и это может быть полезно для других!

В первую очередь, установите исправленный 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)
0
ответ дан 13 April 2017 в 15:23

Метод CloseNotification определяется как метод D-Bus согласно спецификации . Тем не менее, он только утверждает, что идентификатор должен быть уникальным, отличным от нуля и меньшим, чем MAXINT. Это не требует, чтобы ID был PID вызывающего процесса. Вам понадобится способ получить этот идентификатор, прежде чем вы сможете успешно вызвать метод.

0
ответ дан 13 April 2017 в 15:23

Как Вы знаете что (UINT32 id) или не?

Учитывая оператор You ... need a way to get that ID ... в этом ответе и следующих эмпирических наблюдениях, возможно, заголовок вопроса должен быть изменен на, "Как может gdbus ... -m org.freedesktop.Notifications.CloseNotification ... закрыть уведомление?"

Это косвенно или процесс устранения, что оператор "... это только указывает, что идентификатор должен быть уникальным, ненулевым, и меньше, чем MAXINT...", нашел в описании 9.1.2. org.freedesktop. Уведомления. Уведомьте, также относится CloseNotification параметр (UINT32 id)? UINT32 путем исключения единственный общий множитель как тип атрибута в документации и существует импликация, что должен быть своего рода общий идентификатор "дескриптор", но...

Детали возвращенного значения Notify и его параметр UINT32 replaces_id являются довольно явными, но это не ясно это CloseNotification (UINT32 id) имеет какое-либо отношение к этому, как продемонстрировано с эмпирическим тестированием ниже.

Заключение в кавычки 9.1.3. org.freedesktop. Уведомления. CloseNotification в целом:

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'"

в выводе

method call sender=:1.332 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
   string ""
   uint32 42
   string ""
   string "sigma-ry"
   string "corpus"
   array [
   ]
   array [
   ]
   int32 0
method call sender=:1.333 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=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

касательно:
Каково название программы, которая отображает уведомления? (противоречия документа)
Как вызвать новое Уведомление в, уведомляют-osd для разоблачения, не ожидая более раннего для выхода?
Как я использую, 'уведомляют - отправляют' для непосредственной замены существующего уведомления?

Закладка:
Может org.freedesktop. Уведомления. CloseNotification (uint идентификатор) быть инициированным и вызванным через DBus?

1
ответ дан 13 April 2017 в 15:23

Другие вопросы по тегам:

Похожие вопросы: