[evolution/kill-bonobo] Prompt when exiting with unsent messages.



commit 0f35ef8d0e88b2f7223638d414580537cd91d206
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Jul 16 16:37:44 2009 -0400

    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 1bd34e4..b8dda29 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 76aeb0d..43a2720 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"
@@ -472,6 +473,48 @@ mail_shell_backend_prepare_for_online_cb (EShell *shell,
 }
 
 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,
                                    EShellBackend *shell_backend)
@@ -599,6 +642,11 @@ mail_shell_backend_constructed (GObject *object)
 		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),
 		shell_backend);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]