diff options
author | Colin Walters <walters@verbum.org> | 2005-06-21 01:18:25 +0000 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2005-06-21 01:18:25 +0000 |
commit | 21a73df1b5a7e2ace06a1e252ab019392692d21b (patch) | |
tree | 961cb03c39c22b9339379fb44ebb4a4b97fca3a4 /glib/examples/example-signal-recipient.c | |
parent | 778579ec214548f4e0daeb7aff7894948bdbf990 (diff) |
2005-06-20 Colin Walters <walters@verbum.org>
* configure.in: Add glib/examples.
* glib/Makefile.am: Add examples/
* glib/examples/.cvsignore
* glib/examples/Makefile.am
* glib/examples/example-client.c
* glib/examples/example-service.c
* glib/examples/example-service.xml
* glib/examples/example-signal-emitter.c
* glib/examples/example-signal-emitter.xml
* glib/examples/example-signal-recipient.c:
New files; GLib binding examples, ported from
python/examples.
Diffstat (limited to 'glib/examples/example-signal-recipient.c')
-rw-r--r-- | glib/examples/example-signal-recipient.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/glib/examples/example-signal-recipient.c b/glib/examples/example-signal-recipient.c new file mode 100644 index 00000000..30fa1502 --- /dev/null +++ b/glib/examples/example-signal-recipient.c @@ -0,0 +1,103 @@ +#include <dbus/dbus-glib.h> +#include <stdio.h> +#include <stdlib.h> + +static void lose (const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2); +static void lose_gerror (const char *prefix, GError *error) G_GNUC_NORETURN; + +static void +lose (const char *str, ...) +{ + va_list args; + + va_start (args, str); + + vfprintf (stderr, str, args); + fputc ('\n', stderr); + + va_end (args); + + exit (1); +} + +static void +lose_gerror (const char *prefix, GError *error) +{ + lose ("%s: %s", prefix, error->message); +} + +static gboolean +emit_signal (gpointer arg) +{ + DBusGProxy *proxy = arg; + + dbus_g_proxy_call_no_reply (proxy, "emitHelloSignal", G_TYPE_INVALID); + return TRUE; +} + +static void +hello_signal_handler (DBusGProxy *proxy, const char *hello_string, gpointer user_data) +{ + printf ("Received signal and it says: %s\n", hello_string); +} + +int +main (int argc, char **argv) +{ + DBusGConnection *bus; + DBusGProxy *remote_object; + GError *error = NULL; + GMainLoop *mainloop; + + g_type_init (); + + mainloop = g_main_loop_new (NULL, FALSE); + + bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + if (!bus) + lose_gerror ("Couldn't connect to session bus", error); + + /* We use _for_name_owner in order to track this particular service + * instance, which lets us receive signals. + */ + remote_object = dbus_g_proxy_new_for_name_owner (bus, + "org.designfu.TestService", + "/org/designfu/TestService/object", + "org.designfu.TestService", + &error); + if (!remote_object) + lose_gerror ("Failed to get name owner", error); + + /* IMPORTANT: + * + * Note because this signal's signature is VOID__STRING, we do not + * need to register a marshaller, since there is a builtin one. + * However for other signatures, you must generate a marshaller, + * then call dbus_g_object_register_marshaller. It would look like + * this: + * + * dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_INVALID); + * + */ + + /* Tell DBus what the type signature of the signal callback is; this + * allows us to sanity-check incoming messages before invoking the + * callback. You need to do this once for each proxy you create, + * not every time you want to connect to the signal. + */ + dbus_g_proxy_add_signal (remote_object, "HelloSignal", G_TYPE_STRING, G_TYPE_INVALID); + + /* Actually connect to the signal. Note you can call + * dbus_g_proxy_connect_signal multiple times for one invocation of + * dbus_g_proxy_add_signal. + */ + dbus_g_proxy_connect_signal (remote_object, "HelloSignal", G_CALLBACK (hello_signal_handler), + NULL, NULL); + + + g_timeout_add (2000, emit_signal, remote_object); + + g_main_loop_run (mainloop); + + exit (0); +} |