Add g_source_set_dummy_callback()
authorDan Winship <danw@gnome.org>
Sun, 7 Nov 2010 16:49:40 +0000 (11:49 -0500)
committerDan Winship <danw@gnome.org>
Fri, 26 Nov 2010 20:07:28 +0000 (15:07 -0500)
Use g_source_set_closure() and g_close_set_meta_marshal() to allow
setting a do-nothing callback on any source.

https://bugzilla.gnome.org/show_bug.cgi?id=634239

docs/reference/gobject/gobject-sections.txt
gobject/gobject.symbols
gobject/gsourceclosure.c
gobject/gsourceclosure.h

index 07ef1de..9828255 100644 (file)
@@ -828,6 +828,7 @@ g_closure_set_marshal
 g_closure_add_marshal_guards
 g_closure_set_meta_marshal
 g_source_set_closure
+g_source_set_dummy_callback
 G_TYPE_IO_CHANNEL
 G_TYPE_IO_CONDITION
 
index 9be4f2e..dd4b62d 100644 (file)
@@ -128,6 +128,7 @@ g_value_get_flags
 g_io_channel_get_type
 g_io_condition_get_type
 g_source_set_closure
+g_source_set_dummy_callback
 #endif
 #endif
 
index 0da5027..e3e6b8d 100644 (file)
@@ -168,7 +168,7 @@ g_source_set_closure (GSource  *source,
       source->source_funcs != &g_timeout_funcs &&
       source->source_funcs != &g_idle_funcs)
     {
-      g_critical (G_STRLOC "closure can not be set on closure without GSourceFuncs::closure_callback\n");
+      g_critical (G_STRLOC "closure can not be set on closure without GSourceFuncs::closure_callback\n");
       return;
     }
 
@@ -191,3 +191,40 @@ g_source_set_closure (GSource  *source,
        g_closure_set_marshal (closure, marshal);
     }
 }
+
+static void
+dummy_closure_marshal (GClosure     *closure,
+                      GValue       *return_value,
+                      guint         n_param_values,
+                      const GValue *param_values,
+                      gpointer      invocation_hint,
+                      gpointer      marshal_data)
+{
+  if (G_VALUE_HOLDS_BOOLEAN (return_value))
+    g_value_set_boolean (return_value, TRUE);
+}
+
+/**
+ * g_source_set_dummy_callback:
+ * @source: the source
+ *
+ * Sets a dummy callback for @source. The callback will do nothing, and
+ * if the source expects a #gboolean return value, it will return %TRUE.
+ * (If the source expects any other type of return value, it will return
+ * a 0/%NULL value; whatever g_value_init() initializes a #GValue to for
+ * that type.)
+ *
+ * If the source is not one of the standard GLib types, the
+ * @closure_callback and @closure_marshal fields of the #GSourceFuncs
+ * structure must have been filled in with pointers to appropriate
+ * functions.
+ */
+void
+g_source_set_dummy_callback (GSource *source)
+{
+  GClosure *closure;
+
+  closure = g_closure_new_simple (sizeof (GClosure), NULL);
+  g_closure_set_meta_marshal (closure, NULL, dummy_closure_marshal);
+  g_source_set_closure (source, closure);
+}
index e7f5594..edae2c8 100644 (file)
 
 G_BEGIN_DECLS
 
-void g_source_set_closure (GSource  *source,
-                          GClosure *closure);
+void g_source_set_closure        (GSource  *source,
+                                 GClosure *closure);
+
+void g_source_set_dummy_callback (GSource  *source);
 
 GType g_io_channel_get_type   (void);
 GType g_io_condition_get_type (void);