[evolution] Change em_format_redraw() to em_format_queue_redraw().



commit 699e36491b564069bce8c36a79d4803b5d9492d1
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Aug 10 18:08:55 2010 -0400

    Change em_format_redraw() to em_format_queue_redraw().
    
    This changes the behavior of the function: instead of redrawing
    immediately it schedules the redraw from an idle callback.  This
    allows us to make multiple changes to EMFormat before redrawing.

 em-format/em-format.c      |   46 +++++++++++++++++++++++++++++++++++++------
 em-format/em-format.h      |    3 +-
 mail/e-mail-browser.c      |    2 +-
 mail/e-mail-display.c      |    4 +-
 mail/e-mail-paned-view.c   |    2 +-
 mail/e-mail-reader-utils.c |    2 +-
 mail/e-mail-reader.c       |    4 +-
 mail/em-format-html.c      |    4 +-
 mail/em-utils.c            |    2 +-
 9 files changed, 50 insertions(+), 19 deletions(-)
---
diff --git a/em-format/em-format.c b/em-format/em-format.c
index 5892bd7..8b3d069 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -36,8 +36,16 @@
 #include "shell/e-shell.h"
 #include "shell/e-shell-settings.h"
 
+#define EM_FORMAT_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), EM_TYPE_FORMAT, EMFormatPrivate))
+
 #define d(x)
 
+struct _EMFormatPrivate {
+	guint redraw_idle_id;
+};
+
 /* Used to cache various data/info for redraws
    The validity stuff could be cached at a higher level but this is easier
    This absolutely relies on the partid being _globally unique_
@@ -106,6 +114,9 @@ emf_finalize (GObject *object)
 {
 	EMFormat *emf = EM_FORMAT (object);
 
+	if (emf->priv->redraw_idle_id > 0)
+		g_source_remove (emf->priv->redraw_idle_id);
+
 	if (emf->session)
 		g_object_unref (emf->session);
 
@@ -142,6 +153,12 @@ emf_format_clone (EMFormat *emf,
                   CamelMimeMessage *msg,
                   EMFormat *emfsource)
 {
+	/* Cancel any pending redraws. */
+	if (emf->priv->redraw_idle_id > 0) {
+		g_source_remove (emf->priv->redraw_idle_id);
+		emf->priv->redraw_idle_id = 0;
+	}
+
 	em_format_clear_puri_tree(emf);
 
 	if (emf != emfsource) {
@@ -276,6 +293,7 @@ emf_class_init (EMFormatClass *class)
 	GObjectClass *object_class;
 
 	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EMFormatPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = emf_finalize;
@@ -305,6 +323,8 @@ emf_init (EMFormat *emf)
 	EShell *shell;
 	EShellSettings *shell_settings;
 
+	emf->priv = EM_FORMAT_GET_PRIVATE (emf);
+
 	emf->inline_table = g_hash_table_new_full (
 		g_str_hash, g_str_equal,
 		(GDestroyNotify) NULL,
@@ -884,13 +904,25 @@ em_format_format (EMFormat *emf,
 	em_format_format_clone (emf, folder, uid, message, NULL);
 }
 
-void
-em_format_redraw (EMFormat *emf)
+static gboolean
+format_redraw_idle_cb (EMFormat *emf)
 {
-	g_return_if_fail (EM_IS_FORMAT (emf));
+	emf->priv->redraw_idle_id = 0;
 
 	em_format_format_clone (
 		emf, emf->folder, emf->uid, emf->message, emf);
+
+	return FALSE;
+}
+
+void
+em_format_queue_redraw (EMFormat *emf)
+{
+	g_return_if_fail (EM_IS_FORMAT (emf));
+
+	if (emf->priv->redraw_idle_id == 0)
+		emf->priv->redraw_idle_id = g_idle_add (
+			(GSourceFunc) format_redraw_idle_cb, emf);
 }
 
 /**
@@ -914,7 +946,7 @@ em_format_set_mode (EMFormat *emf,
 
 	/* force redraw if type changed afterwards */
 	if (emf->message != NULL)
-		em_format_redraw (emf);
+		em_format_queue_redraw (emf);
 }
 
 /**
@@ -938,7 +970,7 @@ em_format_set_charset (EMFormat *emf,
 	emf->charset = g_strdup(charset);
 
 	if (emf->message)
-		em_format_redraw(emf);
+		em_format_queue_redraw(emf);
 }
 
 /**
@@ -963,7 +995,7 @@ em_format_set_default_charset (EMFormat *emf,
 	emf->default_charset = g_strdup(charset);
 
 	if (emf->message && emf->charset == NULL)
-		em_format_redraw(emf);
+		em_format_queue_redraw (emf);
 }
 
 /**
@@ -1143,7 +1175,7 @@ em_format_set_inline (EMFormat *emf,
 	emfc->state = state?INLINE_ON:INLINE_OFF;
 
 	if (emf->message)
-		em_format_redraw(emf);
+		em_format_queue_redraw (emf);
 }
 
 void
diff --git a/em-format/em-format.h b/em-format/em-format.h
index ec805e7..ebe9e84 100644
--- a/em-format/em-format.h
+++ b/em-format/em-format.h
@@ -186,7 +186,6 @@ struct _EMFormatHeader {
  **/
 struct _EMFormat {
 	GObject parent;
-
 	EMFormatPrivate *priv;
 
 	CamelMimeMessage *message; /* the current message */
@@ -359,7 +358,7 @@ void		em_format_format		(EMFormat *emf,
 						 CamelFolder *folder,
 						 const gchar *uid,
 						 CamelMimeMessage *message);
-void		em_format_redraw		(EMFormat *emf);
+void		em_format_queue_redraw		(EMFormat *emf);
 void		em_format_format_attachment	(EMFormat *emf,
 						 CamelStream *stream,
 						 CamelMimePart *mime_part,
diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
index 86cc929..9d4fdf9 100644
--- a/mail/e-mail-browser.c
+++ b/mail/e-mail-browser.c
@@ -618,7 +618,7 @@ mail_browser_constructed (GObject *object)
 
 	g_signal_connect_swapped (
 		search_bar, "changed",
-		G_CALLBACK (em_format_redraw), priv->formatter);
+		G_CALLBACK (em_format_queue_redraw), priv->formatter);
 
 	/* Bind GObject properties to GConf keys. */
 
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index fda1f3a..58f4824 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -204,7 +204,7 @@ mail_display_style_set (GtkWidget *widget,
 	GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
 
 	mail_display_update_formatter_colors (E_MAIL_DISPLAY (widget));
-	em_format_redraw (EM_FORMAT (priv->formatter));
+	em_format_queue_redraw (EM_FORMAT (priv->formatter));
 }
 
 static void
@@ -264,7 +264,7 @@ mail_display_link_clicked (GtkHTML *html,
 		}
 
 		priv->formatter->header_wrap_flags = flags;
-		em_format_redraw (EM_FORMAT (priv->formatter));
+		em_format_queue_redraw (EM_FORMAT (priv->formatter));
 
 	} else if (*uri == '#')
 		gtk_html_jump_to_anchor (html, uri + 1);
diff --git a/mail/e-mail-paned-view.c b/mail/e-mail-paned-view.c
index 106e761..2195f87 100644
--- a/mail/e-mail-paned-view.c
+++ b/mail/e-mail-paned-view.c
@@ -592,7 +592,7 @@ mail_paned_view_constructed (GObject *object)
 
 	g_signal_connect_swapped (
 		search_bar, "changed",
-		G_CALLBACK (em_format_redraw), priv->formatter);
+		G_CALLBACK (em_format_queue_redraw), priv->formatter);
 
 	/* Load the view instance. */
 
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 7d8be34..bdef954 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -720,7 +720,7 @@ headers_changed_cb (GConfClient *client,
 
 	/* force a redraw */
 	if (EM_FORMAT (formatter)->message)
-		em_format_redraw (EM_FORMAT (formatter));
+		em_format_queue_redraw (EM_FORMAT (formatter));
 }
 
 static void
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 3675b52..63cbba1 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -377,7 +377,7 @@ action_mail_flag_clear_cb (GtkAction *action,
 
 	em_utils_flag_for_followup_clear (window, folder, uids);
 
-	em_format_redraw (EM_FORMAT (formatter));
+	em_format_queue_redraw (EM_FORMAT (formatter));
 }
 
 static void
@@ -396,7 +396,7 @@ action_mail_flag_completed_cb (GtkAction *action,
 
 	em_utils_flag_for_followup_completed (window, folder, uids);
 
-	em_format_redraw (EM_FORMAT (formatter));
+	em_format_queue_redraw (EM_FORMAT (formatter));
 }
 
 static void
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 5818ad2..d8f4869 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -980,7 +980,7 @@ efh_init (EMFormatHTML *efh,
 
 	g_signal_connect_swapped (
 		efh, "notify::mark-citations",
-		G_CALLBACK (em_format_redraw), NULL);
+		G_CALLBACK (em_format_queue_redraw), NULL);
 
 	e_extensible_load_extensions (E_EXTENSIBLE (efh));
 }
@@ -1040,7 +1040,7 @@ em_format_html_load_images (EMFormatHTML *efh)
 	/* This will remain set while we're still
 	 * rendering the same message, then it wont be. */
 	efh->priv->load_images_now = TRUE;
-	em_format_redraw (EM_FORMAT (efh));
+	em_format_queue_redraw (EM_FORMAT (efh));
 }
 
 void
diff --git a/mail/em-utils.c b/mail/em-utils.c
index 2bc0143..fe7c248 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -455,7 +455,7 @@ em_utils_flag_for_followup (EMailReader *reader,
 	camel_tag_list_free (&tags);
 
 	formatter = e_mail_reader_get_formatter (reader);
-	em_format_redraw (EM_FORMAT (formatter));
+	em_format_queue_redraw (EM_FORMAT (formatter));
 
 exit:
 	/* XXX We shouldn't be freeing this. */



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