liststore: fix transformation of GValues on set
authorCosimo Cecchi <cosimoc@gnome.org>
Thu, 7 Jun 2012 20:01:02 +0000 (16:01 -0400)
committerCosimo Cecchi <cosimoc@gnome.org>
Thu, 7 Jun 2012 20:47:11 +0000 (16:47 -0400)
There are three bugs here:
- we should check if the value type is transformable instead of being
  compatible, since that's all we care about in order to call
  g_value_transform()
- the check is only meaningful in the direction
  passed-in-type->column-type and not viceversa
- we should init the destination GValue to the column type before
  calling g_value_transform on it, or the destination type information
  will be missing and the method will fail

Thanks to Jasper St. Pierre and Colin Walters for all the help in
tracking this down.

https://bugzilla.gnome.org/show_bug.cgi?id=677649

gtk/gtkliststore.c

index 763d1e1f8c3f982d11a40e17bf477d4aad171b33..2d99d5f36c7e25132d2680d6bdb97f70d98230b8 100644 (file)
@@ -842,8 +842,7 @@ gtk_list_store_real_set_value (GtkListStore *list_store,
 
   if (! g_type_is_a (G_VALUE_TYPE (value), priv->column_headers[column]))
     {
-      if (! (g_value_type_compatible (G_VALUE_TYPE (value), priv->column_headers[column]) &&
-            g_value_type_compatible (priv->column_headers[column], G_VALUE_TYPE (value))))
+      if (! (g_value_type_transformable (G_VALUE_TYPE (value), priv->column_headers[column])))
        {
          g_warning ("%s: Unable to convert from %s to %s\n",
                     G_STRLOC,
@@ -851,6 +850,8 @@ gtk_list_store_real_set_value (GtkListStore *list_store,
                     g_type_name (priv->column_headers[column]));
          return retval;
        }
+
+      g_value_init (&real_value, priv->column_headers[column]);
       if (!g_value_transform (value, &real_value))
        {
          g_warning ("%s: Unable to make conversion from %s to %s\n",