2006-05-24 [colin] 2.2.0cvs54

attention cvs users: if you manage to crash
	Sylpheed-Claws while moving, copying or deleting
	mails, we *are* interested in stack traces and
	valgrind logs. It looks stable, but one never
	knows...

	* src/folder.c
		Add progressbar for cache updates
	* src/folderutils.c
		Optimize Mark all read in the current
		folder
	* src/mh.c
		Add progressbar for copy/move
	* src/procmsg.c
		Optimize O(n^2) in copy/move
	* src/summaryview.c
	* src/gtk/gtksctree.c
		Optimize O(n^2) algos
	* src/common/timing.h
		Display ms instead of us
This commit is contained in:
Colin Leroy 2006-05-24 18:02:15 +00:00
parent 35d520395e
commit e8135a04cd
10 changed files with 250 additions and 43 deletions

View file

@ -1,3 +1,26 @@
2006-05-24 [colin] 2.2.0cvs54
attention cvs users: if you manage to crash
Sylpheed-Claws while moving, copying or deleting
mails, we *are* interested in stack traces and
valgrind logs. It looks stable, but one never
knows...
* src/folder.c
Add progressbar for cache updates
* src/folderutils.c
Optimize Mark all read in the current
folder
* src/mh.c
Add progressbar for copy/move
* src/procmsg.c
Optimize O(n^2) in copy/move
* src/summaryview.c
* src/gtk/gtksctree.c
Optimize O(n^2) algos
* src/common/timing.h
Display ms instead of us
2006-05-24 [wwp] 2.2.0cvs53
* manual/fr/advanced.xml

View file

@ -1523,3 +1523,4 @@
( cvs diff -u -r 1.3.2.9 -r 1.3.2.10 src/folderutils.c; ) > 2.2.0cvs51.patchset
( cvs diff -u -r 1.36.2.61 -r 1.36.2.62 src/common/utils.c; ) > 2.2.0cvs52.patchset
( cvs diff -u -r 1.1.2.8 -r 1.1.2.9 manual/fr/advanced.xml; ) > 2.2.0cvs53.patchset
( cvs diff -u -r 1.213.2.94 -r 1.213.2.95 src/folder.c; cvs diff -u -r 1.3.2.10 -r 1.3.2.11 src/folderutils.c; cvs diff -u -r 1.79.2.29 -r 1.79.2.30 src/mh.c; cvs diff -u -r 1.150.2.64 -r 1.150.2.65 src/procmsg.c; cvs diff -u -r 1.395.2.206 -r 1.395.2.207 src/summaryview.c; cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/common/timing.h; cvs diff -u -r 1.1.4.17 -r 1.1.4.18 src/gtk/gtksctree.c; ) > 2.2.0cvs54.patchset

View file

@ -11,7 +11,7 @@ MINOR_VERSION=2
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
EXTRA_VERSION=53
EXTRA_VERSION=54
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=

View file

@ -49,9 +49,9 @@
#define END_TIMING() \
gettimeofday(&end, NULL); \
timersub(&end, &start, &diff); \
printf("%s: %ds%dus\n", \
printf("%s: %ds%03dms\n", \
timing_name, (unsigned int)diff.tv_sec, \
(unsigned int)diff.tv_usec); \
(unsigned int)diff.tv_usec/1000); \
#endif

View file

@ -54,6 +54,7 @@
#include "remotefolder.h"
#include "partial_download.h"
#include "statusbar.h"
#include "gtkutils.h"
#include "timing.h"
/* Dependecies to be removed ?! */
@ -1524,6 +1525,7 @@ void folder_item_process_open (FolderItem *item,
gint folder_item_open(FolderItem *item)
{
START_TIMING("folder_item_open");
if (item->no_select)
return -1;
@ -1536,7 +1538,7 @@ gint folder_item_open(FolderItem *item)
folder_item_process_open (item, NULL, NULL, NULL);
item->opened = TRUE;
END_TIMING();
return 0;
}
@ -2814,6 +2816,7 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
gboolean folderscan = FALSE;
GRelation *relation;
GSList *not_moved = NULL;
gint total = 0, curmsg = 0;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
@ -2920,6 +2923,8 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
folderscan = TRUE;
}
statusbar_print_all(_("Updating cache for %s..."), dest->path ? dest->path : "(null)");
total = g_slist_length(msglist);
for (l = msglist; l != NULL; l = g_slist_next(l)) {
MsgInfo *msginfo = (MsgInfo *) l->data;
GTuples *tuples;
@ -2928,6 +2933,10 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
g_tuples_destroy(tuples);
statusbar_progress_all(curmsg++,total, 100);
if (curmsg % 100 == 0)
GTK_EVENTS_FLUSH();
if (num >= 0) {
MsgInfo *newmsginfo = NULL;
@ -2966,6 +2975,8 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
lastnum = num;
}
}
statusbar_progress_all(0,0,0);
statusbar_pop_all();
g_relation_destroy(relation);
if (not_moved != NULL) {

View file

@ -24,6 +24,8 @@
#include "folderutils.h"
#include "prefs_account.h"
#include "account.h"
#include "mainwindow.h"
#include "summaryview.h"
gint folderutils_delete_duplicates(FolderItem *item,
DeleteDuplicatesMode mode)
@ -119,25 +121,33 @@ gint folderutils_delete_duplicates(FolderItem *item,
void folderutils_mark_all_read(FolderItem *item)
{
MsgInfoList *msglist, *cur;
MainWindow *mainwin = mainwindow_get_mainwindow();
g_return_if_fail(item != NULL);
msglist = folder_item_get_msg_list(item);
if (msglist == NULL)
return;
folder_item_update_freeze();
folder_item_set_batch(item, TRUE);
for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
MsgInfo *msginfo = cur->data;
if (mainwin && mainwin->summaryview &&
mainwin->summaryview->folder_item == item) {
summary_mark_all_read(mainwin->summaryview);
} else {
msglist = folder_item_get_msg_list(item);
if (msglist == NULL) {
folder_item_update_thaw();
return;
}
folder_item_set_batch(item, TRUE);
for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
MsgInfo *msginfo = cur->data;
if (msginfo->flags.perm_flags & (MSG_NEW | MSG_UNREAD))
procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
procmsg_msginfo_free(msginfo);
if (msginfo->flags.perm_flags & (MSG_NEW | MSG_UNREAD))
procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
procmsg_msginfo_free(msginfo);
}
folder_item_set_batch(item, FALSE);
folder_item_close(item);
g_slist_free(msglist);
}
folder_item_set_batch(item, FALSE);
folder_item_close(item);
folder_item_update_thaw();
g_slist_free(msglist);
}

View file

@ -72,6 +72,11 @@ static GtkCTreeNode * gtk_sctree_last_visible (GtkCTree *ctree,
GtkCTreeNode *node);
static void gtk_sctree_real_tree_expand (GtkCTree *ctree,
GtkCTreeNode *node);
static void
sreal_tree_move (GtkCTree *ctree,
GtkCTreeNode *node,
GtkCTreeNode *new_parent,
GtkCTreeNode *new_sibling);
static GtkCTreeClass *parent_class;
@ -171,6 +176,7 @@ gtk_sctree_class_init (GtkSCTreeClass *klass)
clist_class->clear = gtk_sctree_clear;
ctree_class->tree_collapse = gtk_sctree_collapse;
ctree_class->tree_expand = gtk_sctree_real_tree_expand;
ctree_class->tree_move = sreal_tree_move;
widget_class->button_press_event = gtk_sctree_button_press;
widget_class->button_release_event = gtk_sctree_button_release;
@ -212,7 +218,7 @@ select_range (GtkSCTree *sctree, gint row)
gint prev_row;
gint min, max;
gint i;
GList *node;
if (sctree->anchor_row == NULL) {
prev_row = row;
sctree->anchor_row = gtk_ctree_node_nth(GTK_CTREE(sctree), row);
@ -229,8 +235,21 @@ select_range (GtkSCTree *sctree, gint row)
max = row;
}
sctree->selecting_range = TRUE;
for (i = min; i < max; i++)
gtk_clist_select_row (GTK_CLIST (sctree), i, -1);
if (max < min) {
int t = min;
min = max;
max = t;
}
node = g_list_nth((GTK_CLIST(sctree))->row_list, min);
for (i = min; i < max; i++) {
if (node && GTK_CTREE_ROW (node)->row.selectable) {
g_signal_emit_by_name(G_OBJECT(sctree), "tree_select_row",
node, -1);
}
node = node->next;
}
// gtk_clist_select_row (GTK_CLIST (sctree), i, -1);
sctree->selecting_range = FALSE;
gtk_clist_select_row (GTK_CLIST (sctree), max, -1);
@ -341,8 +360,9 @@ gtk_sctree_button_press (GtkWidget *widget, GdkEventButton *event)
sctree->dnd_select_pending = TRUE;
sctree->dnd_select_pending_state = event->state;
sctree->dnd_select_pending_row = row;
} else
} else {
select_row (sctree, row, col, event->state);
}
} else {
sctree->selecting_range = TRUE;
gtk_clist_unselect_all (clist);
@ -1758,3 +1778,87 @@ gtk_sctree_insert_gnode (GtkCTree *ctree,
return cnode;
}
static void
sreal_tree_move (GtkCTree *ctree,
GtkCTreeNode *node,
GtkCTreeNode *new_parent,
GtkCTreeNode *new_sibling)
{
GtkCList *clist;
GtkCTreeNode *work;
gboolean visible = FALSE;
g_return_if_fail (ctree != NULL);
g_return_if_fail (node != NULL);
g_return_if_fail (!new_sibling ||
GTK_CTREE_ROW (new_sibling)->parent == new_parent);
if (new_parent && GTK_CTREE_ROW (new_parent)->is_leaf)
return;
/* new_parent != child of child */
for (work = new_parent; work; work = GTK_CTREE_ROW (work)->parent)
if (work == node)
return;
clist = GTK_CLIST (ctree);
visible = gtk_ctree_is_viewable (ctree, node);
if (clist->selection_mode == GTK_SELECTION_MULTIPLE)
{
GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
g_list_free (clist->undo_selection);
g_list_free (clist->undo_unselection);
clist->undo_selection = NULL;
clist->undo_unselection = NULL;
}
if (GTK_CLIST_AUTO_SORT (clist))
{
if (new_parent == GTK_CTREE_ROW (node)->parent)
return;
if (new_parent)
new_sibling = GTK_CTREE_ROW (new_parent)->children;
else
new_sibling = GTK_CTREE_NODE (clist->row_list);
while (new_sibling && clist->compare
(clist, GTK_CTREE_ROW (node), GTK_CTREE_ROW (new_sibling)) > 0)
new_sibling = GTK_CTREE_ROW (new_sibling)->sibling;
}
if (new_parent == GTK_CTREE_ROW (node)->parent &&
new_sibling == GTK_CTREE_ROW (node)->sibling)
return;
gtk_clist_freeze (clist);
work = NULL;
if (!GTK_SCTREE(ctree)->sorting && gtk_ctree_is_viewable (ctree, node))
work = GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row));
gtk_sctree_unlink (ctree, node, FALSE);
gtk_sctree_link (ctree, node, new_parent, new_sibling, FALSE);
if (!GTK_SCTREE(ctree)->sorting && work)
{
while (work && !gtk_ctree_is_viewable (ctree, work))
work = GTK_CTREE_ROW (work)->parent;
clist->focus_row = g_list_position (clist->row_list, (GList *)work);
clist->undo_anchor = clist->focus_row;
}
if (clist->column[ctree->tree_column].auto_resize &&
!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist) &&
(visible || gtk_ctree_is_viewable (ctree, node)))
gtk_clist_set_column_width
(clist, ctree->tree_column,
gtk_clist_optimal_column_width (clist, ctree->tree_column));
gtk_clist_thaw (clist);
}

View file

@ -43,6 +43,7 @@
#include "procheader.h"
#include "utils.h"
#include "codeconv.h"
#include "gtkutils.h"
/* Define possible missing constants for Windows. */
#ifdef G_OS_WIN32
@ -456,6 +457,8 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
MsgInfo *msginfo = NULL;
gboolean remove_special_headers = FALSE;
MsgInfoList *cur = NULL;
gint curnum = 0, total = 0;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
@ -488,6 +491,11 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
prefs = dest->prefs;
if (MSG_IS_MOVE(msginfo->flags))
statusbar_print_all(_("Moving messages..."));
else
statusbar_print_all(_("Copying messages..."));
total = g_slist_length(msglist);
for (cur = msglist; cur; cur = cur->next) {
msginfo = (MsgInfo *)cur->data;
if (!msginfo)
@ -499,6 +507,11 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
continue;
}
statusbar_progress_all(curnum, total, 100);
if (curnum % 100 == 0)
GTK_EVENTS_FLUSH();
curnum++;
debug_print("Copying message %s%c%d to %s ...\n",
msginfo->folder->path, G_DIR_SEPARATOR,
msginfo->msgnum, dest->path);
@ -538,6 +551,9 @@ static gint mh_copy_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist,
if (!dest_need_scan)
dest->mtime = time(NULL);
statusbar_progress_all(0,0,0);
statusbar_pop_all();
return dest->last_num;
}

View file

@ -358,15 +358,16 @@ next_folder:
}
if (!dest) {
dest = msginfo->to_folder;
movelist = g_slist_append(movelist, msginfo);
movelist = g_slist_prepend(movelist, msginfo);
} else if (dest == msginfo->to_folder) {
movelist = g_slist_append(movelist, msginfo);
movelist = g_slist_prepend(movelist, msginfo);
} else {
continue;
}
procmsg_msginfo_set_to_folder(msginfo, NULL);
}
if (movelist) {
movelist = g_slist_reverse(movelist);
retval |= folder_item_move_msgs(dest, movelist);
g_slist_free(movelist);
movelist = NULL;
@ -401,15 +402,16 @@ next_folder:
}
if (!dest) {
dest = msginfo->to_folder;
copylist = g_slist_append(copylist, msginfo);
copylist = g_slist_prepend(copylist, msginfo);
} else if (dest == msginfo->to_folder) {
copylist = g_slist_append(copylist, msginfo);
copylist = g_slist_prepend(copylist, msginfo);
} else {
continue;
}
procmsg_msginfo_set_to_folder(msginfo, NULL);
}
if (copylist) {
copylist = g_slist_reverse(copylist);
folder_item_copy_msgs(dest, copylist);
g_slist_free(copylist);
copylist = NULL;
@ -1773,11 +1775,6 @@ void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgT
folder_item_change_msg_flags(msginfo->folder, msginfo, perm_flags_new);
update_folder_msg_counts(item, msginfo, perm_flags_old);
msginfo_update.msginfo = msginfo;
msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
}
/* Tmp flags hanlding */

View file

@ -498,6 +498,8 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
gtk_clist_freeze(GTK_CLIST(summaryview->ctree)); \
folder_item_update_freeze(); \
inc_lock(); \
hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, \
summaryview->msginfo_update_callback_id); \
}
#define END_LONG_OPERATION(summaryview) { \
inc_unlock(); \
@ -505,6 +507,9 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
gtk_clist_thaw(GTK_CLIST(summaryview->ctree)); \
main_window_cursor_normal(summaryview->mainwin); \
summary_unlock(summaryview); \
summaryview->msginfo_update_callback_id = \
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, \
summary_update_msg, (gpointer) summaryview); \
}
SummaryView *summary_create(void)
@ -1698,7 +1703,6 @@ void summary_select_node(SummaryView *summaryview, GtkCTreeNode *node,
gboolean display_msg, gboolean do_refresh)
{
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
if (summary_is_locked(summaryview))
return;
if (!summaryview->folder_item)
@ -2715,7 +2719,6 @@ static void msginfo_mark_as_read (SummaryView *summaryview, MsgInfo *msginfo,
summary_msginfo_unset_flags
(msginfo, MSG_NEW | MSG_UNREAD, 0);
summary_set_row_marks(summaryview, row);
gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
summary_status_show(summaryview);
}
}
@ -2748,21 +2751,19 @@ static void summary_display_msg_full(SummaryView *summaryview,
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
MsgInfo *msginfo;
gint val;
START_TIMING("summary_display_msg_full");
if (!new_window) {
if (summaryview->displayed == row)
return;
else
summaryview->messageview->filtered = FALSE;
}
g_return_if_fail(row != NULL);
if (summary_is_locked(summaryview)) return;
summary_lock(summaryview);
STATUSBAR_POP(summaryview->mainwin);
GTK_EVENTS_FLUSH();
msginfo = gtk_ctree_node_get_row_data(ctree, row);
@ -2807,6 +2808,7 @@ static void summary_display_msg_full(SummaryView *summaryview,
messageview_set_menu_sensitive(summaryview->messageview);
summary_unlock(summaryview);
END_TIMING();
}
void summary_display_msg_selected(SummaryView *summaryview,
@ -3161,7 +3163,8 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
msginfo->msgnum);
}
void summary_mark_as_read(SummaryView *summaryview)
void summary_mark_as_read
(SummaryView *summaryview)
{
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
@ -3273,6 +3276,7 @@ void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *wid
} else {
summary_msginfo_unset_flags(msginfo, MSG_SPAM, 0);
}
summary_set_row_marks(summaryview, row);
}
} else {
log_error(_("An error happened while learning.\n"));
@ -3604,7 +3608,7 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
return;
}
START_LONG_OPERATION(summaryview);
START_LONG_OPERATION(summaryview);
for (cur = GTK_CLIST(summaryview->ctree)->selection;
cur != NULL && cur->data != NULL; cur = cur->next)
@ -3954,8 +3958,18 @@ gboolean summary_execute(SummaryView *summaryview)
summaryview->displayed = NULL;
}
if (GTK_CTREE_ROW(node)->children != NULL) {
g_warning("summary_execute(): children != NULL\n");
continue;
next = NULL;
if (GTK_CTREE_ROW(node)->sibling) {
next = GTK_CTREE_ROW(node)->sibling;
} else {
GtkCTreeRow *parent = NULL;
for (parent = GTK_CTREE_ROW(node)->parent; parent != NULL;
parent = GTK_CTREE_ROW(parent)->parent) {
if (GTK_CTREE_ROW(parent)->sibling) {
next = GTK_CTREE_ROW(parent)->sibling;
}
}
}
}
if (!new_selected &&
@ -4022,7 +4036,12 @@ static gint summary_execute_move(SummaryView *summaryview)
summaryview);
if (summaryview->mlist) {
hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
summaryview->msginfo_update_callback_id);
val = procmsg_move_messages(summaryview->mlist);
summaryview->msginfo_update_callback_id =
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST,
summary_update_msg, (gpointer) summaryview);
for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
procmsg_msginfo_free((MsgInfo *)cur->data);
@ -4059,6 +4078,8 @@ static void summary_execute_copy(SummaryView *summaryview)
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
/* search copying messages and execute */
hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
summaryview->msginfo_update_callback_id);
gtk_ctree_pre_recursive(ctree, NULL, summary_execute_copy_func,
summaryview);
@ -4069,6 +4090,9 @@ static void summary_execute_copy(SummaryView *summaryview)
g_slist_free(summaryview->mlist);
summaryview->mlist = NULL;
}
summaryview->msginfo_update_callback_id =
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST,
summary_update_msg, (gpointer) summaryview);
}
static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
@ -4240,7 +4264,7 @@ static void summary_unthread_for_exec(SummaryView *summaryview)
for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
summary_unthread_for_exec_func(ctree, node, NULL);
summary_unthread_for_exec_func(ctree, node, summaryview);
}
END_LONG_OPERATION(summaryview);
@ -4255,7 +4279,7 @@ static void summary_unthread_for_exec_func(GtkCTree *ctree, GtkCTreeNode *node,
GtkCTreeNode *top_parent;
GtkCTreeNode *child;
GtkCTreeNode *sibling;
SummaryView * summaryview = (SummaryView *)data;
msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
if (!msginfo ||
@ -4271,13 +4295,30 @@ static void summary_unthread_for_exec_func(GtkCTree *ctree, GtkCTreeNode *node,
;
sibling = GTK_CTREE_ROW(top_parent)->sibling;
GTK_SCTREE(ctree)->sorting = TRUE;
while (child != NULL) {
GtkCTreeNode *next_child;
MsgInfo *cinfo = GTKUT_CTREE_NODE_GET_ROW_DATA(child);
next_child = GTK_CTREE_ROW(child)->sibling;
gtk_ctree_move(ctree, child, NULL, sibling);
if (!MSG_IS_MOVE(cinfo->flags) && !MSG_IS_DELETED(cinfo->flags)) {
gtk_ctree_move(ctree, child,
NULL,
sibling);
} else {
if (child == summaryview->displayed) {
messageview_clear(summaryview->messageview);
summaryview->displayed = NULL;
}
if (child == summaryview->selected) {
messageview_clear(summaryview->messageview);
summaryview->selected = NULL;
}
}
child = next_child;
}
GTK_SCTREE(ctree)->sorting = FALSE;
}
void summary_expand_threads(SummaryView *summaryview)
@ -4504,6 +4545,7 @@ static void summary_set_row_colorlabel(SummaryView *summaryview, GtkCTreeNode *r
summary_msginfo_change_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0,
MSG_CLABEL_FLAG_MASK, 0);
summary_set_row_marks(summaryview, row);
}
void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
@ -5877,6 +5919,9 @@ static gboolean summary_update_msg(gpointer source, gpointer data)
g_return_val_if_fail(msginfo_update != NULL, TRUE);
g_return_val_if_fail(summaryview != NULL, FALSE);
if (msginfo_update->msginfo->folder != summaryview->folder_item)
return FALSE;
if (msginfo_update->flags & MSGINFO_UPDATE_FLAGS) {
node = gtk_ctree_find_by_row_data(
GTK_CTREE(summaryview->ctree), NULL,