talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit e06e674b0931a7d9245c2472051b4d7ba88fc610
parent 0d2e06c831f51ef7e7dd58b497897855a2cd2108
Author: Colin Leroy <colin@colino.net>
Date:   Wed,  3 Dec 2008 21:57:08 +0000

2008-12-03 [colin]	3.6.1cvs59

	* src/msgcache.c
		Speed up cache reading (about 10% gain)
	* src/summaryview.c
	* src/gtk/gtksctree.c
		Speed up expand/collapse all threads
		(about 95% gain)

Diffstat:
MChangeLog | 9+++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/gtk/gtksctree.c | 235+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/msgcache.c | 3+--
Msrc/summaryview.c | 23++++++++++++++++++++++-
6 files changed, 209 insertions(+), 64 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,12 @@ +2008-12-03 [colin] 3.6.1cvs59 + + * src/msgcache.c + Speed up cache reading (about 10% gain) + * src/summaryview.c + * src/gtk/gtksctree.c + Speed up expand/collapse all threads + (about 95% gain) + 2008-12-03 [paul] 3.6.1cvs58 * configure.ac diff --git a/PATCHSETS b/PATCHSETS @@ -3640,3 +3640,4 @@ ( cvs diff -u -r 1.1.2.39 -r 1.1.2.40 src/plugins/pgpinline/pgpinline.c; ) > 3.6.1cvs56.patchset ( cvs diff -u -r 1.1.2.6 -r 1.1.2.7 src/gtk/gtkcmclist.c; ) > 3.6.1cvs57.patchset ( cvs diff -u -r 1.654.2.3704 -r 1.654.2.3705 configure.ac; ) > 3.6.1cvs58.patchset +( cvs diff -u -r 1.16.2.62 -r 1.16.2.63 src/msgcache.c; cvs diff -u -r 1.395.2.401 -r 1.395.2.402 src/summaryview.c; cvs diff -u -r 1.1.4.51 -r 1.1.4.52 src/gtk/gtksctree.c; ) > 3.6.1cvs59.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=6 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=58 +EXTRA_VERSION=59 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/gtk/gtksctree.c b/src/gtk/gtksctree.c @@ -85,7 +85,6 @@ static void gtk_sctree_drag_data_received (GtkWidget *widget, GdkDragContext *co static void gtk_sctree_clear (GtkCMCList *clist); static void gtk_sctree_real_unselect_all (GtkCMCList *clist); -static void gtk_sctree_collapse (GtkCMCTree *ctree, GtkCMCTreeNode *node); static void stree_sort (GtkCMCTree *ctree, GtkCMCTreeNode *node, gpointer data); void gtk_sctree_sort_node (GtkCMCTree *ctree, GtkCMCTreeNode *node); @@ -109,6 +108,8 @@ static GtkCMCTreeNode * gtk_sctree_last_visible (GtkCMCTree *ctree, GtkCMCTreeNode *node); static void gtk_sctree_real_tree_expand (GtkCMCTree *ctree, GtkCMCTreeNode *node); +static void gtk_sctree_real_tree_collapse (GtkCMCTree *ctree, + GtkCMCTreeNode *node); static void sreal_tree_move (GtkCMCTree *ctree, GtkCMCTreeNode *node, @@ -1403,7 +1404,7 @@ gtk_sctree_class_init (GtkSCTreeClass *klass) clist_class->clear = gtk_sctree_clear; clist_class->draw_row = gtk_sctree_draw_row; clist_class->unselect_all = gtk_sctree_real_unselect_all; - ctree_class->tree_collapse = gtk_sctree_collapse; + ctree_class->tree_collapse = gtk_sctree_real_tree_collapse; ctree_class->tree_expand = gtk_sctree_real_tree_expand; ctree_class->tree_move = sreal_tree_move; ctree_class->change_focus_row_expansion = gtk_sctree_change_focus_row_expansion; @@ -1938,20 +1939,183 @@ gtk_sctree_real_unselect_all (GtkCMCList *clist) } } -/* Our handler for the change_focus_row_expansion signal of the ctree. - We have to set the anchor to parent visible node. - */ +static void +gtk_sctree_column_auto_resize (GtkCMCList *clist, + GtkCMCListRow *clist_row, + gint column, + gint old_width) +{ + /* resize column if needed for auto_resize */ + GtkRequisition requisition; + + if (!clist->column[column].auto_resize || + GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) + return; + + if (clist_row) + GTK_CMCLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, + column, &requisition); + else + requisition.width = 0; + + if (requisition.width > clist->column[column].width) + gtk_cmclist_set_column_width (clist, column, requisition.width); + else if (requisition.width < old_width && + old_width == clist->column[column].width) + { + GList *list; + gint new_width; + + /* run a "gtk_cmclist_optimal_column_width" but break, if + * the column doesn't shrink */ + if (GTK_CMCLIST_SHOW_TITLES (clist) && clist->column[column].button) + new_width = (clist->column[column].button->requisition.width - + (CELL_SPACING + (2 * COLUMN_INSET))); + else + new_width = 0; + + for (list = clist->row_list; list; list = list->next) + { + GTK_CMCLIST_GET_CLASS (clist)->cell_size_request + (clist, GTK_CMCLIST_ROW (list), column, &requisition); + new_width = MAX (new_width, requisition.width); + if (new_width == clist->column[column].width) + break; + } + if (new_width < clist->column[column].width) + gtk_cmclist_set_column_width (clist, column, new_width); + } +} + +static void +gtk_sctree_auto_resize_columns (GtkCMCList *clist) +{ + gint i; + + if (GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) + return; + + for (i = 0; i < clist->columns; i++) + gtk_sctree_column_auto_resize (clist, NULL, i, clist->column[i].width); +} + static void -gtk_sctree_collapse (GtkCMCTree *ctree, GtkCMCTreeNode *node) +gtk_sctree_real_tree_collapse (GtkCMCTree *ctree, + GtkCMCTreeNode *node) { - g_return_if_fail (ctree != NULL); - g_return_if_fail (GTK_IS_SCTREE (ctree)); + GtkCMCList *clist; + GtkCMCTreeNode *work; + GtkRequisition requisition; + gboolean visible; + gint level; + + g_return_if_fail (GTK_IS_CMCTREE (ctree)); + + if (!node || !GTK_CMCTREE_ROW (node)->expanded || + GTK_CMCTREE_ROW (node)->is_leaf) + return; + + clist = GTK_CMCLIST (ctree); + + GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); + + GTK_CMCTREE_ROW (node)->expanded = FALSE; + level = GTK_CMCTREE_ROW (node)->level; + + visible = gtk_cmctree_is_viewable (ctree, node); + /* get cell width if tree_column is auto resized */ + if (visible && clist->column[ctree->tree_column].auto_resize && + !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) + GTK_CMCLIST_GET_CLASS (clist)->cell_size_request + (clist, &GTK_CMCTREE_ROW (node)->row, ctree->tree_column, &requisition); + + /* unref/unset opened pixmap */ + if (GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap) + { + g_object_unref + (GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap); + + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = NULL; + + if (GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask) + { + g_object_unref + (GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask); + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = NULL; + } + } - (* parent_class->tree_collapse) (ctree, node); - GTK_SCTREE(ctree)->anchor_row = - gtk_cmctree_node_nth(ctree, GTK_CMCLIST(ctree)->focus_row); + /* set/ref closed pixmap */ + if (GTK_CMCTREE_ROW (node)->pixmap_closed) + { + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = + g_object_ref (GTK_CMCTREE_ROW (node)->pixmap_closed); + + if (GTK_CMCTREE_ROW (node)->mask_closed) + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = + g_object_ref (GTK_CMCTREE_ROW (node)->mask_closed); + } + + work = GTK_CMCTREE_ROW (node)->children; + if (work) + { + gint tmp = 0; + gint row; + GList *list; + + while (work && GTK_CMCTREE_ROW (work)->level > level) + { + work = GTK_CMCTREE_NODE_NEXT (work); + tmp++; + } + + if (work) + { + list = (GList *)node; + list->next = (GList *)work; + list = (GList *)GTK_CMCTREE_NODE_PREV (work); + list->next = NULL; + list = (GList *)work; + list->prev = (GList *)node; + } + else + { + list = (GList *)node; + list->next = NULL; + clist->row_list_end = (GList *)node; + } + + if (visible) + { + /* resize auto_resize columns if needed */ + gtk_sctree_auto_resize_columns (clist); + + if (!GTK_SCTREE(clist)->sorting) { + row = g_list_position (clist->row_list, (GList *)node); + if (row < clist->focus_row) + clist->focus_row -= tmp; + } + clist->rows -= tmp; + CLIST_REFRESH (clist); + } + } + else if (visible && clist->column[ctree->tree_column].auto_resize && + !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) + /* resize tree_column if needed */ + gtk_sctree_column_auto_resize (clist, &GTK_CMCTREE_ROW (node)->row, ctree->tree_column, + requisition.width); + } + GtkWidget *gtk_sctree_new_with_titles (gint columns, gint tree_column, gchar *titles[]) { @@ -2814,55 +2978,6 @@ stree_delete_row (GtkCMCTree *ctree, g_list_free_1 ((GList *)node); } -static void -gtk_sctree_column_auto_resize (GtkCMCList *clist, - GtkCMCListRow *clist_row, - gint column, - gint old_width) -{ - /* resize column if needed for auto_resize */ - GtkRequisition requisition; - - if (!clist->column[column].auto_resize || - GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) - return; - - if (clist_row) - GTK_CMCLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - else - requisition.width = 0; - - if (requisition.width > clist->column[column].width) - gtk_cmclist_set_column_width (clist, column, requisition.width); - else if (requisition.width < old_width && - old_width == clist->column[column].width) - { - GList *list; - gint new_width; - - /* run a "gtk_cmclist_optimal_column_width" but break, if - * the column doesn't shrink */ - if (GTK_CMCLIST_SHOW_TITLES (clist) && clist->column[column].button) - new_width = (clist->column[column].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET))); - else - new_width = 0; - - for (list = clist->row_list; list; list = list->next) - { - GTK_CMCLIST_GET_CLASS (clist)->cell_size_request - (clist, GTK_CMCLIST_ROW (list), column, &requisition); - new_width = MAX (new_width, requisition.width); - if (new_width == clist->column[column].width) - break; - } - if (new_width < clist->column[column].width) - gtk_cmclist_set_column_width (clist, column, new_width); - } -} - - static void gtk_sctree_real_tree_expand (GtkCMCTree *ctree, GtkCMCTreeNode *node) diff --git a/src/msgcache.c b/src/msgcache.c @@ -520,8 +520,7 @@ static gint msgcache_get_cache_data_str(gchar *src, gchar **str, gint len, return -1; } - strncpy(tmpstr, src, len); - + memcpy(tmpstr, src, len); tmpstr[len] = 0; if (conv != NULL) { diff --git a/src/summaryview.c b/src/summaryview.c @@ -5144,10 +5144,12 @@ void summary_expand_threads(SummaryView *summaryview) { GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); GtkCMCTreeNode *node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); + GtkCMCTreeNode *focus_node = GTK_CMCTREE_NODE (g_list_nth (GTK_CMCLIST(ctree)->row_list, GTK_CMCLIST(ctree)->focus_row)); g_signal_handlers_block_by_func(G_OBJECT(ctree), G_CALLBACK(summary_tree_expanded), summaryview); summary_freeze(summaryview); + GTK_SCTREE(ctree)->sorting = TRUE; while (node) { if (GTK_CMCTREE_ROW(node)->children) { @@ -5157,7 +5159,12 @@ void summary_expand_threads(SummaryView *summaryview) node = GTK_CMCTREE_NODE_NEXT(node); } + GTK_SCTREE(ctree)->sorting = FALSE; + if (focus_node) { + GTK_CMCLIST(ctree)->focus_row = g_list_position (GTK_CMCLIST(ctree)->row_list,(GList *)focus_node); + } summary_thaw(summaryview); + g_signal_handlers_unblock_by_func(G_OBJECT(ctree), G_CALLBACK(summary_tree_expanded), summaryview); @@ -5169,16 +5176,30 @@ void summary_expand_threads(SummaryView *summaryview) void summary_collapse_threads(SummaryView *summaryview) { GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); - GtkCMCTreeNode *node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); + GtkCMCTreeNode *node = NULL; + GtkCMCTreeNode *focus_node = GTK_CMCTREE_NODE (g_list_nth (GTK_CMCLIST(ctree)->row_list, GTK_CMCLIST(ctree)->focus_row)); summary_freeze(summaryview); + GTK_SCTREE(ctree)->sorting = TRUE; + node = focus_node; + while (node && GTK_CMCTREE_ROW(node)->parent) { + focus_node = node = GTK_CMCTREE_ROW(node)->parent; + } + gtk_sctree_select(GTK_SCTREE(ctree), focus_node); + node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); while (node) { if (GTK_CMCTREE_ROW(node)->children) gtk_cmctree_collapse(ctree, node); node = GTK_CMCTREE_ROW(node)->sibling; } + GTK_SCTREE(ctree)->sorting = FALSE; + if (focus_node) { + GTK_CMCLIST(ctree)->focus_row = g_list_position (GTK_CMCLIST(ctree)->row_list,(GList *)focus_node); + } + GTK_SCTREE(ctree)->anchor_row = + gtk_cmctree_node_nth(ctree, GTK_CMCLIST(ctree)->focus_row); summary_thaw(summaryview); summaryview->thread_collapsed = TRUE;