evolution r35346 - in trunk: composer mail



Author: mbarnes
Date: Wed Apr  9 03:00:45 2008
New Revision: 35346
URL: http://svn.gnome.org/viewvc/evolution?rev=35346&view=rev

Log:
2008-04-08  Matthew Barnes  <mbarnes redhat com>

	** Fixes bug #523413

	* composer/e-msg-composer.c (msg_composer_dispose):
	Use the 'application_exiting' private flag to determine whether
	to tell e_composer_autosave_unregister() to delete the autosave
	file.

	* composer/e-msg-composer.c (msg_composer_class_init),
	(e_msg_composer_save_draft):
	Remove the 'quit' parameter from the 'save-draft' signal.

	* composer/e-msg-composer.c (e_msg_composer_request_close_all):
	Take an autosave snapshot before activating the CLOSE action,
	and set the private 'application_exiting' flag.  This should
	avoid prompting the user before shutting down.

	* composer/e-composer-actions.c (action_close_cb):
	When electing to save a message before closing, hide the window
	immediately.  The callback function can then check the window's
	visibility after the save is complete to know whether to destroy
	the window.

	* composer/e-composer-autosave.c (e_composer_autosave_unregister):
	Add a 'delete_file' boolean parameter to determine whether to
	delete the autosave file.

	* composer/e-composer-private.h:
	Add an 'application_exiting' flag.

	* mail/em-composer-utils.c (save_draft_done):
	Check the composer window's visibility to determine whether to
	destroy the window.  See the corresponding composer/ChangeLog
	entry to get the full story.

	* mail/em-composer-utils.c (em_utils_composer_save_draft_cb):
	Remove the 'quit' parameter.



Modified:
   trunk/composer/ChangeLog
   trunk/composer/e-composer-actions.c
   trunk/composer/e-composer-autosave.c
   trunk/composer/e-composer-autosave.h
   trunk/composer/e-composer-private.h
   trunk/composer/e-msg-composer.c
   trunk/mail/ChangeLog
   trunk/mail/em-composer-utils.c
   trunk/mail/em-composer-utils.h

Modified: trunk/composer/e-composer-actions.c
==============================================================================
--- trunk/composer/e-composer-actions.c	(original)
+++ trunk/composer/e-composer-actions.c	Wed Apr  9 03:00:45 2008
@@ -119,19 +119,21 @@
 {
 	GtkhtmlEditor *editor;
 	EComposerHeaderTable *table;
+	GtkWidget *widget;
 	const gchar *subject;
 	gint response;
 
 	editor = GTKHTML_EDITOR (composer);
+	widget = GTK_WIDGET (composer);
 
 	if (!gtkhtml_editor_get_changed (editor) &&
 		e_composer_autosave_get_saved (composer)) {
 
-		gtk_widget_destroy (GTK_WIDGET (composer));
+		gtk_widget_destroy (widget);
 		return;
 	}
 
-	gdk_window_raise (GTK_WIDGET (composer)->window);
+	gdk_window_raise (widget->window);
 
 	table = e_msg_composer_get_header_table (composer);
 	subject = e_composer_header_table_get_subject (table);
@@ -146,11 +148,12 @@
 
 	switch (response) {
 		case GTK_RESPONSE_YES:
+			gtk_widget_hide (widget);
 			gtk_action_activate (ACTION (SAVE_DRAFT));
 			break;
 
 		case GTK_RESPONSE_NO:
-			gtk_widget_destroy (GTK_WIDGET (composer));
+			gtk_widget_destroy (widget);
 			break;
 
 		case GTK_RESPONSE_CANCEL:

Modified: trunk/composer/e-composer-autosave.c
==============================================================================
--- trunk/composer/e-composer-autosave.c	(original)
+++ trunk/composer/e-composer-autosave.c	Wed Apr  9 03:00:45 2008
@@ -230,9 +230,12 @@
 }
 
 void
-e_composer_autosave_unregister (EMsgComposer *composer)
+e_composer_autosave_unregister (EMsgComposer *composer,
+                                gboolean delete_file)
 {
 	AutosaveState *state;
+	GtkWindow *parent;
+	gboolean delete_autosave_file = FALSE;
 
 	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
 
@@ -240,11 +243,10 @@
 	if (state == NULL || state->filename == NULL)
 		return;
 
-	if (e_composer_autosave_snapshot (composer)) {
-		close (state->fd);
+	close (state->fd);
+
+	if (delete_file)
 		g_unlink (state->filename);
-	} else
-		close (state->fd);
 
 	g_object_set_data (G_OBJECT (composer), "autosave", NULL);
 }

Modified: trunk/composer/e-composer-autosave.h
==============================================================================
--- trunk/composer/e-composer-autosave.h	(original)
+++ trunk/composer/e-composer-autosave.h	Wed Apr  9 03:00:45 2008
@@ -28,7 +28,8 @@
 GList *		e_composer_autosave_find_orphans (GError **error);
 
 void		e_composer_autosave_register	 (EMsgComposer *composer);
-void		e_composer_autosave_unregister	 (EMsgComposer *composer);
+void		e_composer_autosave_unregister	 (EMsgComposer *composer,
+						  gboolean delete_file);
 gboolean	e_composer_autosave_snapshot	 (EMsgComposer *composer);
 gint		e_composer_autosave_get_fd	 (EMsgComposer *composer);
 const gchar *	e_composer_autosave_get_filename (EMsgComposer *composer);

Modified: trunk/composer/e-composer-private.h
==============================================================================
--- trunk/composer/e-composer-private.h	(original)
+++ trunk/composer/e-composer-private.h	Wed Apr  9 03:00:45 2008
@@ -120,10 +120,9 @@
 	guint32 attachment_bar_visible : 1;
 	guint32 is_alternative         : 1;
 	guint32 autosaved              : 1;
-
 	guint32 mode_post              : 1;
-
 	guint32 in_signature_insert    : 1;
+	guint32 application_exiting    : 1;
 
 	CamelMimeMessage *redirect;
 

Modified: trunk/composer/e-msg-composer.c
==============================================================================
--- trunk/composer/e-msg-composer.c	(original)
+++ trunk/composer/e-msg-composer.c	Wed Apr  9 03:00:45 2008
@@ -2150,8 +2150,15 @@
 msg_composer_dispose (GObject *object)
 {
 	EMsgComposer *composer = E_MSG_COMPOSER (object);
+	gboolean delete_file;
+
+	/* If the application is exiting, keep the autosave file so we can
+	 * restore it later.  Otherwise we're just closing this composer
+	 * window, and the CLOSE action has already handled any unsaved
+	 * changes, so we can safely delete the autosave file. */
+	delete_file = !composer->priv->application_exiting;
+	e_composer_autosave_unregister (composer, delete_file);
 
-	e_composer_autosave_unregister (composer);
 	e_composer_private_dispose (composer);
 
 	/* Chain up to parent's dispose() method. */
@@ -2709,9 +2716,8 @@
 		E_TYPE_MSG_COMPOSER,
 		G_SIGNAL_RUN_LAST,
 		0, NULL, NULL,
-		g_cclosure_marshal_VOID__BOOLEAN,
-		G_TYPE_NONE, 1,
-		G_TYPE_BOOLEAN);
+		g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE, 0);
 }
 
 static void
@@ -3744,7 +3750,7 @@
 
 	editor = GTKHTML_EDITOR (composer);
 
-	g_signal_emit (composer, signals[SAVE_DRAFT], 0, FALSE);
+	g_signal_emit (composer, signals[SAVE_DRAFT], 0);
 
 	/* XXX This should be elsewhere. */
 	gtkhtml_editor_set_changed (editor, FALSE);
@@ -4601,7 +4607,21 @@
 
 	for (iter = all_composers; iter != NULL; iter = next) {
 		EMsgComposer *composer = iter->data;
+
+		/* The CLOSE action will delete this list node,
+		 * so grab the next one while we still can. */
 		next = iter->next;
+
+		/* Try to autosave before closing.  If it fails for
+		 * some reason, the CLOSE action will still detect
+		 * unsaved changes and prompt the user. 
+		 *
+		 * FIXME If it /does/ prompt the user, the Cancel
+		 *       button will act the same as Discard Changes,
+		 *       which is misleading.
+		 */
+		composer->priv->application_exiting = TRUE;
+		e_composer_autosave_snapshot (composer);
 		gtk_action_activate (ACTION (CLOSE));
 	}
 

Modified: trunk/mail/em-composer-utils.c
==============================================================================
--- trunk/mail/em-composer-utils.c	(original)
+++ trunk/mail/em-composer-utils.c	Wed Apr  9 03:00:45 2008
@@ -459,7 +459,6 @@
 	struct emcs_t *emcs;
 	EMsgComposer *composer;
 	CamelMessageInfo *info;
-	int quit;
 };
 
 static void
@@ -511,7 +510,10 @@
 		emcs->drafts_uid = g_strdup (appended_uid);
 	}
 
-	if (sdi->quit)
+	/* This is kind of a hack, but the composer's CLOSE action
+	 * hides the window before emitting the "save-draft" signal.
+	 * We use that to determine whether to destroy the composer. */
+	if (!GTK_WIDGET_VISIBLE (sdi->composer))
 		gtk_widget_destroy (GTK_WIDGET (sdi->composer));
 
  done:
@@ -534,7 +536,7 @@
 }
 
 void
-em_utils_composer_save_draft_cb (EMsgComposer *composer, int quit, gpointer user_data)
+em_utils_composer_save_draft_cb (EMsgComposer *composer, gpointer user_data)
 {
 	const char *default_drafts_folder_uri = mail_component_get_folder_uri(NULL, MAIL_COMPONENT_FOLDER_DRAFTS);
 	CamelFolder *drafts_folder = mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_DRAFTS);
@@ -559,7 +561,6 @@
 	sdi->emcs = user_data;
 	if (sdi->emcs)
 		emcs_ref(sdi->emcs);
-	sdi->quit = quit;
 
 	if (account && account->drafts_folder_uri &&
 	    strcmp (account->drafts_folder_uri, default_drafts_folder_uri) != 0) {

Modified: trunk/mail/em-composer-utils.h
==============================================================================
--- trunk/mail/em-composer-utils.h	(original)
+++ trunk/mail/em-composer-utils.h	Wed Apr  9 03:00:45 2008
@@ -42,7 +42,7 @@
 #define em_composer_utils_setup_default_callbacks(composer) em_composer_utils_setup_callbacks (composer, NULL, NULL, 0, 0, NULL, NULL)
 
 void em_utils_composer_send_cb(struct _EMsgComposer *composer, gpointer user_data);
-void em_utils_composer_save_draft_cb(struct _EMsgComposer *composer, int quit, gpointer user_data);
+void em_utils_composer_save_draft_cb(struct _EMsgComposer *composer, gpointer user_data);
 
 void em_utils_compose_new_message (const char *fromuri);
 



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