Blob Blame History Raw
diff -up evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c.formatter-in-main evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c
--- evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c.formatter-in-main	2013-07-23 14:51:35.000000000 +0200
+++ evolution-3.8.5/em-format/e-mail-formatter-attachment-bar.c	2014-07-23 17:41:40.399807290 +0200
@@ -89,11 +89,11 @@ emfe_attachment_bar_get_widget (EMailFor
 	g_return_val_if_fail (E_MAIL_PART_IS (part, EMailPartAttachmentBar), NULL);
 
 	empab = (EMailPartAttachmentBar *) part;
-	widget = e_attachment_bar_new (empab->store);
-	g_object_set_data (G_OBJECT (empab->store), "attachment-bar", widget);
+	widget = e_attachment_bar_new (e_mail_part_attachment_bar_get_store (empab));
+	g_object_set_data (G_OBJECT (e_mail_part_attachment_bar_get_store (empab)), "attachment-bar", widget);
 	g_object_weak_ref (
 		G_OBJECT (widget),
-		(GWeakNotify) unset_bar_from_store_data, empab->store);
+		(GWeakNotify) unset_bar_from_store_data, e_mail_part_attachment_bar_get_store (empab));
 
 	return widget;
 }
diff -up evolution-3.8.5/em-format/e-mail-formatter-attachment.c.formatter-in-main evolution-3.8.5/em-format/e-mail-formatter-attachment.c
--- evolution-3.8.5/em-format/e-mail-formatter-attachment.c.formatter-in-main	2013-07-23 14:51:36.000000000 +0200
+++ evolution-3.8.5/em-format/e-mail-formatter-attachment.c	2014-07-23 17:41:40.399807290 +0200
@@ -94,7 +94,7 @@ find_attachment_store (EMailPartList *pa
 	g_free (tmp);
 
 	if (part != NULL)
-		store = ((EMailPartAttachmentBar *) part)->store;
+		store = e_mail_part_attachment_bar_get_store ((EMailPartAttachmentBar *) part);
 
 	while (!g_queue_is_empty (&queue))
 		e_mail_part_unref (g_queue_pop_head (&queue));
diff -up evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c.formatter-in-main evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c
--- evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c.formatter-in-main	2013-07-23 14:51:35.000000000 +0200
+++ evolution-3.8.5/em-format/e-mail-parser-attachment-bar.c	2014-07-23 17:41:40.399807290 +0200
@@ -28,12 +28,40 @@
 
 #include "e-mail-parser-extension.h"
 
+struct _EMailPartAttachmentBarPrivate
+{
+	EAttachmentStore *store;
+};
+
 static void
 mail_part_attachment_bar_free (EMailPart *part)
 {
 	EMailPartAttachmentBar *empab = (EMailPartAttachmentBar *) part;
 
-	g_clear_object (&empab->store);
+	if (empab->priv) {
+		g_clear_object (&empab->priv->store);
+		g_free (empab->priv);
+		empab->priv = NULL;
+	}
+}
+
+EAttachmentStore *
+e_mail_part_attachment_bar_get_store (EMailPartAttachmentBar *empab)
+{
+	g_return_val_if_fail (empab != NULL, NULL);
+	g_return_val_if_fail (empab->priv != NULL, NULL);
+
+	if (!empab->priv->store) {
+		/* Create the store only on demand. The EMailParser runs in a dedicated
+		   thread, but the EAttachmentStore is a GtkWidget descendant, which should
+		   be manipulated only from the main/UI thread, thus postpone its creating
+		   until it's really needed, which might be during the EMailFormatter run,
+		   which runs from the main/UI thread. */
+
+		empab->priv->store = E_ATTACHMENT_STORE (e_attachment_store_new ());
+	}
+
+	return empab->priv->store;
 }
 
 /******************************************************************************/
@@ -70,7 +98,7 @@ empe_attachment_bar_parse (EMailParserEx
 		part, part_id->str, sizeof (EMailPartAttachmentBar),
 		(GFreeFunc) mail_part_attachment_bar_free);
 	empab->parent.mime_type = g_strdup ("application/vnd.evolution.widget.attachment-bar");
-	empab->store = E_ATTACHMENT_STORE (e_attachment_store_new ());
+	empab->priv = g_new0 (EMailPartAttachmentBarPrivate, 1);
 	g_string_truncate (part_id, len);
 
 	g_queue_push_tail (out_mail_parts, empab);
diff -up evolution-3.8.5/em-format/e-mail-part-attachment-bar.h.formatter-in-main evolution-3.8.5/em-format/e-mail-part-attachment-bar.h
--- evolution-3.8.5/em-format/e-mail-part-attachment-bar.h.formatter-in-main	2013-07-23 14:51:36.000000000 +0200
+++ evolution-3.8.5/em-format/e-mail-part-attachment-bar.h	2014-07-23 17:41:40.399807290 +0200
@@ -23,10 +23,14 @@
 
 #include <em-format/e-mail-part.h>
 
+typedef struct _EMailPartAttachmentBarPrivate EMailPartAttachmentBarPrivate;
+
 typedef struct _EMailPartAttachmentBar {
 	EMailPart parent;
 
-	EAttachmentStore *store;
+	EMailPartAttachmentBarPrivate *priv;
 } EMailPartAttachmentBar;
 
+EAttachmentStore *e_mail_part_attachment_bar_get_store (EMailPartAttachmentBar *empab);
+
 #endif /* E_MAIL_PART_ATTACHMENT_BAR_H */
diff -up evolution-3.8.5/mail/e-mail-request.c.formatter-in-main evolution-3.8.5/mail/e-mail-request.c
--- evolution-3.8.5/mail/e-mail-request.c.formatter-in-main	2013-07-23 14:51:56.000000000 +0200
+++ evolution-3.8.5/mail/e-mail-request.c	2014-07-23 17:41:40.400807290 +0200
@@ -364,9 +364,12 @@ mail_request_send_async (SoupRequest *re
 			simple, handle_contact_photo_request,
 			G_PRIORITY_DEFAULT, cancellable);
 	} else {
-		g_simple_async_result_run_in_thread (
-			simple, handle_mail_request,
-			G_PRIORITY_DEFAULT, cancellable);
+		/* Process e-mail mail requests in this thread, which should be
+		   the main/UI thread, because any EMailFormatter can create
+		   GtkWidget-s, or manipulate with them, which should be always
+		   done in the main/UI thread. */
+		handle_mail_request (simple, G_OBJECT (request), cancellable);
+		g_simple_async_result_complete_in_idle (simple);
 	}
 
 	g_object_unref (simple);