[maemo-commits] [maemo-commits] r9083 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Jan 12 16:28:26 EET 2007
Author: kris
Date: 2007-01-12 16:28:24 +0200 (Fri, 12 Jan 2007)
New Revision: 9083

Modified:
   projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreemodelsort.c
Log:
2007-01-12  Kristian Rietveld  <kris at imendio.com>

	* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_changed),
	(gtk_tree_model_sort_ref_node), (gtk_tree_model_sort_real_unref_node),
	(gtk_tree_model_sort_sort_level), (gtk_tree_model_sort_free_level),
	(gtk_tree_model_sort_clear_cache): port over ref counting fixes
	found in maemo-gtk-2-6 and upstream trunk (but not in upstream
	2.10).



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-12 14:26:47 UTC (rev 9082)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-12 14:28:24 UTC (rev 9083)
@@ -1,3 +1,12 @@
+2007-01-12  Kristian Rietveld  <kris at imendio.com>
+
+	* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_changed),
+	(gtk_tree_model_sort_ref_node), (gtk_tree_model_sort_real_unref_node),
+	(gtk_tree_model_sort_sort_level), (gtk_tree_model_sort_free_level),
+	(gtk_tree_model_sort_clear_cache): port over ref counting fixes
+	found in maemo-gtk-2-6 and upstream trunk (but not in upstream
+	2.10).
+
 2007-01-12  Michael Natterer  <mitch at imendio.com>
 
 	* gtk/gtkentry.c (gtk_entry_button_press): don't add

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreemodelsort.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreemodelsort.c	2007-01-12 14:26:47 UTC (rev 9082)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtktreemodelsort.c	2007-01-12 14:28:24 UTC (rev 9083)
@@ -441,12 +441,11 @@
     }
 
   gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
+  gtk_tree_model_sort_ref_node (GTK_TREE_MODEL (data), &iter);
 
   level = iter.user_data;
   elt = iter.user_data2;
 
-  level->ref_count++;
-
   if (level->array->len < 2 ||
       (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
        tree_model_sort->default_sort_func == NO_SORT_FUNC))
@@ -455,11 +454,10 @@
 	gtk_tree_path_free (start_s_path);
 
       gtk_tree_model_row_changed (GTK_TREE_MODEL (data), path, &iter);
+      gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (data), &iter);
 
       gtk_tree_path_free (path);
 
-      level->ref_count--;
-
       return;
     }
   
@@ -565,11 +563,10 @@
       g_free (new_order);
     }
 
-  level->ref_count--;
-
   /* emit row_changed signal (at new location) */
   gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
   gtk_tree_model_row_changed (GTK_TREE_MODEL (data), path, &iter);
+  gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (data), &iter);
 
   gtk_tree_path_free (path);
   if (free_s_path)
@@ -1195,20 +1192,16 @@
       SortLevel *parent_level = level->parent_level;
       SortElt *parent_elt = level->parent_elt;
       /* We were at zero -- time to decrement the zero_ref_count val */
-      do
+      while (parent_level)
 	{
-	  if (parent_elt)
-	    parent_elt->zero_ref_count--;
-	  else
-	    tree_model_sort->zero_ref_count--;
+	  parent_elt->zero_ref_count--;
 
-	  if (parent_level)
-	    {
-	      parent_elt = parent_level->parent_elt;
-	      parent_level = parent_level->parent_level;
-	    }
+	  parent_elt = parent_level->parent_elt;
+	  parent_level = parent_level->parent_level;
 	}
-      while (parent_level);
+
+      if (tree_model_sort->root != level)
+	tree_model_sort->zero_ref_count--;
     }
 }
 
@@ -1253,7 +1246,9 @@
 	  parent_elt = parent_level->parent_elt;
 	  parent_level = parent_level->parent_level;
 	}
-      tree_model_sort->zero_ref_count++;
+
+      if (tree_model_sort->root != level)
+	tree_model_sort->zero_ref_count++;
     }
 }
 
@@ -1504,6 +1499,7 @@
 				gboolean          emit_reordered)
 {
   gint i;
+  gint ref_offset;
   GArray *sort_array;
   GArray *new_array;
   gint *new_order;
@@ -1518,8 +1514,13 @@
   if (level->array->len < 1 && !((SortElt *)level->array->data)->children)
     return;
 
-  level->ref_count++;
+  iter.stamp = tree_model_sort->stamp;
+  iter.user_data = level;
+  iter.user_data2 = &g_array_index (level->array, SortElt, 0);
 
+  gtk_tree_model_sort_ref_node (GTK_TREE_MODEL (tree_model_sort), &iter);
+  ref_offset = g_array_index (level->array, SortElt, 0).offset;
+
   /* Set up data */
   data.tree_model_sort = tree_model_sort;
   if (level->parent_elt)
@@ -1642,7 +1643,22 @@
 
   g_free (new_order);
 
-  level->ref_count--;
+  /* get the iter we referenced at the beginning of this function and
+   * unref it again
+   */
+  iter.stamp = tree_model_sort->stamp;
+  iter.user_data = level;
+
+  for (i = 0; i < level->array->len; i++)
+    {
+      if (g_array_index (level->array, SortElt, i).offset == ref_offset)
+        {
+	  iter.user_data2 = &g_array_index (level->array, SortElt, i);
+	  break;
+	}
+    }
+
+  gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (tree_model_sort), &iter);
 }
 
 static void
@@ -2232,32 +2248,28 @@
 
   g_assert (sort_level);
 
+  for (i = 0; i < sort_level->array->len; i++)
+    {
+      if (g_array_index (sort_level->array, SortElt, i).children)
+	gtk_tree_model_sort_free_level (tree_model_sort, 
+					SORT_LEVEL(g_array_index (sort_level->array, SortElt, i).children));
+    }
+
   if (sort_level->ref_count == 0)
     {
       SortLevel *parent_level = sort_level->parent_level;
       SortElt *parent_elt = sort_level->parent_elt;
 
-      do
+      while (parent_level)
 	{
-	  if (parent_elt)
-	    parent_elt->zero_ref_count--;
-	  else
-	    tree_model_sort->zero_ref_count--;
+	  parent_elt->zero_ref_count--;
 
-	  if (parent_level)
-	    {
-	      parent_elt = parent_level->parent_elt;
-	      parent_level = parent_level->parent_level;
-	    }
+	  parent_elt = parent_level->parent_elt;
+	  parent_level = parent_level->parent_level;
 	}
-      while (parent_level);
-    }
 
-  for (i = 0; i < sort_level->array->len; i++)
-    {
-      if (g_array_index (sort_level->array, SortElt, i).children)
-	gtk_tree_model_sort_free_level (tree_model_sort, 
-					SORT_LEVEL(g_array_index (sort_level->array, SortElt, i).children));
+      if (sort_level != tree_model_sort->root)
+	tree_model_sort->zero_ref_count--;
     }
 
   if (sort_level->parent_elt)
@@ -2349,7 +2361,7 @@
 {
   g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
 
-  if (tree_model_sort->zero_ref_count)
+  if (tree_model_sort->zero_ref_count > 0)
     gtk_tree_model_sort_clear_cache_helper (tree_model_sort, (SortLevel *)tree_model_sort->root);
 }
 


More information about the maemo-commits mailing list