aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-folder-thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/camel-folder-thread.c')
-rw-r--r--camel/camel-folder-thread.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/camel/camel-folder-thread.c b/camel/camel-folder-thread.c
index c83c33687d..2e71189946 100644
--- a/camel/camel-folder-thread.c
+++ b/camel/camel-folder-thread.c
@@ -277,6 +277,7 @@ group_root_set(CamelFolderThread *thread, CamelFolderThreadNode **cp)
} else if (c->re && container->re) {
d(printf("subjects are common %p and %p\n", c, container));
+ /* build a phantom node */
remove_node(cp, container, &clast);
remove_node(cp, c, &clast);
@@ -535,6 +536,32 @@ camel_folder_thread_messages_new(CamelFolder *folder, GPtrArray *uids)
sort_thread(&head);
+ /* remove any phantom nodes, this could possibly be put in group_root_set()? */
+ c = &head;
+ while (c->next) {
+ CamelFolderThreadNode *scan, *newtop;
+
+ child = c->next;
+ if (child->message == NULL) {
+ newtop = child->child;
+ /* unlink pseudo node */
+ c->next = newtop;
+
+ /* link its siblings onto the end of its children */
+ scan = &newtop->child;
+ while (scan->next)
+ scan = scan->next;
+ scan->next = newtop->next;
+ /* and link the now 'real' node into the list */
+ newtop->next = child->next;
+ c = newtop->next;
+ e_memchunk_free(thread->node_chunks, child);
+ } else {
+ c = child;
+ }
+ }
+
+
thread->tree = head;
#ifdef TIMEIT