]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreedatalist.c
added compile time switch to put the tree views into a hpaned for owen to
[~andy/gtk] / gtk / gtktreedatalist.c
index 81d6332e6f3c029d367f69772b18d8ae03920334..a1007c355ab962dd8dc53d3786c41acdd6cb2357 100644 (file)
@@ -39,6 +39,7 @@ _gtk_tree_data_list_alloc (void)
                                  G_ALLOC_AND_FREE);
 
   list = g_chunk_new (GtkTreeDataList, tree_chunk);
+  memset (list, 0, sizeof (GtkTreeDataList));
 
   return list;
 }
@@ -57,9 +58,9 @@ _gtk_tree_data_list_free (GtkTreeDataList *list,
       next = tmp->next;
       if (g_type_is_a (column_headers [i], G_TYPE_STRING))
        g_free ((gchar *) tmp->data.v_pointer);
-      else if (g_type_is_a (column_headers [i], G_TYPE_OBJECT))
+      else if (g_type_is_a (column_headers [i], G_TYPE_OBJECT) && tmp->data.v_pointer != NULL)
        g_object_unref (G_OBJECT (tmp->data.v_pointer));
-      else if (g_type_is_a (column_headers [i], G_TYPE_BOXED))
+      else if (g_type_is_a (column_headers [i], G_TYPE_BOXED) && tmp->data.v_pointer != NULL)
        g_boxed_free (column_headers [i], (gpointer) tmp->data.v_pointer);
 
       g_mem_chunk_free (tree_chunk, tmp);
@@ -195,12 +196,18 @@ _gtk_tree_data_list_value_to_node (GtkTreeDataList *list,
       list->data.v_double = g_value_get_double (value);
       break;
     case G_TYPE_STRING:
+      if (list->data.v_pointer)
+       g_free (list->data.v_pointer);
       list->data.v_pointer = g_value_dup_string (value);
       break;
     case G_TYPE_OBJECT:
+      if (list->data.v_pointer)
+       g_object_unref (list->data.v_pointer);
       list->data.v_pointer = g_value_dup_object (value);
       break;
     case G_TYPE_BOXED:
+      if (list->data.v_pointer)
+       g_boxed_free (G_VALUE_TYPE (value), list->data.v_pointer);
       list->data.v_pointer = g_value_dup_boxed (value);
       break;
     default:
@@ -265,7 +272,7 @@ gtk_tree_data_list_compare_func (GtkTreeModel *model,
   GValue a_value = {0, };
   GValue b_value = {0, };
   gint retval;
-  gchar *stra, *strb;
+  const gchar *stra, *strb;
 
   gtk_tree_model_get_value (model, a, column, &a_value);
   gtk_tree_model_get_value (model, b, column, &b_value);
@@ -273,32 +280,78 @@ gtk_tree_data_list_compare_func (GtkTreeModel *model,
   switch (G_TYPE_FUNDAMENTAL (type))
     {
     case G_TYPE_BOOLEAN:
-      retval = (g_value_get_int (&a_value) < g_value_get_int (&b_value));
+      if (g_value_get_int (&a_value) < g_value_get_int (&b_value))
+       retval = -1;
+      else if (g_value_get_int (&a_value) == g_value_get_int (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_CHAR:
-      retval = (g_value_get_char (&a_value) < g_value_get_char (&b_value));
+      if (g_value_get_char (&a_value) < g_value_get_char (&b_value))
+       retval = -1;
+      else if (g_value_get_char (&a_value) == g_value_get_char (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_UCHAR:
-      retval = (g_value_get_uchar (&a_value) < g_value_get_uchar (&b_value));
+      if (g_value_get_uchar (&a_value) < g_value_get_uchar (&b_value))
+       retval = -1;
+      else if (g_value_get_uchar (&a_value) == g_value_get_uchar (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_INT:
-      retval = (g_value_get_int (&a_value) < g_value_get_int (&b_value));
+      if (g_value_get_int (&a_value) < g_value_get_int (&b_value))
+       retval = -1;
+      else if (g_value_get_int (&a_value) == g_value_get_int (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_UINT:
-      retval = (g_value_get_uint (&a_value) < g_value_get_uint (&b_value));
+      if (g_value_get_uint (&a_value) < g_value_get_uint (&b_value))
+       retval = -1;
+      else if (g_value_get_uint (&a_value) == g_value_get_uint (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_ENUM:
       /* this is somewhat bogus. */
-      retval = (g_value_get_int (&a_value) < g_value_get_int (&b_value));
+      if (g_value_get_int (&a_value) < g_value_get_int (&b_value))
+       retval = -1;
+      else if (g_value_get_int (&a_value) == g_value_get_int (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_FLAGS:
-      retval = (g_value_get_uint (&a_value) < g_value_get_uint (&b_value));
+      /* this is even more bogus. */
+      if (g_value_get_uint (&a_value) < g_value_get_uint (&b_value))
+       retval = -1;
+      else if (g_value_get_uint (&a_value) == g_value_get_uint (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_FLOAT:
-      retval = (g_value_get_float (&a_value) < g_value_get_float (&b_value));
+      if (g_value_get_float (&a_value) < g_value_get_float (&b_value))
+       retval = -1;
+      else if (g_value_get_float (&a_value) == g_value_get_float (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_DOUBLE:
-      retval = (g_value_get_double (&a_value) < g_value_get_double (&b_value));
+      if (g_value_get_double (&a_value) < g_value_get_double (&b_value))
+       retval = -1;
+      else if (g_value_get_double (&a_value) == g_value_get_double (&b_value))
+       retval = 0;
+      else
+       retval = 1;
       break;
     case G_TYPE_STRING:
       stra = g_value_get_string (&a_value);
@@ -356,7 +409,12 @@ _gtk_tree_data_list_header_free (GList *list)
       GtkTreeDataSortHeader *header = (GtkTreeDataSortHeader *) tmp->data;
 
       if (header->destroy)
-       (* header->destroy) (header->data);
+       {
+         GtkDestroyNotify d = header->destroy;
+
+         header->destroy = NULL;
+         d (header->data);
+       }
 
       g_free (header);
     }