diff options
-rw-r--r-- | mail/ChangeLog | 10 | ||||
-rw-r--r-- | mail/em-folder-view.c | 64 |
2 files changed, 60 insertions, 14 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 40115493ac..28917e7f64 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,5 +1,15 @@ 2005-03-16 Not Zed <NotZed@Ximian.com> + ** See bug #73363 + + * em-folder-view.c (emfv_list_message_selected): insert a timeout + before loading the message. + (emfv_message_selected_timeout): handle the timeout, start loading + the message. + (emfv_set_folder, emfv_destroy): cleanups for above. + +2005-03-16 Not Zed <NotZed@Ximian.com> + ** See bug #73559 * em-filter-source-element.c diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index 9ceb6fee25..2aed322adc 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -132,6 +132,7 @@ static const EMFolderViewEnable emfv_enable_map[]; struct _EMFolderViewPrivate { guint seen_id; guint setting_notify_id; + guint selected_id; int nomarkseen:1; int destroyed:1; @@ -140,6 +141,8 @@ struct _EMFolderViewPrivate { GalViewInstance *view_instance; GalViewMenus *view_menus; + + char *selected_uid; }; static GtkVBoxClass *emfv_parent; @@ -255,6 +258,14 @@ emfv_destroy (GtkObject *o) p->invisible = NULL; } + if (p->selected_id != 0) { + g_source_remove(p->selected_id); + p->selected_id = 0; + } + + g_free(p->selected_uid); + p->selected_uid = NULL; + emfv->preview = NULL; emfv->list = NULL; emfv->preview_active = FALSE; @@ -556,6 +567,9 @@ emfv_set_folder(EMFolderView *emfv, CamelFolder *folder, const char *uri) if (folder == emfv->folder) return; + + if (emfv->priv->selected_id) + g_source_remove(emfv->priv->selected_id); if (emfv->preview) em_format_format ((EMFormat *) emfv->preview, NULL, NULL, NULL); @@ -2137,24 +2151,46 @@ emfv_list_done_message_selected(CamelFolder *folder, const char *uid, CamelMimeM g_object_unref (emfv); } +static gboolean +emfv_message_selected_timeout(void *data) +{ + EMFolderView *emfv = data; + + if (emfv->priv->selected_uid) { + if (emfv->displayed_uid == NULL || strcmp(emfv->displayed_uid, emfv->priv->selected_uid) != 0) { + g_free(emfv->displayed_uid); + emfv->displayed_uid = emfv->priv->selected_uid; + emfv->priv->selected_uid = NULL; + g_object_ref (emfv); + /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */ + mail_get_message(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_thread_queued); + } else { + g_free(emfv->priv->selected_uid); + emfv->priv->selected_uid = NULL; + } + } else { + g_free(emfv->displayed_uid); + emfv->displayed_uid = NULL; + em_format_format((EMFormat *)emfv->preview, NULL, NULL, NULL); + emfv->priv->nomarkseen = FALSE; + } + + emfv->priv->selected_id = 0; + + return FALSE; +} + static void emfv_list_message_selected(MessageList *ml, const char *uid, EMFolderView *emfv) { if (emfv->preview_active) { - if (uid) { - if (emfv->displayed_uid == NULL || strcmp(emfv->displayed_uid, uid) != 0) { - g_free(emfv->displayed_uid); - emfv->displayed_uid = g_strdup(uid); - g_object_ref (emfv); - /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */ - mail_get_message(emfv->folder, uid, emfv_list_done_message_selected, emfv, mail_thread_queued); - } - } else { - g_free(emfv->displayed_uid); - emfv->displayed_uid = NULL; - em_format_format((EMFormat *)emfv->preview, NULL, NULL, NULL); - emfv->priv->nomarkseen = FALSE; - } + if (emfv->priv->selected_id != 0) + g_source_remove(emfv->priv->selected_id); + + emfv->priv->selected_id = g_timeout_add(100, emfv_message_selected_timeout, emfv); + + g_free(emfv->priv->selected_uid); + emfv->priv->selected_uid = g_strdup(uid); } emfv_enable_menus(emfv); |