aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-07-04 16:39:56 +0800
committerMilan Crha <mcrha@redhat.com>2014-07-04 16:39:56 +0800
commit610fcbd75a00514395bb69b0d4667111b92ec560 (patch)
tree26c6c21068f50b511e236c73ebea6341b04131fe
parent846063476f4bbcae99553600fe62028b09220828 (diff)
downloadgsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar.gz
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar.bz2
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar.lz
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar.xz
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.tar.zst
gsoc2013-evolution-610fcbd75a00514395bb69b0d4667111b92ec560.zip
Bug 732724 - mail-send-recv.c:report_error_to_ui() does UI calls in non-main thread
-rw-r--r--mail/mail-send-recv.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 2513ade139..87a1957552 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -431,28 +431,23 @@ format_service_name (CamelService *service)
return pretty_url;
}
-static void
-report_error_to_ui (CamelService *service,
- const gchar *folder_name,
- const GError *error)
+struct ReportErrorToUIData
{
- EShellView *shell_view = NULL;
- gchar *tmp = NULL;
- const gchar *display_name, *ident;
+ gchar *display_name;
+ gchar *error_ident;
+ GError *error;
+};
- g_return_if_fail (CAMEL_IS_SERVICE (service));
- g_return_if_fail (error != NULL);
+static gboolean
+report_error_to_ui_cb (gpointer user_data)
+{
+ struct ReportErrorToUIData *data = user_data;
+ EShellView *shell_view = NULL;
- if (folder_name) {
- tmp = g_strdup_printf ("%s: %s",
- camel_service_get_display_name (service),
- folder_name);
- display_name = tmp;
- ident = "mail:no-refresh-folder";
- } else {
- display_name = camel_service_get_display_name (service);
- ident = "mail:failed-connect";
- }
+ g_return_val_if_fail (data != NULL, FALSE);
+ g_return_val_if_fail (data->display_name != NULL, FALSE);
+ g_return_val_if_fail (data->error_ident != NULL, FALSE);
+ g_return_val_if_fail (data->error != NULL, FALSE);
if (send_recv_dialog) {
GtkWidget *parent;
@@ -487,16 +482,54 @@ report_error_to_ui (CamelService *service,
shell_content = e_shell_view_get_shell_content (shell_view);
alert_sink = E_ALERT_SINK (shell_content);
- alert = e_alert_new (ident, display_name, error->message, NULL);
+ alert = e_alert_new (data->error_ident, data->display_name, data->error->message, NULL);
e_alert_sink_submit_alert (alert_sink, alert);
g_object_unref (alert);
} else {
/* This may not happen, but just in case... */
- g_warning ("%s: %s '%s': %s\n", G_STRFUNC, ident, display_name, error->message);
+ g_warning ("%s: %s '%s': %s\n", G_STRFUNC, data->error_ident, data->display_name, data->error->message);
+ }
+
+ g_free (data->display_name);
+ g_free (data->error_ident);
+ g_error_free (data->error);
+ g_free (data);
+
+ return FALSE;
+}
+
+static void
+report_error_to_ui (CamelService *service,
+ const gchar *folder_name,
+ const GError *error)
+{
+ gchar *tmp = NULL;
+ const gchar *display_name, *ident;
+ struct ReportErrorToUIData *data;
+
+ g_return_if_fail (CAMEL_IS_SERVICE (service));
+ g_return_if_fail (error != NULL);
+
+ if (folder_name) {
+ tmp = g_strdup_printf ("%s: %s",
+ camel_service_get_display_name (service),
+ folder_name);
+ display_name = tmp;
+ ident = "mail:no-refresh-folder";
+ } else {
+ display_name = camel_service_get_display_name (service);
+ ident = "mail:failed-connect";
}
+ data = g_new0 (struct ReportErrorToUIData, 1);
+ data->display_name = g_strdup (display_name);
+ data->error_ident = g_strdup (ident);
+ data->error = g_error_copy (error);
+
+ g_idle_add_full (G_PRIORITY_DEFAULT, report_error_to_ui_cb, data, NULL);
+
g_free (tmp);
}