[evolution] Bug 612619 - Don't mark message as read after folder change



commit c3cd3697c5dd8cd03037a76f01f5ade79c3e79ab
Author: Matthew Barnes <mbarnes redhat com>
Date:   Fri Mar 12 12:22:17 2010 -0500

    Bug 612619 - Don't mark message as read after folder change

 mail/e-mail-reader.c |   59 ++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 45 insertions(+), 14 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 9fa6ea0..ad60195 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -68,6 +68,13 @@ struct _EMailReaderPrivate {
 	/* This is the ID of an asynchronous operation
 	 * to retrieve a message from a mail folder. */
 	gint retrieving_message_operation_id;
+
+	/* These flags work together to prevent message selection
+	 * restoration after a folder switch from automatically
+	 * marking the message as read.  We only want that to
+	 * happen when the -user- selects a message. */
+	guint folder_was_just_selected    : 1;
+	guint restoring_message_selection : 1;
 };
 
 enum {
@@ -1818,7 +1825,7 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	EMEvent *event;
 	EMEventTargetMessage *target;
 	const gchar *cursor_uid;
-	gboolean mark_read;
+	gboolean schedule_timeout;
 	gint timeout_interval;
 
 	priv = E_MAIL_READER_GET_PRIVATE (reader);
@@ -1835,7 +1842,7 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	/* If the user picked a different message in the time it took
 	 * to fetch this message, then don't bother rendering it. */
 	if (g_strcmp0 (cursor_uid, message_uid) != 0)
-		return;
+		goto exit;
 
 	/** @Event: message.reading
 	 * @Title: Viewing a message
@@ -1857,20 +1864,25 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	e_shell_event (shell, "mail-icon", (gpointer) "evolution-mail");
 
 	/* Determine whether to mark the message as read. */
-	mark_read = e_shell_settings_get_boolean (
-		shell_settings, "mail-mark-seen");
-	timeout_interval = e_shell_settings_get_int (
+	schedule_timeout =
+		(message != NULL) &&
+		e_shell_settings_get_boolean (
+			shell_settings, "mail-mark-seen") &&
+		!priv->restoring_message_selection;
+	timeout_interval =
+		e_shell_settings_get_int (
 		shell_settings, "mail-mark-seen-timeout");
 
 	g_free (priv->mark_read_message_uid);
-	priv->mark_read_message_uid = g_strdup (message_uid);
+	priv->mark_read_message_uid = NULL;
 
 	if (MESSAGE_LIST (message_list)->seen_id > 0) {
 		g_source_remove (MESSAGE_LIST (message_list)->seen_id);
 		MESSAGE_LIST (message_list)->seen_id = 0;
 	}
 
-	if (message != NULL && mark_read) {
+	if (schedule_timeout) {
+		priv->mark_read_message_uid = g_strdup (message_uid);
 		MESSAGE_LIST (message_list)->seen_id = g_timeout_add (
 			timeout_interval, (GSourceFunc)
 			mail_reader_message_read_cb, reader);
@@ -1896,6 +1908,9 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 
 	/* We referenced this in the call to mail_get_messagex(). */
 	g_object_unref (reader);
+
+exit:
+	priv->restoring_message_selection = FALSE;
 }
 
 static gboolean
@@ -1959,8 +1974,10 @@ mail_reader_message_selected_timeout_cb (EMailReader *reader)
 			if (!store_async)
 				priv->retrieving_message_operation_id = op_id;
 		}
-	} else
+	} else {
 		em_format_format (EM_FORMAT (html_display), NULL, NULL, NULL);
+		priv->restoring_message_selection = FALSE;
+	}
 
 	priv->message_selected_timeout_id = 0;
 
@@ -1975,7 +1992,6 @@ mail_reader_message_selected_cb (EMailReader *reader,
 	MessageList *message_list;
 	gboolean store_async;
 	CamelFolder *folder;
-	guint source_id;
 
 	priv = E_MAIL_READER_GET_PRIVATE (reader);
 
@@ -1999,11 +2015,21 @@ mail_reader_message_selected_cb (EMailReader *reader,
 		priv->message_selected_timeout_id = 0;
 	}
 
-	source_id = g_timeout_add (
-		100, (GSourceFunc)
-		mail_reader_message_selected_timeout_cb, reader);
-
-	priv->message_selected_timeout_id = source_id;
+	/* If a folder was just selected then we are now automatically
+	 * restoring the previous message selection.  We behave slightly
+	 * differently than if the user had selected the message. */
+	priv->restoring_message_selection = priv->folder_was_just_selected;
+	priv->folder_was_just_selected = FALSE;
+
+	/* Skip the timeout if we're restoring the previous message
+	 * selection.  The timeout is there for when we're scrolling
+	 * rapidly through the message list. */
+	if (priv->restoring_message_selection)
+		mail_reader_message_selected_timeout_cb (reader);
+	else
+		priv->message_selected_timeout_id = g_timeout_add (
+			100, (GSourceFunc)
+			mail_reader_message_selected_timeout_cb, reader);
 
 	e_mail_reader_changed (reader);
 }
@@ -2049,12 +2075,15 @@ mail_reader_set_folder (EMailReader *reader,
                         CamelFolder *folder,
                         const gchar *folder_uri)
 {
+	EMailReaderPrivate *priv;
 	EMFormatHTMLDisplay *html_display;
 	CamelFolder *previous_folder;
 	GtkWidget *message_list;
 	const gchar *previous_folder_uri;
 	gboolean outgoing;
 
+	priv = E_MAIL_READER_GET_PRIVATE (reader);
+
 	html_display = e_mail_reader_get_html_display (reader);
 	message_list = e_mail_reader_get_message_list (reader);
 
@@ -2075,6 +2104,8 @@ mail_reader_set_folder (EMailReader *reader,
 
 	em_format_format (EM_FORMAT (html_display), NULL, NULL, NULL);
 
+	priv->folder_was_just_selected = (folder != NULL);
+
 	message_list_set_folder (
 		MESSAGE_LIST (message_list), folder, folder_uri, outgoing);
 



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