[gtk+] Bug 565317 - Resulting image of GtkCellRendererPixbuf depends on order of set properties



commit ed33a20b29649eb728404808ed56a2bbbb38a925
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jun 15 21:10:34 2009 +0200

    Bug 565317 - Resulting image of GtkCellRendererPixbuf depends on order of set properties
    
    (gtk_cell_renderer_pixbuf_set_property): add back evil code that makes
    sure that the current image is only unset if the new image was created
    from the same property or the new property is not NULL.

 gtk/gtkcellrendererpixbuf.c |  155 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 117 insertions(+), 38 deletions(-)
---
diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c
index 0431295..c0ec609 100644
--- a/gtk/gtkcellrendererpixbuf.c
+++ b/gtk/gtkcellrendererpixbuf.c
@@ -284,39 +284,6 @@ gtk_cell_renderer_pixbuf_get_property (GObject        *object,
 }
 
 static void
-unset_image_properties (GtkCellRendererPixbuf *cell)
-{
-  GtkCellRendererPixbufPrivate *priv;
-
-  priv = GTK_CELL_RENDERER_PIXBUF_GET_PRIVATE (cell);
-
-  if (priv->stock_id)
-    {
-      g_free (priv->stock_id);
-      priv->stock_id = NULL;
-      g_object_notify (G_OBJECT (cell), "stock-id");
-    }
-  if (priv->icon_name)
-    {
-      g_free (priv->icon_name);
-      priv->icon_name = NULL;
-      g_object_notify (G_OBJECT (cell), "icon-name");
-    }
-  if (cell->pixbuf)
-    {
-      g_object_unref (cell->pixbuf);
-      cell->pixbuf = NULL;
-      g_object_notify (G_OBJECT (cell), "pixbuf");
-    }
-  if (priv->gicon)
-    {
-      g_object_unref (priv->gicon);
-      priv->gicon = NULL;
-      g_object_notify (G_OBJECT (cell), "gicon");
-    }
-}
-
-static void
 gtk_cell_renderer_pixbuf_set_property (GObject      *object,
 				       guint         param_id,
 				       const GValue *value,
@@ -330,8 +297,30 @@ gtk_cell_renderer_pixbuf_set_property (GObject      *object,
   switch (param_id)
     {
     case PROP_PIXBUF:
-      unset_image_properties (cellpixbuf);
-      cellpixbuf->pixbuf = (GdkPixbuf *) g_value_dup_object (value);
+      if (cellpixbuf->pixbuf)
+	g_object_unref (cellpixbuf->pixbuf);
+      cellpixbuf->pixbuf = (GdkPixbuf*) g_value_dup_object (value);
+      if (cellpixbuf->pixbuf)
+        {
+          if (priv->stock_id)
+            {
+              g_free (priv->stock_id);
+              priv->stock_id = NULL;
+              g_object_notify (object, "stock-id");
+            }
+          if (priv->icon_name)
+            {
+              g_free (priv->icon_name);
+              priv->icon_name = NULL;
+              g_object_notify (object, "icon-name");
+            }
+          if (priv->gicon)
+            {
+              g_object_unref (priv->gicon);
+              priv->gicon = NULL;
+              g_object_notify (object, "gicon");
+            }
+        }
       break;
     case PROP_PIXBUF_EXPANDER_OPEN:
       if (cellpixbuf->pixbuf_expander_open)
@@ -344,8 +333,38 @@ gtk_cell_renderer_pixbuf_set_property (GObject      *object,
       cellpixbuf->pixbuf_expander_closed = (GdkPixbuf*) g_value_dup_object (value);
       break;
     case PROP_STOCK_ID:
-      unset_image_properties (cellpixbuf);
+      if (priv->stock_id)
+        {
+          if (cellpixbuf->pixbuf)
+            {
+              g_object_unref (cellpixbuf->pixbuf);
+              cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+            }
+          g_free (priv->stock_id);
+        }
       priv->stock_id = g_value_dup_string (value);
+      if (priv->stock_id)
+        {
+          if (cellpixbuf->pixbuf)
+            {
+              g_object_unref (cellpixbuf->pixbuf);
+              cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+            }
+          if (priv->icon_name)
+            {
+              g_free (priv->icon_name);
+              priv->icon_name = NULL;
+              g_object_notify (object, "icon-name");
+            }
+          if (priv->gicon)
+            {
+              g_object_unref (priv->gicon);
+              priv->gicon = NULL;
+              g_object_notify (object, "gicon");
+            }
+        }
       break;
     case PROP_STOCK_SIZE:
       priv->stock_size = g_value_get_uint (value);
@@ -355,15 +374,75 @@ gtk_cell_renderer_pixbuf_set_property (GObject      *object,
       priv->stock_detail = g_value_dup_string (value);
       break;
     case PROP_ICON_NAME:
-      unset_image_properties (cellpixbuf);
+      if (priv->icon_name)
+	{
+	  if (cellpixbuf->pixbuf)
+	    {
+	      g_object_unref (cellpixbuf->pixbuf);
+	      cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+	    }
+	  g_free (priv->icon_name);
+	}
       priv->icon_name = g_value_dup_string (value);
+      if (priv->icon_name)
+        {
+	  if (cellpixbuf->pixbuf)
+	    {
+              g_object_unref (cellpixbuf->pixbuf);
+              cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+	    }
+          if (priv->stock_id)
+            {
+              g_free (priv->stock_id);
+              priv->stock_id = NULL;
+              g_object_notify (object, "stock-id");
+            }
+          if (priv->gicon)
+            {
+              g_object_unref (priv->gicon);
+              priv->gicon = NULL;
+              g_object_notify (object, "gicon");
+            }
+        }
       break;
     case PROP_FOLLOW_STATE:
       priv->follow_state = g_value_get_boolean (value);
       break;
     case PROP_GICON:
-      unset_image_properties (cellpixbuf);
+      if (priv->gicon)
+	{
+	  if (cellpixbuf->pixbuf)
+	    {
+	      g_object_unref (cellpixbuf->pixbuf);
+	      cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+	    }
+	  g_object_unref (priv->gicon);
+	}
       priv->gicon = (GIcon *) g_value_dup_object (value);
+      if (priv->gicon)
+        {
+	  if (cellpixbuf->pixbuf)
+	    {
+              g_object_unref (cellpixbuf->pixbuf);
+              cellpixbuf->pixbuf = NULL;
+              g_object_notify (object, "pixbuf");
+	    }
+          if (priv->stock_id)
+            {
+              g_free (priv->stock_id);
+              priv->stock_id = NULL;
+              g_object_notify (object, "stock-id");
+            }
+          if (priv->icon_name)
+            {
+              g_free (priv->icon_name);
+              priv->icon_name = NULL;
+              g_object_notify (object, "icon-name");
+            }
+        }
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]