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:
parent
35d520395e
commit
e8135a04cd
10 changed files with 250 additions and 43 deletions
23
ChangeLog
23
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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=
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
13
src/folder.c
13
src/folder.c
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
16
src/mh.c
16
src/mh.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue