]> git.0d.be Git - empathy.git/commitdiff
Add empathy_run_until_read[_full] functions
authorXavier Claessens <xclaesse@src.gnome.org>
Fri, 11 Apr 2008 13:10:32 +0000 (13:10 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Fri, 11 Apr 2008 13:10:32 +0000 (13:10 +0000)
svn path=/trunk/; revision=892

libempathy/empathy-utils.c
libempathy/empathy-utils.h

index 07cd6802ebeb3855b231ba11a722e578709ba444..3b6b1bbd2f406c61910c53fb83bbb05e8ca997e9 100644 (file)
@@ -605,4 +605,80 @@ empathy_file_lookup (const gchar *filename, const gchar *subdir)
        return path;
 }
 
+typedef struct {
+       EmpathyRunUntilReadyFunc  func;
+       gpointer                  user_data;
+       GObject                  *object;
+       GMainLoop                *loop;
+} RunUntilReadyData;
+
+static void
+run_until_ready_cb (RunUntilReadyData *data)
+{
+       if (!data->func || data->func (data->object, data->user_data)) {
+               empathy_debug (DEBUG_DOMAIN, "Object %p is ready", data->object);
+               g_main_loop_quit (data->loop);
+       }
+}
+
+static gboolean
+object_is_ready (GObject *object,
+                gpointer user_data)
+{
+       gboolean ready;
+
+       g_object_get (object, "ready", &ready, NULL);
+
+       return ready;
+}
+
+void
+empathy_run_until_ready_full (gpointer                  object,
+                             const gchar              *signal,
+                             EmpathyRunUntilReadyFunc  func,
+                             gpointer                  user_data,
+                             GMainLoop               **loop)
+{
+       RunUntilReadyData  data;
+       gulong             signal_id;
+
+       g_return_if_fail (G_IS_OBJECT (object));
+       g_return_if_fail (signal != NULL);
+
+       if (func && func (object, user_data)) {
+               return;
+       }
+
+       empathy_debug (DEBUG_DOMAIN, "Starting run until ready for object %p",
+                      object);
+
+       data.func = func;
+       data.user_data = user_data;
+       data.object = object;
+       data.loop = g_main_loop_new (NULL, FALSE);
+
+       signal_id = g_signal_connect_swapped (object, signal,
+                                             G_CALLBACK (run_until_ready_cb),
+                                             &data);
+       if (loop != NULL) {
+               *loop = data.loop;
+       }
+
+       g_main_loop_run (data.loop);
+
+       if (loop != NULL) {
+               *loop = NULL;
+       }
+
+       g_signal_handler_disconnect (object, signal_id);
+       g_main_loop_unref (data.loop);
+}
+
+void
+empathy_run_until_ready (gpointer object)
+{
+       empathy_run_until_ready_full (object, "notify::ready", object_is_ready,
+                                     NULL, NULL);
+}
+
 
index 834935ef216928c2814aaa846c410dfda536b234..b8da4a0638da6861c2605155d76de9624bc25e48 100644 (file)
@@ -99,6 +99,16 @@ const gchar * empathy_presence_to_str               (McPresence       presence);
 McPresence    empathy_presence_from_str             (const gchar     *str);
 gchar *       empathy_file_lookup                   (const gchar     *filename,
                                                     const gchar     *subdir);
+
+typedef gboolean (*EmpathyRunUntilReadyFunc)        (GObject         *object,
+                                                    gpointer         user_data);
+void          empathy_run_until_ready               (gpointer         object);
+void          empathy_run_until_ready_full          (gpointer         object,
+                                                    const gchar     *signal,
+                                                    EmpathyRunUntilReadyFunc  func,
+                                                    gpointer         user_data,
+                                                    GMainLoop      **loop);
+
 G_END_DECLS
 
 #endif /*  __EMPATHY_UTILS_H__ */