[gtk+/combo-refactor: 12/49] Fixed GtkCellView to not clear the layout when disposing
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/combo-refactor: 12/49] Fixed GtkCellView to not clear the layout when disposing
- Date: Mon, 13 Dec 2010 06:43:23 +0000 (UTC)
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]