Bug #616981 - Mail marking as read is hard

This commit is contained in:
Milan Crha
2011-10-20 17:44:27 +02:00
parent af7021e9bb
commit d433cec97a

View File

@ -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),
@ -2747,6 +2778,22 @@ mail_reader_message_selected_cb (EMailReader *reader,
e_mail_reader_changed (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)
{
@ -3627,6 +3674,10 @@ connect_signals:
message_list, "message-selected",
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);