aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog10
-rw-r--r--mail/em-folder-view.c64
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);