From 3d2a46877e96d740891e7f717d1f882e27506cdf Mon Sep 17 00:00:00 2001 From: Karl Relton Date: Fri, 1 Jun 2007 21:53:26 +0000 Subject: ** Fix for bug #311512 2007-06-01 Karl Relton ** Fix for bug #311512 * mail-folder-cache.c (folder_changed): Check the added uids for messages which are not seen/deleted/junk and compare their received date with the timestamp of the last new-mail notification - if any are more recent than that, notify the user. svn path=/trunk/; revision=33614 --- mail/ChangeLog | 9 +++++++++ mail/mail-folder-cache.c | 26 +++++++++++++++++++++----- mail/mail-folder-cache.h | 3 +++ 3 files changed, 33 insertions(+), 5 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index c9385fb5ce..587ec8b13a 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,12 @@ +2007-06-01 Karl Relton + + ** Fix for bug #311512 + + * mail-folder-cache.c (folder_changed): Check the added uids for + messages which are not seen/deleted/junk and compare their + received date with the timestamp of the last new-mail notification + - if any are more recent than that, notify the user. + 2007-06-02 Srinivasa Ragavan ** Adds support for Contact Image in the preview pane diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 67d2858205..92a4e01732 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -127,6 +127,7 @@ static guint notify_id = 0; static int notify_type = -1; static time_t last_notify = 0; +static time_t last_newmail = 0; static guint notify_idle_id = 0; static gboolean notify_idle_cb (gpointer user_data); @@ -197,7 +198,6 @@ real_flush_updates(void *o, void *event_data, void *data) struct _MailComponent *component; struct _EMFolderTreeModel *model; struct _folder_update *up; - time_t now; component = mail_component_peek (); model = mail_component_peek_tree_model (component); @@ -243,8 +243,7 @@ real_flush_updates(void *o, void *event_data, void *data) notify_type = gconf_client_get_int (gconf, "/apps/evolution/mail/notify/type", NULL); } - time (&now); - if (notify_type != 0 && up->new && notify_idle_id == 0 && (now - last_notify >= 5)) + if (notify_type != 0 && up->new && notify_idle_id == 0 && (last_newmail - last_notify >= NOTIFY_THROTTLE)) notify_idle_id = g_idle_add_full (G_PRIORITY_LOW, notify_idle_cb, NULL, NULL); if (up->uri) { @@ -442,9 +441,12 @@ folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) CamelFolderChangeInfo *changes = event_data; CamelFolder *folder = (CamelFolder *)o; CamelStore *store = folder->parent_store; + CamelMessageInfo *info; struct _store_info *si; struct _folder_info *mfi; int new = 0; + int i; + guint32 flags; d(printf("folder '%s' changed\n", folder->full_name)); @@ -452,8 +454,22 @@ folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) && folder != mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_OUTBOX) && folder != mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_DRAFTS) && folder != mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_SENT) - && changes && changes->uid_added) - new = changes->uid_added->len; + && changes && (changes->uid_added->len > 0)) { + /* for each added message, check to see that it is + brand new, not junk and not already deleted */ + for (i = 0; i < changes->uid_added->len; i++) { + info = camel_folder_get_message_info (folder, changes->uid_added->pdata[i]); + flags = camel_message_info_flags (info); + if (((flags & CAMEL_MESSAGE_SEEN) == 0) && + ((flags & CAMEL_MESSAGE_JUNK) == 0) && + ((flags & CAMEL_MESSAGE_DELETED) == 0) && + (camel_message_info_date_received (info) > last_newmail)) + new++; + } + } + + if (new > 0) + time (&last_newmail); LOCK(info_lock); if (stores != NULL diff --git a/mail/mail-folder-cache.h b/mail/mail-folder-cache.h index 875579ad67..79d59c1a71 100644 --- a/mail/mail-folder-cache.h +++ b/mail/mail-folder-cache.h @@ -25,6 +25,9 @@ #ifndef _MAIL_FOLDER_CACHE_H #define _MAIL_FOLDER_CACHE_H +/* min no. seconds between newmail notifications */ +#define NOTIFY_THROTTLE 30 + #include /* Add a store whose folders should appear in the shell -- cgit v1.2.3