web-dev-qa-db-ja.com

dbus-monitor出力の読み方

dbus-monitor をいじって、Ubuntu環境でdbusがどのように機能しているかを理解しています。これに関していくつか質問があります。

  1. 以下を正しく読む方法を教えてください。大きなアイデアは理解していますが、詳細は理解していません。

    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とは何ですか?

  2. ボリュームコントロールと通知の関係について何かに気付きました。 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"のパブリックシグナルがあった場合、複数のアプリケーションがこのシグナルをリッスンできます(競合する可能性があります)通知アプリケーションが存在するようになります)、開発者は信号の送信にのみ関心を持つ必要がありますが、信号の取得と処理は通知アプリケーションのビジネス(またはそれらの信号を必要とする他のプログラム)です。

  3. 私はDbusを初めて使用しますが、主にいくつかのアプレットを開発するためにPythonでDbusを使用しているので、もっと学びたいと思っています。 dbus-python tutorial を見て、すべてのシグナルをリッスンする方法を教えています(インターフェイスやパスなどを指定しないで)。しかし、dbus-monitorのように、メソッドが呼び出されたときにメソッドを追跡する方法?

それがどのように機能するかを教える忍耐力があれば、大歓迎です。

20
Benjamin

また、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の例は多くないように思えるので、これが誰かの助けになることを願っています。

10
Keto