G_ALLOC_AND_FREE);
list = g_chunk_new (GtkTreeDataList, tree_chunk);
+ memset (list, 0, sizeof (GtkTreeDataList));
return 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);
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:
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);
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);
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);
}