diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-12-20 19:37:30 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-12-22 00:28:18 +0900 |
commit | c8ae68c33dc65dc4407863553d059caa1d41e464 (patch) | |
tree | c407627b2608a8c1a7ba50064091c68dad9131f7 /gtk/gtkcellarea.c | |
parent | 13f18567e98e3c26e125ee458ca318fef6acb281 (diff) | |
download | gtk+-c8ae68c33dc65dc4407863553d059caa1d41e464.tar.gz |
Fixed gtk_cell_layout_set_cell_data_func() to pass the correct layout object
Added _gtk_cell_area_set_cell_data_func_with_proxy() to be called by
gtk_cell_layout_set_cell_data_func() when the layouting object itself
is not the underlying cell area.
Diffstat (limited to 'gtk/gtkcellarea.c')
-rw-r--r-- | gtk/gtkcellarea.c | 86 |
1 files changed, 55 insertions, 31 deletions
diff --git a/gtk/gtkcellarea.c b/gtk/gtkcellarea.c index 40a5c9eaa3..9e770d69c7 100644 --- a/gtk/gtkcellarea.c +++ b/gtk/gtkcellarea.c @@ -497,6 +497,7 @@ typedef struct { GtkCellLayoutDataFunc func; gpointer data; GDestroyNotify destroy; + GtkCellLayout *proxy; } CellInfo; static CellInfo *cell_info_new (GtkCellLayoutDataFunc func, @@ -1208,8 +1209,8 @@ apply_cell_attributes (GtkCellRenderer *renderer, /* Call any GtkCellLayoutDataFunc that may have been set by the user */ if (info->func) - info->func (GTK_CELL_LAYOUT (data->area), renderer, - data->model, data->iter, info->data); + info->func (info->proxy ? info->proxy : GTK_CELL_LAYOUT (data->area), renderer, + data->model, data->iter, info->data); g_object_thaw_notify (G_OBJECT (renderer)); } @@ -1419,36 +1420,9 @@ gtk_cell_area_set_cell_data_func (GtkCellLayout *cell_layout, gpointer func_data, GDestroyNotify destroy) { - GtkCellArea *area = GTK_CELL_AREA (cell_layout); - GtkCellAreaPrivate *priv = area->priv; - CellInfo *info; - - info = g_hash_table_lookup (priv->cell_info, renderer); - - if (info) - { - if (info->destroy && info->data) - info->destroy (info->data); - - if (func) - { - info->func = func; - info->data = func_data; - info->destroy = destroy; - } - else - { - info->func = NULL; - info->data = NULL; - info->destroy = NULL; - } - } - else - { - info = cell_info_new (func, func_data, destroy); + GtkCellArea *area = GTK_CELL_AREA (cell_layout); - g_hash_table_insert (priv->cell_info, renderer, info); - } + _gtk_cell_area_set_cell_data_func_with_proxy (area, renderer, (GFunc)func, func_data, destroy, NULL); } static void @@ -3636,3 +3610,53 @@ gtk_cell_area_request_renderer (GtkCellArea *area, *minimum_size += focus_line_width; *natural_size += focus_line_width; } + +void +_gtk_cell_area_set_cell_data_func_with_proxy (GtkCellArea *area, + GtkCellRenderer *cell, + GFunc func, + gpointer func_data, + GDestroyNotify destroy, + gpointer proxy) +{ + GtkCellAreaPrivate *priv; + CellInfo *info; + + g_return_if_fail (GTK_IS_CELL_AREA (area)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); + + priv = area->priv; + + info = g_hash_table_lookup (priv->cell_info, cell); + + /* Note we do not take a reference to the proxy, the proxy is a GtkCellLayout + * that is forwarding it's implementation to a delegate GtkCellArea therefore + * it's life-cycle is longer than the area's life cycle. + */ + if (info) + { + if (info->destroy && info->data) + info->destroy (info->data); + + if (func) + { + info->func = (GtkCellLayoutDataFunc)func; + info->data = func_data; + info->destroy = destroy; + info->proxy = proxy; + } + else + { + info->func = NULL; + info->data = NULL; + info->destroy = NULL; + info->proxy = NULL; + } + } + else + { + info = cell_info_new ((GtkCellLayoutDataFunc)func, func_data, destroy); + + g_hash_table_insert (priv->cell_info, cell, info); + } +} |