diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-11-20 16:30:51 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2011-01-04 23:37:06 +0900 |
commit | 6d8dfd5546578bd49835aa2dd44e12f0f427f38a (patch) | |
tree | 9ec34344dea8eeaf353ffdcacf943fb0a322273c /gtk/gtkcellview.c | |
parent | 53bdca9dae1a032f79827772995ba085a41af739 (diff) | |
download | gtk+-6d8dfd5546578bd49835aa2dd44e12f0f427f38a.tar.gz |
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.
Diffstat (limited to 'gtk/gtkcellview.c')
-rw-r--r-- | gtk/gtkcellview.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/gtk/gtkcellview.c b/gtk/gtkcellview.c index bc5a6ffe46..2fa830f328 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 |