From e7354bd3f3cd7068fa660442a591ddd11facb54e Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Wed, 26 Jan 2011 22:19:41 +0900 Subject: [PATCH] Fixed GtkCellLayout to parse property text accumulatively. --- gtk/gtkcelllayout.c | 79 +++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/gtk/gtkcelllayout.c b/gtk/gtkcelllayout.c index d56747c1c..7291a4b53 100644 --- a/gtk/gtkcelllayout.c +++ b/gtk/gtkcelllayout.c @@ -693,6 +693,7 @@ typedef struct { GtkBuilder *builder; GtkCellLayout *cell_layout; GtkCellRenderer *renderer; + GString *string; gchar *cell_prop_name; gchar *context; gboolean translatable; @@ -743,53 +744,65 @@ cell_packing_text_element (GMarkupParseContext *context, GError **error) { CellPackingSubParserData *parser_data = (CellPackingSubParserData*)user_data; - GtkCellArea *area; - gchar* value; - if (!parser_data->cell_prop_name) - return; + if (parser_data->cell_prop_name) + g_string_append_len (parser_data->string, text, text_len); +} - if (parser_data->translatable && text_len) - { - const gchar* domain; - domain = gtk_builder_get_translation_domain (parser_data->builder); +static void +cell_packing_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + CellPackingSubParserData *parser_data = (CellPackingSubParserData*)user_data; + GtkCellArea *area; - value = _gtk_builder_parser_translate (domain, - parser_data->context, - text); - } - else + /* Append the translated strings */ + if (parser_data->string->len) { - value = g_strdup (text); - } - - area = gtk_cell_layout_get_area (parser_data->cell_layout); + area = gtk_cell_layout_get_area (parser_data->cell_layout); - if (!area) - { - g_warning ("%s does not have an internal GtkCellArea class and cannot apply child cell properties", - g_type_name (G_OBJECT_TYPE (parser_data->cell_layout))); - return; + if (area) + { + if (parser_data->translatable) + { + gchar *translated; + const gchar* domain; + + domain = gtk_builder_get_translation_domain (parser_data->builder); + + translated = _gtk_builder_parser_translate (domain, + parser_data->context, + parser_data->string->str); + g_string_set_size (parser_data->string, 0); + g_string_append (parser_data->string, translated); + } + + gtk_cell_layout_buildable_set_cell_property (area, + parser_data->builder, + parser_data->renderer, + parser_data->cell_prop_name, + parser_data->string->str); + } + else + g_warning ("%s does not have an internal GtkCellArea class and cannot apply child cell properties", + g_type_name (G_OBJECT_TYPE (parser_data->cell_layout))); } - gtk_cell_layout_buildable_set_cell_property (area, - parser_data->builder, - parser_data->renderer, - parser_data->cell_prop_name, - value); - + g_string_set_size (parser_data->string, 0); g_free (parser_data->cell_prop_name); g_free (parser_data->context); - g_free (value); parser_data->cell_prop_name = NULL; parser_data->context = NULL; parser_data->translatable = FALSE; } + static const GMarkupParser cell_packing_parser = { cell_packing_start_element, - NULL, + cell_packing_end_element, cell_packing_text_element, }; @@ -821,6 +834,7 @@ _gtk_cell_layout_buildable_custom_tag_start (GtkBuildable *buildable, else if (strcmp (tagname, "cell-packing") == 0) { packing_data = g_slice_new0 (CellPackingSubParserData); + packing_data->string = g_string_new (""); packing_data->builder = builder; packing_data->cell_layout = GTK_CELL_LAYOUT (buildable); packing_data->renderer = GTK_CELL_RENDERER (child); @@ -841,6 +855,7 @@ _gtk_cell_layout_buildable_custom_tag_end (GtkBuildable *buildable, gpointer *data) { AttributesSubParserData *attr_data; + CellPackingSubParserData *packing_data; if (strcmp (tagname, "attributes") == 0) { @@ -851,7 +866,9 @@ _gtk_cell_layout_buildable_custom_tag_end (GtkBuildable *buildable, } else if (strcmp (tagname, "cell-packing") == 0) { - g_slice_free (CellPackingSubParserData, (gpointer)data); + packing_data = (CellPackingSubParserData *)data; + g_string_free (packing_data->string, TRUE); + g_slice_free (CellPackingSubParserData, packing_data); return TRUE; } return FALSE; -- 2.43.2