[balsa/gtk3] Call Gtk in idle callbacks instead of subthreads
- From: Peter Bloomfield <PeterB src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa/gtk3] Call Gtk in idle callbacks instead of subthreads
- Date: Fri, 8 Jun 2012 01:43:42 +0000 (UTC)
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]