[balsa/gtk3] Call Gtk in idle callbacks instead of subthreads



commit 69563b2e03c313b9cbcf49d1d3f316f20addb1db
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Jun 7 21:42:53 2012 -0400

    Call Gtk in idle callbacks instead of subthreads
    
    	* src/main.c (progress_set_text), (progress_set_text_idle_cb),
    	(balsa_progress_set_text), (progress_set_fraction),
    	(progress_set_fraction_idle_cb), (balsa_progress_set_fraction):
    	call Gtk in idle callbacks instead of subthreads.

 ChangeLog  |    7 +++++
 src/main.c |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 83 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index b481e9d..0b16b3a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2012-06-07  Peter Bloomfield
 
+	* src/main.c (progress_set_text), (progress_set_text_idle_cb),
+	(balsa_progress_set_text), (progress_set_fraction),
+	(progress_set_fraction_idle_cb), (balsa_progress_set_fraction):
+	call Gtk in idle callbacks instead of subthreads.
+
+2012-06-07  Peter Bloomfield
+
 	* libbalsa/mailbox.c (lbm_msgno_inserted),
 	(lbm_msgno_inserted_idle_cb), (libbalsa_mailbox_msgno_inserted):
 	block subthread and use an idle callback to insert message in
diff --git a/src/main.c b/src/main.c
index 7c4676f..cf773a4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -486,8 +486,8 @@ periodic_expunge_cb(void)
 static GTimeVal prev_time_val;
 static gdouble  min_fraction;
 static void
-balsa_progress_set_text(LibBalsaProgress * progress, const gchar * text,
-                        guint total)
+progress_set_text(LibBalsaProgress * progress, const gchar * text,
+                  guint total)
 {
     gboolean rc = FALSE;
 
@@ -508,12 +508,53 @@ balsa_progress_set_text(LibBalsaProgress * progress, const gchar * text,
         LIBBALSA_PROGRESS_YES : LIBBALSA_PROGRESS_NO;
 }
 
+#ifdef BALSA_USE_THREADS
+typedef struct {
+    LibBalsaProgress *progress;
+    const gchar *text;
+    guint total;
+    gdouble fraction;
+} BalsaProgressSetTextInfo;
+
+static gboolean
+progress_set_text_idle_cb(BalsaProgressSetTextInfo * info)
+{
+    progress_set_text(info->progress, info->text, info->total);
+
+    g_free(info);
+
+    return FALSE;
+}
+#endif                          /* BALSA_USE_THREADS */
+
+static void
+balsa_progress_set_text(LibBalsaProgress * progress, const gchar * text,
+                        guint total)
+{
+#ifdef BALSA_USE_THREADS
+    if (libbalsa_am_i_subthread()) {
+        BalsaProgressSetTextInfo *info;
+
+        info = g_new(BalsaProgressSetTextInfo, 1);
+        info->progress = progress;
+        info->text = text;
+        info->total = total;
+
+        gdk_threads_add_idle((GSourceFunc) progress_set_text_idle_cb,
+                             info);
+    } else
+        progress_set_text(progress, text, total);
+#else                           /* BALSA_USE_THREADS */
+    progress_set_text(progress, text, total);
+#endif                          /* BALSA_USE_THREADS */
+}
+
 /*
  * Set the fraction in the progress bar.
  */
 
 static void
-balsa_progress_set_fraction(LibBalsaProgress * progress, gdouble fraction)
+progress_set_fraction(LibBalsaProgress * progress, gdouble fraction)
 {
     GTimeVal time_val;
     guint elapsed;
@@ -541,6 +582,38 @@ balsa_progress_set_fraction(LibBalsaProgress * progress, gdouble fraction)
     gdk_threads_leave();
 }
 
+#ifdef BALSA_USE_THREADS
+static gboolean
+progress_set_fraction_idle_cb(BalsaProgressSetTextInfo * info)
+{
+    progress_set_fraction(info->progress, info->fraction);
+
+    g_free(info);
+
+    return FALSE;
+}
+#endif                          /* BALSA_USE_THREADS */
+
+static void
+balsa_progress_set_fraction(LibBalsaProgress * progress, gdouble fraction)
+{
+#ifdef BALSA_USE_THREADS
+    if (libbalsa_am_i_subthread()) {
+        BalsaProgressSetTextInfo *info;
+
+        info = g_new(BalsaProgressSetTextInfo, 1);
+        info->progress = progress;
+        info->fraction = fraction;
+
+        gdk_threads_add_idle((GSourceFunc) progress_set_fraction_idle_cb,
+                             info);
+    } else
+        progress_set_fraction(progress, fraction);
+#else                           /* BALSA_USE_THREADS */
+    progress_set_fraction(progress, fraction);
+#endif                          /* BALSA_USE_THREADS */
+}
+
 static void
 balsa_progress_set_activity(gboolean set, const gchar * text)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]