[gtk+/combo-refactor: 50/201] Fixed GtkCellView to not clear the layout when disposing



commit a07ef6020d5189a79982b6ba1461d4b027599324
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Sat Nov 20 16:30:51 2010 +0900

    Fixed GtkCellView to not clear the layout when disposing
    
    The layout belongs the underlying area which may be shared across
    views and treemenus, let the cells be destroyed when the area is finally
    destroyed.

 gtk/gtkcellview.c |   37 +++++++++++++++++++++++++++++++++++--
 1 files changed, 35 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkcellview.c b/gtk/gtkcellview.c
index f4eb5ab..a628694 100644
--- a/gtk/gtkcellview.c
+++ b/gtk/gtkcellview.c
@@ -52,6 +52,8 @@ struct _GtkCellViewPrivate
 
   GdkRGBA              background;
   gboolean             background_set;
+
+  gulong               size_changed_id;
 };
 
 
@@ -133,6 +135,11 @@ static void       gtk_cell_view_get_preferred_height_for_width (GtkWidget
 								gint                  *minimum_size,
 								gint                  *natural_size);
 
+static void       context_size_changed_cb                      (GtkCellAreaContext   *context,
+								GParamSpec           *pspec,
+								GtkWidget            *view);
+
+
 static GtkBuildableIface *parent_buildable_iface;
 
 enum
@@ -308,6 +315,10 @@ gtk_cell_view_constructor (GType                  type,
   if (!priv->context)
     priv->context = gtk_cell_area_create_context (priv->area);
 
+  priv->size_changed_id = 
+    g_signal_connect (priv->context, "notify",
+		      G_CALLBACK (context_size_changed_cb), view);
+
   return object;
 }
 
@@ -442,8 +453,6 @@ gtk_cell_view_dispose (GObject *object)
 {
   GtkCellView *cellview = GTK_CELL_VIEW (object);
 
-  gtk_cell_view_cell_layout_clear (GTK_CELL_LAYOUT (cellview));
-
   if (cellview->priv->model)
     {
       g_object_unref (cellview->priv->model);
@@ -458,8 +467,11 @@ gtk_cell_view_dispose (GObject *object)
 
   if (cellview->priv->context)
     {
+      g_signal_handler_disconnect (cellview->priv->context, cellview->priv->size_changed_id);
+
       g_object_unref (cellview->priv->context);
       cellview->priv->context = NULL;
+      cellview->priv->size_changed_id = 0;
     }
 
   G_OBJECT_CLASS (gtk_cell_view_parent_class)->dispose (object);
@@ -645,6 +657,19 @@ gtk_cell_view_cell_layout_get_area (GtkCellLayout   *layout)
   return cellview->priv->area;
 }
 
+static void
+context_size_changed_cb (GtkCellAreaContext  *context,
+			 GParamSpec          *pspec,
+			 GtkWidget           *view)
+{
+  if (!strcmp (pspec->name, "minimum-width") ||
+      !strcmp (pspec->name, "natural-width") ||
+      !strcmp (pspec->name, "minimum-height") ||
+      !strcmp (pspec->name, "natural-height"))
+    gtk_widget_queue_resize (view);
+}
+
+
 /**
  * gtk_cell_view_new:
  *
@@ -1164,12 +1189,16 @@ gtk_cell_view_get_preferred_width  (GtkWidget *widget,
   GtkCellView        *cellview = GTK_CELL_VIEW (widget);
   GtkCellViewPrivate *priv = cellview->priv;
 
+  g_signal_handler_block (priv->context, priv->size_changed_id);
+
   if (cellview->priv->displayed_row)
     gtk_cell_view_set_cell_data (cellview);
 
   gtk_cell_area_get_preferred_width (priv->area, priv->context, widget, NULL, NULL);
   gtk_cell_area_context_sum_preferred_width (priv->context);
   gtk_cell_area_context_get_preferred_width (priv->context, minimum_size, natural_size);
+
+  g_signal_handler_unblock (priv->context, priv->size_changed_id);
 }
 
 static void       
@@ -1180,12 +1209,16 @@ gtk_cell_view_get_preferred_height (GtkWidget *widget,
   GtkCellView        *cellview = GTK_CELL_VIEW (widget);
   GtkCellViewPrivate *priv = cellview->priv;
 
+  g_signal_handler_block (priv->context, priv->size_changed_id);
+
   if (cellview->priv->displayed_row)
     gtk_cell_view_set_cell_data (cellview);
 
   gtk_cell_area_get_preferred_height (priv->area, priv->context, widget, NULL, NULL);
   gtk_cell_area_context_sum_preferred_height (priv->context);
   gtk_cell_area_context_get_preferred_height (priv->context, minimum_size, natural_size);
+
+  g_signal_handler_unblock (priv->context, priv->size_changed_id);
 }
 
 static void       



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