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



commit ea8c82113bed00718d0f30ba597cb03c894a59e7
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]