aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-mt.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2010-10-17 21:40:36 +0800
committerMatthew Barnes <mbarnes@redhat.com>2010-10-19 00:32:37 +0800
commit35e55a8d6e3455efa92abd669680d191e3e4cbac (patch)
tree303d479aaaf12538d73f611f52db1157da64549b /mail/mail-mt.c
parentb674a37a381d0328a7273bafa62d80203c8cdf70 (diff)
downloadgsoc2013-evolution-35e55a8d6e3455efa92abd669680d191e3e4cbac.tar.gz
gsoc2013-evolution-35e55a8d6e3455efa92abd669680d191e3e4cbac.tar.zst
gsoc2013-evolution-35e55a8d6e3455efa92abd669680d191e3e4cbac.zip
Send errors to an EAlertSink instead of the task bar.
This marks the end of unintrusive error dialogs, which were too unintrusive. We now show errors directly in the main window using the EAlert / EAlertSink framework.
Diffstat (limited to 'mail/mail-mt.c')
-rw-r--r--mail/mail-mt.c92
1 files changed, 27 insertions, 65 deletions
diff --git a/mail/mail-mt.c b/mail/mail-mt.c
index 9cac82841d..907d57938a 100644
--- a/mail/mail-mt.c
+++ b/mail/mail-mt.c
@@ -27,9 +27,7 @@
#include <libedataserver/e-flag.h>
-#include "shell/e-shell.h"
-#include "e-util/e-alert-activity.h"
-#include "e-util/e-alert-dialog.h"
+#include <shell/e-shell-view.h>
#include "mail-mt.h"
@@ -43,8 +41,6 @@ const gchar *shell_builtin_backend = "mail";
/* background operation status stuff */
struct _MailMsgPrivate {
EActivity *activity;
- GtkWidget *error;
- gboolean cancelable;
};
static guint mail_msg_seq; /* sequence number of each message */
@@ -91,7 +87,6 @@ mail_msg_new (MailMsgInfo *info)
msg->priv = g_slice_new0 (MailMsgPrivate);
msg->priv->activity = e_activity_new ();
- msg->priv->cancelable = TRUE;
e_activity_set_percent (msg->priv->activity, 0.0);
@@ -161,16 +156,6 @@ mail_msg_free (MailMsg *mail_msg)
if (mail_msg->error != NULL)
g_error_free (mail_msg->error);
- if (mail_msg->priv->error != NULL) {
- EActivity *activity;
- GtkWidget *widget;
-
- widget = mail_msg->priv->error;
- activity = e_alert_activity_new_warning (widget);
- e_shell_backend_add_activity (shell_backend, activity);
- g_object_unref (activity);
- }
-
g_slice_free (MailMsgPrivate, mail_msg->priv);
g_slice_free1 (mail_msg->info->size, mail_msg);
@@ -224,28 +209,16 @@ mail_msg_unref (gpointer msg)
g_idle_add ((GSourceFunc) mail_msg_free, mail_msg);
}
-/* hash table of ops->dialogue of active errors */
-static GHashTable *active_errors = NULL;
-
-static void
-error_finalized (gpointer data, GObject *gone_gd)
-{
- g_hash_table_remove (active_errors, data);
-}
-
-static void
-error_response (GtkWidget *dialog, gint button, gpointer data)
-{
- gtk_widget_destroy (dialog);
-}
-
void
mail_msg_check_error (gpointer msg)
{
- GtkWindow *parent;
+ EShell *shell;
+ EShellView *shell_view;
+ EShellWindow *shell_window = NULL;
+ EShellContent *shell_content;
MailMsg *m = msg;
gchar *what;
- GtkDialog *gd;
+ GList *list, *iter;
#ifdef MALLOC_CHECK
checkmem (m);
@@ -258,40 +231,37 @@ mail_msg_check_error (gpointer msg)
|| g_error_matches (m->error, CAMEL_FOLDER_ERROR, CAMEL_FOLDER_ERROR_INVALID_UID))
return;
- if (active_errors == NULL)
- active_errors = g_hash_table_new (NULL, NULL);
+ shell = e_shell_get_default ();
- /* check to see if we have dialogue already running for this operation */
- /* we key on the operation pointer, which is at least accurate enough
- for the operation type, although it could be on a different object. */
- if (g_hash_table_lookup (active_errors, m->info)) {
- g_message (
- "Error occurred while existing dialogue active:\n%s",
- m->error->message);
- return;
+ /* Find the most recently used EShellWindow. */
+ list = e_shell_get_watched_windows (shell);
+ for (iter = list; iter != NULL; iter = g_list_next (iter)) {
+ if (E_IS_SHELL_WINDOW (iter->data)) {
+ shell_window = E_SHELL_WINDOW (iter->data);
+ break;
+ }
}
- parent = e_shell_get_active_window (NULL);
+ /* If we can't find an EShellWindow then... well, screw it. */
+ if (shell_window == NULL)
+ return;
+
+ shell_view = e_shell_window_get_shell_view (
+ shell_window, shell_builtin_backend);
+ shell_content = e_shell_view_get_shell_content (shell_view);
if (m->info->desc
&& (what = m->info->desc (m))) {
- gd = (GtkDialog *) e_alert_dialog_new_for_args (
- parent, "mail:async-error", what,
+ e_alert_submit (
+ GTK_WIDGET (shell_content),
+ "mail:async-error", what,
m->error->message, NULL);
g_free (what);
} else
- gd = (GtkDialog *) e_alert_dialog_new_for_args (
- parent, "mail:async-error-nodescribe",
+ e_alert_submit (
+ GTK_WIDGET (shell_content),
+ "mail:async-error-nodescribe",
m->error->message, NULL);
-
- g_hash_table_insert (active_errors, m->info, gd);
- g_signal_connect(gd, "response", G_CALLBACK(error_response), m->info);
- g_object_weak_ref (G_OBJECT (gd), error_finalized, m->info);
- if (m->priv->cancelable)
- m->priv->error = (GtkWidget *) gd;
- else
- gtk_widget_show ((GtkWidget *)gd);
-
}
void
@@ -379,14 +349,6 @@ mail_cancel_all (void)
g_mutex_unlock (mail_msg_lock);
}
-void
-mail_msg_set_cancelable (gpointer msg, gboolean status)
-{
- MailMsg *mail_msg = msg;
-
- mail_msg->priv->cancelable = status;
-}
-
static guint idle_source_id = 0;
G_LOCK_DEFINE_STATIC (idle_source_id);
static GAsyncQueue *main_loop_queue = NULL;