summaryrefslogtreecommitdiffstats
path: root/glib/examples/example-signal-recipient.c
diff options
context:
space:
mode:
Diffstat (limited to 'glib/examples/example-signal-recipient.c')
-rw-r--r--glib/examples/example-signal-recipient.c103
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);
+}