dbus-monitor をいじって、Ubuntu環境でdbusがどのように機能しているかを理解しています。これに関していくつか質問があります。
以下を正しく読む方法を教えてください。大きなアイデアは理解していますが、詳細は理解していません。
signal sender=:1.1948 -> dest=(null destination) serial=1829990 path=/org/ayatana/menu/DA00003; interface=org.ayatana.dbusmenu; member=ItemPropertyUpdated
int32 23
string "enabled"
variant boolean true
method call sender=:1.6 -> dest=org.freedesktop.Notifications serial=1399 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications;
member=GetCapabilities
最初のものはシグナルであり、2番目のものはメソッドであることがわかります。 destinationは、信号の特定の受信機/スロットが存在できることを意味しますか? memberとは何ですか?また、シグナルに続くリストの項目は、シグナルで渡される引数ですか? senderおよびserialsとは何ですか?
ボリュームコントロールと通知の関係について何かに気付きました。 dbus-monitor出力から読み取ったものから
method call sender=:1.6 -> dest=org.freedesktop.Notifications serial=1400 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
string "gnome-settings-daemon"
uint32 0
string "notification-audio-volume-medium"
string " "
string ""
array [
]
array [
dict entry(
string "value"
variant int32 38
)
dict entry(
string "x-canonical-private-synchronous"
variant string "volume"
)
]
int32 -1
通知はそのメソッドによってトリガーされるようです。私はそれがなぜこのように機能するのか本当に理解していません。私の見解では、通知がこの信号をリッスンしている間に、発信された信号 "notification-audio-volume-medium"があればより理にかなっています。それに応じて反応します。送信/受信がプライベートではなくパブリックである場合、柔軟性と効率が向上しませんか?たとえば、 "notification-audio-volume-medium"のパブリックシグナルがあった場合、複数のアプリケーションがこのシグナルをリッスンできます(競合する可能性があります)通知アプリケーションが存在するようになります)、開発者は信号の送信にのみ関心を持つ必要がありますが、信号の取得と処理は通知アプリケーションのビジネス(またはそれらの信号を必要とする他のプログラム)です。
私はDbusを初めて使用しますが、主にいくつかのアプレットを開発するためにPythonでDbusを使用しているので、もっと学びたいと思っています。 dbus-python tutorial を見て、すべてのシグナルをリッスンする方法を教えています(インターフェイスやパスなどを指定しないで)。しかし、dbus-monitorのように、メソッドが呼び出されたときにメソッドを追跡する方法?
それがどのように機能するかを教える忍耐力があれば、大歓迎です。
また、pythonスクリプトを使用して、dbusからデスクトップ通知を収集するソリューションも探していました。この質問は私がグーグルで得た最も近いものでしたが、notify-osdの代わりを書くのはやり過ぎのように見えました:)
recent-notifications アプレットのソースを見ると、dbusメッセージを監視する方法のヒントが得られました。ここに、私が思いついたpython実装があります。
import gtk
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def filter_cb(bus, message):
# the NameAcquired message comes through before match string gets applied
if message.get_member() != "Notify":
return
args = message.get_args_list()
# args are
# (app_name, notification_id, icon, summary, body, actions, hints, timeout)
print("Notification from app '%s'" % args[0])
print("Summary: %s" % args[3])
print("Body: %s", args[4])
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string(
"type='method_call',interface='org.freedesktop.Notifications',member='Notify'")
bus.add_message_filter(filter_cb)
gtk.main()
Dbusメッセージの監視に関連する簡単なpythonの例は多くないように思えるので、これが誰かの助けになることを願っています。