2008-12-03 [colin] 3.6.1cvs59
authorColin Leroy <colin@colino.net>
Wed, 3 Dec 2008 21:57:08 +0000 (21:57 +0000)
committerColin Leroy <colin@colino.net>
Wed, 3 Dec 2008 21:57:08 +0000 (21:57 +0000)
* 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)

ChangeLog
PATCHSETS
configure.ac
src/gtk/gtksctree.c
src/msgcache.c
src/summaryview.c

index 9ecc1d8b81afe1461a1ef10b007dea2087935c56..67e7520af23e8b3681d4c3b3493e384ccf148c01 100644 (file)
--- 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
index 52e2f99a08b25a6e193d76abec738305238dc78e..d48f801959a1a206e895f560f32b217649edd031 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index b2b55d345714fa0ff15708e41d4bf03f36b0a513..6564ed1bf4ccb2c69ff719ed624b429376f10253 100644 (file)
@@ -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=
 
index 84d65e19df59a16c066358e38dba6c6736c4ffad..7705dc2edb4f0946bcc4ff6b512c167be0f429fb 100644 (file)
@@ -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)
index b3e1723afed20d09dbde32fb99d59185cb2bd172..7316c7f0f2da893e7795bb1d6f6e9359b212a316 100644 (file)
@@ -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) {
index d731d999f95d8f29e3363f346cf08d2ead8c20bc..89a67d9ddac51ecf4201f61bf3dd23aa38820e2e 100644 (file)
@@ -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;