From 6f22eb642b794def699ce9341219f56d793a50fb Mon Sep 17 00:00:00 2001 From: Not Zed Date: Wed, 1 Aug 2001 04:57:01 +0000 Subject: Slightly re-arranged filter/change notification logic. If we;re filtering, 2001-08-01 Not Zed * providers/imap/camel-imap-folder.c (camel_imap_folder_changed): Slightly re-arranged filter/change notification logic. If we;re filtering, freeze the folder till we're finished to smooth the ui for new mail. 2001-07-31 Not Zed * camel-folder.c (camel_folder_init): Chagned mutexes to e_mutexes, folder lock recursive. This fixes the imap filtering bug, or at least some cases of it. (camel_folder_finalize): Free mutexes. * camel-private.h (CamelFolderPrivate): Changed mutexes to e_mutexes. 2001-07-25 Not Zed * camel-folder.c (camel_folder_change_info_*): Change the return if fail's into asserts. (camel_folder_change_info_free): Don't let it accept a NULL argument. This isn't g_lib so we dont have to. svn path=/trunk/; revision=11537 --- camel/providers/imap/camel-imap-folder.c | 42 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'camel/providers/imap') diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 3984db4bd9..ba30ac7cc1 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -1846,27 +1846,35 @@ camel_imap_folder_changed (CamelFolder *folder, int exists, imap_update_summary (folder, exists, changes, recents, ex); } - if (camel_folder_change_info_changed (changes)) { - camel_object_trigger_event (CAMEL_OBJECT (folder), - "folder_changed", changes); + /* if we have updates to make for filtering (probably), then we freeze the + folder so we dont show them till they're complete, this may cause unacceptable + delays for users, but the alternative isn't very nice either (show them and let + them change as processed) */ + if (recents && !camel_exception_is_set(ex) && recents->len) { + CamelFilterDriver *driver; + + camel_folder_freeze(folder); + + if (camel_folder_change_info_changed(changes)) + camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", changes); + + driver = camel_session_get_filter_driver(CAMEL_SERVICE(folder->parent_store)->session, "incoming", ex); + if (driver) { + camel_filter_driver_filter_folder(driver, folder, NULL, recents, FALSE, ex); + camel_object_unref(CAMEL_OBJECT(driver)); + } + + camel_folder_thaw(folder); + } else { + if (camel_folder_change_info_changed(changes)) + camel_object_trigger_event(CAMEL_OBJECT(folder), "folder_changed", changes); } + camel_folder_change_info_free (changes); - if (recents) { - if (!camel_exception_is_set (ex) && recents->len) { - CamelFilterDriver *driver; - - driver = camel_session_get_filter_driver ( - CAMEL_SERVICE (folder->parent_store)->session, - "incoming", ex); - if (driver) { - camel_filter_driver_filter_folder ( - driver, folder, NULL, recents, FALSE, ex); - camel_object_unref (CAMEL_OBJECT (driver)); - } - } + if (recents) g_ptr_array_free (recents, TRUE); - } + camel_folder_summary_save (folder->summary); } -- cgit v1.2.3