Я пытаюсь написать расширение, которое прослушивает сигнал DBus, но заранее не знаю пути. На самом деле, существует несколько путей (уникальных для каждого приложения, которое реализует интерфейс). Кажется, нет никакого способа определить путь заранее (т. Е. При запуске приложения), поэтому я остаюсь с прослушиванием сигнала, который излучается при отправке определенной команды DBus. Что я действительно ищу, так это GJS-эквивалент решения Python для этого вопроса. К сожалению, различные прокси-серверы DBus не допускают null
или undefined
в качестве значений для пути, как это делает библиотека Python. Я также попытался использовать imports.dbus.session.watch_signal
, который получает все излучаемые сигналы, но не дает мне способа привязать отправителя к определенному сигналу.
Старый вопрос, но он помог мне найти: Gio.DBusSignalCallback
Я незнаком с GJS (определенно стоит посмотреть), однако, если есть интерфейс командной строки GJS, тогда dbus-monitor
может отслеживать d-шину по любому атрибуту сообщения.
Цитируя man dbus-monitor
:
EXAMPLE
Here is an example of using dbus-monitor to watch for the gnome typing
monitor to say things
dbus-monitor "type='signal', \
sender='org.gnome.TypingMonitor', \
interface='org.gnome.TypingMonitor'"
и
In order to get dbus-monitor to see the messages you are interested in,
you should specify a set of watch expressions as you would expect to be
passed to the dbus_bus_add_match function.
и цитируя D-Bus: API шины сообщений: функция dbus_bus_add_match :
[ 112]Обратите внимание, что отправитель идентифицирован в выходных данных следующих
Проблема слишком большого количества выходных данных из
dbus-monitor "type='signal'"
, таких как
...
signal sender=:1.47 -> dest=(null destination) serial=1679 path=/org/ayatana/bamf/application311805604; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.ayatana.bamf.view"
array [
dict entry(
string "Active"
variant boolean true
)
]
array [
]
...
signal sender=:1.51 -> dest=com.canonical.Unity.Panel.Service serial=1674 path=/com/canonical/Unity/Panel/Service; interface=com.canonical.Unity.Panel.Service; member=ReSync
string "libappmenu.so"
...
signal sender=:1.51 -> dest=com.canonical.Unity.Panel.Service serial=1681 path=/com/canonical/Unity/Panel/Service; interface=com.canonical.Unity.Panel.Service; member=ReSync
string "libdatetime.so"
...
могут быть удалены или с помощью комбинаций:
dbus-monitor --profile "type='signal'"
dbus-monitor "type='signal'" | grep '...some pattern...'
dbus-monitor "type='signal', interface='...'"
или другого ключа вместо интерфейса и т. Д.
Последний вариант может быть наиболее применим для поиска signal
на шине d "that implements the interface"
.
Закладка:
Gnome Shell JS - прослушивание сигнала DBus на интерфейсе для любого пути