[balsa/gtk3] Set up progress bar in an idle callback



commit e4a8c35255943f7fd315969a26c3f27aacc44abc
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Wed Feb 20 21:48:50 2013 -0500

    Set up progress bar in an idle callback
    
        * src/main-window.c: set up progress bar in an idle callback.

 ChangeLog         |    4 ++++
 src/main-window.c |   30 ++++++++++++++++++++++++++----
 2 files changed, 30 insertions(+), 4 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 83451e1..5c5d615 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2013-02-20  Peter Bloomfield
 
+       * src/main-window.c: set up progress bar in an idle callback.
+
+2013-02-20  Peter Bloomfield
+
        * src/main-window.c: change button sensitivity in an idle
        callback.
 
diff --git a/src/main-window.c b/src/main-window.c
index 91a06b6..554ccd9 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -5427,10 +5427,29 @@ balsa_window_decrease_activity(BalsaWindow * window, const gchar * message)
  * from 0 to 1.  If the bar is already in activity mode, the function
  * returns false; if the initialization is successful it returns true.
  **/
+
+typedef struct {
+    GtkProgressBar *progress_bar;
+    gchar          *text;
+} BalsaWindowSetupProgressInfo;
+
+static gboolean
+bw_setup_progress_idle_cb(BalsaWindowSetupProgressInfo * info)
+{
+    gtk_progress_bar_set_text(info->progress_bar, info->text);
+    gtk_progress_bar_set_fraction(info->progress_bar, 0);
+
+    g_object_unref(info->progress_bar);
+    g_free(info->text);
+    g_free(info);
+
+    return FALSE;
+}
+
 gboolean
 balsa_window_setup_progress(BalsaWindow * window, const gchar * text)
 {
-    GtkProgressBar *progress_bar;
+    BalsaWindowSetupProgressInfo *info;
 
     if (text) {
         /* make sure the progress bar is currently unused */
@@ -5440,9 +5459,12 @@ balsa_window_setup_progress(BalsaWindow * window, const gchar * text)
     } else
         window->progress_type = BALSA_PROGRESS_NONE;
 
-    progress_bar = GTK_PROGRESS_BAR(window->progress_bar);
-    gtk_progress_bar_set_text(progress_bar, text);
-    gtk_progress_bar_set_fraction(progress_bar, 0);
+    /* Update the display in an idle callback, in case we were called in
+     * a sub-thread.*/
+    info = g_new(BalsaWindowSetupProgressInfo, 1);
+    info->progress_bar = g_object_ref(window->progress_bar);
+    info->text = g_strdup(text);
+    g_idle_add((GSourceFunc) bw_setup_progress_idle_cb, info);
 
     return TRUE;
 }


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