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);