[evolution] Bug #616981 - Mail marking as read is hard



commit d433cec97a7229a79e456a1987a3d3bd1dcb4d67
Author: Milan Crha <mcrha redhat com>
Date:   Thu Oct 20 17:44:27 2011 +0200

    Bug #616981 - Mail marking as read is hard

 mail/e-mail-reader.c |  105 +++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 78 insertions(+), 27 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 9209942..8b7c803 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -46,6 +46,7 @@
 #include "mail/e-mail-display.h"
 #include "mail/e-mail-enumtypes.h"
 #include "mail/e-mail-reader-utils.h"
+#include "mail/e-mail-view.h"
 #include "mail/em-composer-utils.h"
 #include "mail/em-event.h"
 #include "mail/em-folder-selector.h"
@@ -2497,6 +2498,58 @@ mail_reader_message_read_cb (EMailReaderClosure *closure)
 	return FALSE;
 }
 
+static gboolean
+schedule_timeout_mark_seen (EMailReader *reader)
+{
+	EShell *shell;
+	EMailBackend *backend;
+	EShellBackend *shell_backend;
+	EShellSettings *shell_settings;
+	MessageList *message_list;
+	gboolean schedule_timeout;
+	gint timeout_interval;
+	const gchar *message_uid;
+
+	backend = e_mail_reader_get_backend (reader);
+	message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader));
+	shell_backend = E_SHELL_BACKEND (backend);
+	shell = e_shell_backend_get_shell (shell_backend);
+	shell_settings = e_shell_get_shell_settings (shell);
+
+	message_uid = message_list->cursor_uid;
+	if (!message_uid)
+		return FALSE;
+
+	schedule_timeout =
+		(message_uid != NULL) &&
+		e_shell_settings_get_boolean (
+			shell_settings, "mail-mark-seen");
+	timeout_interval =
+		e_shell_settings_get_int (
+		shell_settings, "mail-mark-seen-timeout");
+
+	if (message_list->seen_id > 0) {
+		g_source_remove (message_list->seen_id);
+		message_list->seen_id = 0;
+	}
+
+	if (schedule_timeout) {
+		EMailReaderClosure *timeout_closure;
+
+		timeout_closure = g_slice_new0 (EMailReaderClosure);
+		timeout_closure->reader = g_object_ref (reader);
+		timeout_closure->message_uid = g_strdup (message_uid);
+
+		MESSAGE_LIST (message_list)->seen_id = g_timeout_add_full (
+			G_PRIORITY_DEFAULT, timeout_interval,
+			(GSourceFunc) mail_reader_message_read_cb,
+			timeout_closure, (GDestroyNotify)
+			mail_reader_closure_free);
+	}
+
+	return schedule_timeout;
+}
+
 static void
 mail_reader_message_loaded_cb (CamelFolder *folder,
                                GAsyncResult *result,
@@ -2509,14 +2562,11 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	GtkWidget *message_list;
 	EMailBackend *backend;
 	EShellBackend *shell_backend;
-	EShellSettings *shell_settings;
 	EShell *shell;
 	EWebView *web_view;
 	EMEvent *event;
 	EMEventTargetMessage *target;
 	const gchar *message_uid;
-	gboolean schedule_timeout;
-	gint timeout_interval;
 	GError *error = NULL;
 
 	reader = closure->reader;
@@ -2553,7 +2603,6 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 
 	shell_backend = E_SHELL_BACKEND (backend);
 	shell = e_shell_backend_get_shell (shell_backend);
-	shell_settings = e_shell_get_shell_settings (shell);
 
 	web_view = em_format_html_get_web_view (formatter);
 
@@ -2578,34 +2627,16 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
 	/* Reset the shell view icon. */
 	e_shell_event (shell, "mail-icon", (gpointer) "evolution-mail");
 
-	/* Determine whether to mark the message as read. */
-	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");
-
 	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 (schedule_timeout) {
-		EMailReaderClosure *timeout_closure;
-
-		timeout_closure = g_slice_new0 (EMailReaderClosure);
-		timeout_closure->reader = g_object_ref (reader);
-		timeout_closure->message_uid = g_strdup (message_uid);
-
-		MESSAGE_LIST (message_list)->seen_id = g_timeout_add_full (
-			G_PRIORITY_DEFAULT, timeout_interval,
-			(GSourceFunc) mail_reader_message_read_cb,
-			timeout_closure, (GDestroyNotify)
-			mail_reader_closure_free);
-
+	/* Determine whether to mark the message as read. */
+	if (message != NULL &&
+	    !priv->restoring_message_selection &&
+	    schedule_timeout_mark_seen (reader)) {
+		g_clear_error (&error);
 	} else if (error != NULL) {
 		e_alert_submit (
 			E_ALERT_SINK (web_view),
@@ -2748,6 +2779,22 @@ mail_reader_message_selected_cb (EMailReader *reader,
 }
 
 static void
+mail_reader_message_cursor_change_cb (EMailReader *reader)
+{
+	MessageList *message_list;
+
+	g_return_if_fail (reader != NULL);
+
+	message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader));
+	g_return_if_fail (message_list != NULL);
+
+	if (!message_list->seen_id &&
+	    E_IS_MAIL_VIEW (reader) &&
+	    e_mail_view_get_preview_visible (E_MAIL_VIEW (reader)))
+		schedule_timeout_mark_seen (reader);
+}
+
+static void
 mail_reader_emit_folder_loaded (EMailReader *reader)
 {
 	g_signal_emit (reader, signals[FOLDER_LOADED], 0);
@@ -3628,6 +3675,10 @@ connect_signals:
 		G_CALLBACK (mail_reader_message_selected_cb), reader);
 
 	g_signal_connect_swapped (
+		message_list, "cursor-change",
+		G_CALLBACK (mail_reader_message_cursor_change_cb), reader);
+
+	g_signal_connect_swapped (
 		message_list, "message-list-built",
 		G_CALLBACK (mail_reader_emit_folder_loaded), reader);
 



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