aboutsummaryrefslogtreecommitdiffstats
path: root/mail/message-list.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-05-21 17:10:00 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-05-21 17:10:00 +0800
commitffa75e6801faaffb2626d83779fe0a91a8f58d3a (patch)
treede74dcb1ab7ea1e4dc93d9421215bb02a2c05f99 /mail/message-list.c
parent2bc97c08c1ca8057f03b3b3d872eafa306bab22c (diff)
downloadgsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar.gz
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar.bz2
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar.lz
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar.xz
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.tar.zst
gsoc2013-evolution-ffa75e6801faaffb2626d83779fe0a91a8f58d3a.zip
add marshaller for p_ppppp call.
2004-05-21 Not Zed <NotZed@Ximian.com> * mail-mt.c (do_call): add marshaller for p_ppppp call. * mail-session.c (get_password): fix for camel api changes. (forget_password): same. ** See #58376. * message-list.c (mail_regen_list): do some timeout foo so we don't keep doing list regnerations if we're getting called too often. God knows what this will break. (message_list_set_selected): removede bug printf. (regen_list_free): move the message-list poking stuff into regen_list_regened. (message_list_set_folder): call mail_regen_cancel to cancel any regen stuff. (mail_regen_cancel): cancel/clear outstanding regenerations. (message_list_destroy): do it here too. (message_list_select_uid): also set the pending select uid if we have a timeout pending. * mail-component.c (impl_createControls): set the defualt parent to the main folderview as soon as its created. * em-folder-tree.c (emft_popup_copy_folder_selected): use get_toplevel rather than get_ancestor. seems the more reliable one. also we're always parented so we shoudl always find a toplevel window. (em_folder_tree_create_folder): same. (emft_popup_delete_response): set error parent. (emft_popup_delete_folder, emft_popup_rename_folder) (emft_popup_rename_folder, emft_popup_rename_folder): svn path=/trunk/; revision=26030
Diffstat (limited to 'mail/message-list.c')
-rw-r--r--mail/message-list.c110
1 files changed, 65 insertions, 45 deletions
diff --git a/mail/message-list.c b/mail/message-list.c
index 38b389b062..58f579dc4b 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -181,6 +181,7 @@ static void load_hide_state(MessageList *ml);
/* note: @changes is owned/freed by the caller */
/*static void mail_do_regenerate_messagelist (MessageList *list, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes);*/
static void mail_regen_list(MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes);
+static void mail_regen_cancel(MessageList *ml);
static void clear_info(char *key, ETreePath *node, MessageList *ml);
@@ -565,7 +566,7 @@ message_list_select_uid (MessageList *message_list, const char *uid)
if (message_list->folder == NULL)
return;
- if (message_list->regen) {
+ if (message_list->regen || message_list->regen_timeout_id) {
g_free(message_list->pending_select_uid);
message_list->pending_select_uid = g_strdup(uid);
}
@@ -1800,7 +1801,9 @@ message_list_destroy(GtkObject *object)
/* need to do this before removing folder, folderinfo's might not exist after */
save_tree_state(message_list);
save_hide_state(message_list);
-
+
+ mail_regen_cancel(message_list);
+
if (message_list->uid_nodemap) {
g_hash_table_foreach(message_list->uid_nodemap, (GHFunc)clear_info, message_list);
g_hash_table_destroy (message_list->uid_nodemap);
@@ -1836,7 +1839,7 @@ message_list_destroy(GtkObject *object)
g_source_remove (message_list->seen_id);
message_list->seen_id = 0;
}
-
+
message_list->destroyed = TRUE;
GTK_OBJECT_CLASS (message_list_parent_class)->destroy(object);
@@ -2716,19 +2719,8 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const c
g_source_remove (message_list->idle_id);
message_list->idle_id = 0;
}
-
- /* cancel any outstanding regeneration requests */
- if (message_list->regen) {
- GList *l = message_list->regen;
-
- while (l) {
- struct _mail_msg *mm = l->data;
-
- if (mm->cancel)
- camel_operation_cancel(mm->cancel);
- l = l->next;
- }
- }
+
+ mail_regen_cancel(message_list);
if (message_list->folder != NULL) {
save_tree_state (message_list);
@@ -2994,7 +2986,6 @@ message_list_set_selected(MessageList *ml, GPtrArray *uids)
for (i=0; i<uids->len; i++) {
node = g_hash_table_lookup(ml->uid_nodemap, uids->pdata[i]);
- printf("reselecting uid '%s' %s\n", uids->pdata[i], node?"found":"not found");
if (node)
e_tree_selection_model_add_to_selection(etsm, node);
}
@@ -3521,6 +3512,18 @@ regen_list_regened (struct _mail_msg *mm)
} else
build_flat (m->ml, m->summary, m->changes);
+ if (m->ml->search && m->ml->search != m->search)
+ g_free (m->ml->search);
+ m->ml->search = m->search;
+
+ if (m->ml->regen == NULL && m->ml->pending_select_uid) {
+ char *uid = m->ml->pending_select_uid;
+
+ m->ml->pending_select_uid = NULL;
+ message_list_select_uid(m->ml, uid);
+ g_free(uid);
+ }
+
g_signal_emit (m->ml, message_list_signals[MESSAGE_LIST_BUILT], 0);
}
@@ -3539,10 +3542,6 @@ regen_list_free (struct _mail_msg *mm)
if (m->tree)
camel_folder_thread_messages_unref (m->tree);
- if (m->ml->search && m->ml->search != m->search)
- g_free (m->ml->search);
- m->ml->search = m->search;
-
g_free (m->hideexpr);
camel_object_unref (m->folder);
@@ -3550,18 +3549,9 @@ regen_list_free (struct _mail_msg *mm)
if (m->changes)
camel_folder_change_info_free (m->changes);
- /* This should probably lock the list.
- However, since we have a received function, this will always be called in gui thread */
+ /* we have to poke this here since we might've been cancelled and regened wont get called */
m->ml->regen = g_list_remove(m->ml->regen, m);
- if (m->ml->regen == NULL && m->ml->pending_select_uid) {
- char *uid = m->ml->pending_select_uid;
-
- m->ml->pending_select_uid = NULL;
- message_list_select_uid(m->ml, uid);
- g_free(uid);
- }
-
g_object_unref(m->ml);
}
@@ -3572,28 +3562,55 @@ static struct _mail_msg_op regen_list_op = {
regen_list_free,
};
-static void
-mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes)
+static gboolean
+ml_regen_timeout(struct _regen_list_msg *m)
{
- struct _regen_list_msg *m;
- GConfClient *gconf;
-
- if (ml->folder == NULL)
- return;
+ m->ml->regen = g_list_prepend(m->ml->regen, m);
+ /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
+ e_thread_put (mail_thread_queued, (EMsg *)m);
+
+ m->ml->regen_timeout_msg = NULL;
+ m->ml->regen_timeout_id = 0;
+
+ return FALSE;
+}
- /* cancel any outstanding regeneration requests, we rebuild from scratch anyway */
+static void
+mail_regen_cancel(MessageList *ml)
+{
+ /* cancel any outstanding regeneration requests, not we don't clear, they clear themselves */
if (ml->regen) {
GList *l = ml->regen;
-
+
while (l) {
struct _mail_msg *mm = l->data;
-
+
if (mm->cancel)
camel_operation_cancel(mm->cancel);
l = l->next;
}
}
+
+ /* including unqueued ones */
+ if (ml->regen_timeout_id) {
+ g_source_remove(ml->regen_timeout_id);
+ ml->regen_timeout_id = 0;
+ mail_msg_free((struct _mail_msg *)ml->regen_timeout_msg);
+ ml->regen_timeout_msg = NULL;
+ }
+}
+
+static void
+mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes)
+{
+ struct _regen_list_msg *m;
+ GConfClient *gconf;
+ if (ml->folder == NULL)
+ return;
+
+ mail_regen_cancel(ml);
+
gconf = mail_config_get_gconf_client ();
#ifndef BROKEN_ETREE
@@ -3629,10 +3646,13 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came
camel_folder_thread_messages_ref(m->tree);
}
- ml->regen = g_list_prepend(ml->regen, m);
-
- /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
- e_thread_put (mail_thread_queued, (EMsg *)m);
+ /* if we're busy already kick off timeout processing, so normal updates are immediate */
+ if (ml->regen == NULL)
+ ml_regen_timeout(m);
+ else {
+ ml->regen_timeout_msg = m;
+ ml->regen_timeout_id = g_timeout_add(500, (GSourceFunc)ml_regen_timeout, m);
+ }
}