[gtk+] Fix string allocation handling with GtkBuilder translations



commit a37450110b74605041318a76dac51838953d406d
Author: Kalev Lember <kalevlember gmail com>
Date:   Fri Jun 7 14:12:14 2013 +0200

    Fix string allocation handling with GtkBuilder translations
    
    Use g_string_assign to avoid issues with assigning GString's internal
    buffer back to the same string. This can happen when no translations are
    available and _gtk_builder_parser_translate returns back the same
    pointer that was passed in.
    
    This fixes a regression from commit e9f182e37a7f6e2dc339054841a3c9f930f
    that caused GtkComboBoxText <items> from GtkBuilder to show up empty if
    no translations are available.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=700629

 gtk/gtkbuilderparser.c |   16 ++++++++--------
 gtk/gtkcelllayout.c    |    3 +--
 gtk/gtkcomboboxtext.c  |    3 +--
 gtk/gtkcontainer.c     |   12 +++++-------
 4 files changed, 15 insertions(+), 19 deletions(-)
---
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index 6e42972..11e04cb 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -1128,16 +1128,16 @@ end_element (GMarkupParseContext *context,
 
           if (prop_info->translatable && prop_info->text->len)
             {
-              prop_info->data = g_strdup (_gtk_builder_parser_translate (data->domain,
-                                                                         prop_info->context,
-                                                                         prop_info->text->str));
-              g_string_free (prop_info->text, TRUE);
-            }
-          else
-            {
-              prop_info->data = g_string_free (prop_info->text, FALSE);
+              const gchar *translated;
+
+              translated = _gtk_builder_parser_translate (data->domain,
+                                                          prop_info->context,
+                                                          prop_info->text->str);
+              g_string_assign (prop_info->text, translated);
             }
 
+          prop_info->data = g_string_free (prop_info->text, FALSE);
+
           object_info->properties =
             g_slist_prepend (object_info->properties, prop_info);
         }
diff --git a/gtk/gtkcelllayout.c b/gtk/gtkcelllayout.c
index 4f6425d..a6d33aa 100644
--- a/gtk/gtkcelllayout.c
+++ b/gtk/gtkcelllayout.c
@@ -820,8 +820,7 @@ cell_packing_end_element (GMarkupParseContext *context,
          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);
+         g_string_assign (parser_data->string, translated);
        }
 
       if (parser_data->cell_prop_name)
diff --git a/gtk/gtkcomboboxtext.c b/gtk/gtkcomboboxtext.c
index a81c844..0de9124 100644
--- a/gtk/gtkcomboboxtext.c
+++ b/gtk/gtkcomboboxtext.c
@@ -240,8 +240,7 @@ item_end_element (GMarkupParseContext *context,
          translated = _gtk_builder_parser_translate (data->domain,
                                                      data->context,
                                                      data->string->str);
-         g_string_set_size (data->string, 0);
-         g_string_append (data->string, translated);
+         g_string_assign (data->string, translated);
        }
 
       gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (data->object), data->id, data->string->str);
diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index a30420d..636a02e 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -667,17 +667,15 @@ attributes_end_element (GMarkupParseContext *context,
   /* translate the string */
   if (parser_data->string->len && parser_data->translatable)
     {
-      gchar *translated;
+      const gchar *translated;
       const gchar *domain;
 
       domain = gtk_builder_get_translation_domain (parser_data->builder);
 
-      translated = g_strdup (_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);
-      g_free (translated);
+      translated = _gtk_builder_parser_translate (domain,
+                                                  parser_data->context,
+                                                  parser_data->string->str);
+      g_string_assign (parser_data->string, translated);
     }
 
   if (parser_data->child_prop_name)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]