From 0f35ef8d0e88b2f7223638d414580537cd91d206 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 16 Jul 2009 16:37:44 -0400 Subject: Prompt when exiting with unsent messages. --- mail/e-mail-local.h | 5 ++-- modules/mail/e-mail-shell-backend.c | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/mail/e-mail-local.h b/mail/e-mail-local.h index 1bd34e4273..b8dda29857 100644 --- a/mail/e-mail-local.h +++ b/mail/e-mail-local.h @@ -28,8 +28,9 @@ G_BEGIN_DECLS -/* XXX E_MAIL_FOLDER_TEMPLATES is a prime example of why - * templates should be a core feature, not a plugin. */ +/* XXX E_MAIL_FOLDER_TEMPLATES is a prime example of why templates + * should be a core feature: the mailer now has to know about + * this specific plugin, which defeats the purpose of plugins. */ typedef enum { E_MAIL_FOLDER_INBOX, E_MAIL_FOLDER_DRAFTS, diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c index 76aeb0daaa..43a272069a 100644 --- a/modules/mail/e-mail-shell-backend.c +++ b/modules/mail/e-mail-shell-backend.c @@ -43,6 +43,7 @@ #include "e-attachment-handler-mail.h" #include "e-mail-browser.h" +#include "e-mail-local.h" #include "e-mail-reader.h" #include "e-mail-store.h" #include "em-account-editor.h" @@ -471,6 +472,48 @@ mail_shell_backend_prepare_for_online_cb (EShell *shell, (GHFunc) mail_shell_store_prepare_for_online_cb, activity); } +static void +mail_shell_backend_quit_requested_cb (EShell *shell, + EShellBackend *shell_backend) +{ + CamelFolder *folder; + GList *watched_windows; + GtkWindow *parent = NULL; + guint32 unsent; + gint response; + + g_debug ("Quit requested for mail backend"); + + /* We can quit immediately if offline. */ + if (!camel_session_is_online (session)) + return; + + /* Check Outbox for any unsent messages. */ + + folder = e_mail_local_get_folder (E_MAIL_FOLDER_OUTBOX); + if (folder == NULL) + return; + + if (camel_object_get ( + folder, NULL, CAMEL_FOLDER_VISIBLE, &unsent, 0) != 0) + return; + + if (unsent == 0) + return; + + /* Try to find a parent window for the dialog. + * First list item is what's currently focused. */ + watched_windows = e_shell_get_watched_windows (shell); + if (watched_windows != NULL) + parent = GTK_WINDOW (watched_windows->data); + response = e_error_run (parent, "mail:exit-unsaved", NULL); + + if (response == GTK_RESPONSE_YES) + return; + + e_shell_cancel_quit (shell); +} + static void mail_shell_backend_send_receive_cb (EShell *shell, GtkWindow *parent, @@ -598,6 +641,11 @@ mail_shell_backend_constructed (GObject *object) G_CALLBACK (mail_shell_backend_prepare_for_online_cb), shell_backend); + g_signal_connect ( + shell, "quit-requested", + G_CALLBACK (mail_shell_backend_quit_requested_cb), + shell_backend); + g_signal_connect ( shell, "send-receive", G_CALLBACK (mail_shell_backend_send_receive_cb), -- cgit v1.2.3