From 36605333d010aade674ef8285ec087569f11156b Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Thu, 8 Nov 2007 04:12:52 +0000 Subject: [PATCH] Add GString 'text' to the property info structure. Used to accumulate 2007-11-07 Ryan Lortie * gtk/gtkbuilderprivate.h: Add GString 'text' to the property info structure. Used to accumulate property text across multiple 'text' calls. * gtk/gtkbuilderparser.c: Instead of translating/copying text on each 'text' call while in accumulate the text until the end and do it all in one go. This fixes handling of inside properties as well as cases. svn path=/trunk/; revision=18970 --- ChangeLog | 11 +++++ gtk/gtkbuilderparser.c | 106 ++++++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42190c4c23..ac8a4ab0c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-11-07 Ryan Lortie + + * gtk/gtkbuilderprivate.h: Add GString 'text' to the property info + structure. Used to accumulate property text across multiple 'text' + calls. + + * gtk/gtkbuilderparser.c: Instead of translating/copying text on each + 'text' call while in accumulate the text until the end and + do it all in one go. This fixes handling of inside + properties as well as cases. + 2007-11-06 Michael Natterer * gtk/gtkmenu.c (gtk_menu_popup): call gdk_flush() after showing diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index 3ca1d3c31d..a394e1e8f4 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -416,6 +416,7 @@ parse_property (ParserData *data, info->name = name; info->translatable = translatable; info->context = context; + info->text = g_string_new (""); state_push (data, info); info->tag.name = element_name; @@ -744,6 +745,40 @@ start_element (GMarkupParseContext *context, element_name); } +/* This function is taken from gettext.h + * GNU gettext uses '\004' to separate context and msgid in .mo files. + */ +static const char * +dpgettext (const char *domain, + const char *msgctxt, + const char *msgid) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; + char* msg_ctxt_id; + + msg_ctxt_id = g_alloca (msgctxt_len + msgid_len); + + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + + translation = dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + { + /* try the old way of doing message contexts, too */ + msg_ctxt_id[msgctxt_len - 1] = '|'; + translation = dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + return msgid; + } + + return translation; +} + /* Called for close tags */ static void end_element (GMarkupParseContext *context, @@ -787,6 +822,27 @@ end_element (GMarkupParseContext *context, if (strcmp (info->tag.name, "object") == 0) { ObjectInfo *object_info = (ObjectInfo*)info; + + if (prop_info->translatable && prop_info->text->len) + { + const char *text; + + if (prop_info->context) + text = dpgettext (data->domain, + prop_info->context, + prop_info->text->str); + else + text = dgettext (data->domain, prop_info->text->str); + + prop_info->data = g_strdup (text); + g_string_free (prop_info->text, TRUE); + } + else + { + prop_info->data = prop_info->text->str; + g_string_free (prop_info->text, FALSE); + } + object_info->properties = g_slist_prepend (object_info->properties, prop_info); } @@ -821,40 +877,6 @@ end_element (GMarkupParseContext *context, } } -/* This function is taken from gettext.h - * GNU gettext uses '\004' to separate context and msgid in .mo files. - */ -static const char * -dpgettext (const char *domain, - const char *msgctxt, - const char *msgid) -{ - size_t msgctxt_len = strlen (msgctxt) + 1; - size_t msgid_len = strlen (msgid) + 1; - const char *translation; - char* msg_ctxt_id; - - msg_ctxt_id = g_alloca (msgctxt_len + msgid_len); - - memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); - msg_ctxt_id[msgctxt_len - 1] = '\004'; - memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); - - translation = dgettext (domain, msg_ctxt_id); - - if (translation == msg_ctxt_id) - { - /* try the old way of doing message contexts, too */ - msg_ctxt_id[msgctxt_len - 1] = '|'; - translation = dgettext (domain, msg_ctxt_id); - - if (translation == msg_ctxt_id) - return msgid; - } - - return translation; -} - /* Called for character data */ /* text is not nul-terminated */ static void @@ -885,21 +907,7 @@ text (GMarkupParseContext *context, { PropertyInfo *prop_info = (PropertyInfo*)info; - /* text is not guaranteed to be null-terminated */ - char *string = g_strndup (text, text_len); - - if (prop_info->translatable && text_len) - { - if (prop_info->context) - text = dpgettext (data->domain, prop_info->context, string); - else - text = dgettext (data->domain, string); - - prop_info->data = g_strdup (text); - g_free (string); - } - else - prop_info->data = string; + g_string_append_len (prop_info->text, text, text_len); } }