Gnome Shell JS - прослушивает сигнал DBus на интерфейсе для любого пути

Я пытаюсь написать расширение, которое прослушивает сигнал DBus, но я не знаю пути заранее. На самом деле, существует несколько путей (уникальных для каждого приложения, которое реализует интерфейс). Кажется, нет никакого способа определить путь заранее (т. Е. При запуске приложения), поэтому я остаюсь с прослушиванием сигнала, который излучается при отправке определенной команды DBus. Что я действительно ищу, так это GJS-эквивалент Python-решения этого вопроса. К сожалению, различные прокси DBus не позволяют null или же undefined в качестве значений для пути, как это делает библиотека Python. Я также пытался использовать imports.dbus.session.watch_signal который получает все излучаемые сигналы, но не дает мне способа привязать отправителя к определенному сигналу.

2 ответа

Я не знаком с GJS (определенно стоит посмотреть), однако, если есть интерфейс командной строки GJS, то dbus-monitor может отслеживать D-Bus по любому атрибуту сообщения.

квотирование 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:

   Possible keys you can match on are type, sender, interface, member,
   path, destination and numbered keys to match message args
   (keys are 'arg0', 'arg1', etc.). Omitting a key from the rule indicates
   a wildcard match. For instance omitting the member from a match rule but
   adding a sender would let all messages from that sender through regardless
   of the member.

Обратите внимание, что отправитель указывается в выходных данных следующего

Проблема слишком большого выхода из

         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 на д-автобус "that implements the interface",

Закладка:
Gnome Shell JS - прослушивает сигнал DBus на интерфейсе для любого пути

Старый вопрос, но он помог мне найти: Gio.DBusSignalCallback

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