Where to start

Tony Houghton h at realh.co.uk
Tue Mar 29 14:09:35 PST 2005


In <1112023847.7387.26.camel at localhost.localdomain>, Havoc Pennington wrote:

> On Mon, 2005-03-28 at 13:36 +0100, Tony Houghton wrote:
> > Are signals associated with a name, or do they go out on the
> > system/session bus? One thing that concerns me about doing it that way
> > is that it smacks a little of polluting a global namespace compared with
> > neatly routed method calls, but if you say it's OK... ;-).
> 
> They _have_ a name which is namespaced, but they aren't addressed to
> anyone special. The recipient has to "subscribe" to the signal name with
> AddMatch. Anyone can subscribe though.

I've had a stab at it (just targetting 0.22 for now), but it isn't
working for me, so I'd be very grateful if you could check my
pseudo-code summary and tell me what I've done wrong. Both halves of my
program start off with:

    optsdbus_g_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
    optsdbus_connection = dbus_g_connection_get_connection
                (optsdbus_g_connection);

Then the capplet does this:

    dbus_bus_acquire_service (optsdbus_connection, OPTSDBUS_NAME,
                0, &derror);

and each time it sends a signal:

    message = dbus_message_new_signal (OPTSDBUS_OBJECT_PATH,
            OPTSDBUS_INTERFACE, OPTSDBUS_SIGNAL_NAME);
    dbus_message_append_args (message, ...);
    dbus_connection_send (optsdbus_connection, message, &serial);

The main application, which is supposed to receive the signals, does
this:

    match_rule = g_strdup_printf
            ("type='signal',sender='%s',path='%s',interface='%s'",
             OPTSDBUS_NAME, OPTSDBUS_OBJECT_PATH, OPTSDBUS_INTERFACE);
    dbus_bus_add_match (optsdbus_connection, match_rule, &derror);
    proxy = dbus_g_proxy_new_for_service (optsdbus_g_connection,
            OPTSDBUS_NAME, OPTSDBUS_OBJECT_PATH, OPTSDBUS_INTERFACE);
    g_signal_connect (proxy, "received",
            G_CALLBACK (optsdbus_signal_handler), NULL);

The problem is that on sending a signal message the dbus connection gets
destroyed and the main application doesn't get the signal (at least it
doesn't get as far as the glib/GObject signal handler).

-- 
TH * http://www.realh.co.uk


More information about the dbus mailing list