X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkbuilderparser.c;h=634425890528f2f76147756c681f7874c04c0545;hb=af0007d0d89309838fb55cc62c76793b574fa40a;hp=feda666c586bbc91028aa42503ee4168473e9850;hpb=4ecd6a0f89f405841f93cd75ffdece231f5edaa1;p=~andy%2Fgtk diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index feda666c5..634425890 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -13,9 +13,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -23,15 +21,15 @@ #include #include -#include "gtktypeutils.h" +#include #include "gtkbuilderprivate.h" #include "gtkbuilder.h" #include "gtkbuildable.h" #include "gtkdebug.h" #include "gtkversion.h" -#include "gtktypeutils.h" +#include "gtktypebuiltins.h" #include "gtkintl.h" -#include "gtkalias.h" + static void free_property_info (PropertyInfo *info); static void free_object_info (ObjectInfo *info); @@ -380,7 +378,12 @@ parse_object (GMarkupParseContext *context, data->inside_requested_object = TRUE; } else - return; + { + g_free (object_class); + g_free (object_id); + g_free (constructor); + return; + } } object_info = g_slice_new0 (ObjectInfo); @@ -399,12 +402,13 @@ parse_object (GMarkupParseContext *context, { g_set_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_DUPLICATE_ID, - _("Duplicate object id '%s' on line %d (previously on line %d)"), + _("Duplicate object ID '%s' on line %d (previously on line %d)"), object_id, line, line2); return; } - g_hash_table_insert (data->object_ids, object_id, GINT_TO_POINTER (line)); + + g_hash_table_insert (data->object_ids, g_strdup (object_id), GINT_TO_POINTER (line)); } static void @@ -421,6 +425,14 @@ free_object_info (ObjectInfo *info) g_slice_free (ObjectInfo, info); } +static void +free_menu_info (MenuInfo *info) +{ + g_free (info->id); + g_hash_table_unref (info->objects); + g_slice_free (MenuInfo, info); +} + static void parse_child (ParserData *data, const gchar *element_name, @@ -629,9 +641,9 @@ _free_signal_info (SignalInfo *info, g_slice_free (SignalInfo, info); } -void -_free_requires_info (RequiresInfo *info, - gpointer user_data) +static void +free_requires_info (RequiresInfo *info, + gpointer user_data) { g_free (info->library); g_slice_free (RequiresInfo, info); @@ -829,7 +841,7 @@ start_element (GMarkupParseContext *context, ParserData *data = (ParserData*)user_data; #ifdef GTK_ENABLE_DEBUG - if (gtk_debug_flags & GTK_DEBUG_BUILDER) + if (gtk_get_debug_flags () & GTK_DEBUG_BUILDER) { GString *tags = g_string_new (""); int i; @@ -878,6 +890,8 @@ start_element (GMarkupParseContext *context, parse_signal (data, element_name, names, values, error); else if (strcmp (element_name, "interface") == 0) parse_interface (data, element_name, names, values, error); + else if (strcmp (element_name, "menu") == 0) + _gtk_builder_menu_start (data, element_name, names, values, error); else if (strcmp (element_name, "placeholder") == 0) { /* placeholder has no special treatmeant, but it needs an @@ -893,40 +907,6 @@ 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 = g_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 = g_dgettext (domain, msg_ctxt_id); - - if (translation == msg_ctxt_id) - return msgid; - } - - return translation; -} - gchar * _gtk_builder_parser_translate (const gchar *domain, const gchar *context, @@ -935,7 +915,7 @@ _gtk_builder_parser_translate (const gchar *domain, const char *s; if (context) - s = _dpgettext (domain, context, text); + s = g_dpgettext2 (domain, context, text); else s = g_dgettext (domain, text); @@ -974,10 +954,11 @@ end_element (GMarkupParseContext *context, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_VERSION_MISMATCH, "%s: required %s version %d.%d, current version is %d.%d", - data->filename, req_info->library, + data->filename, req_info->library, req_info->major, req_info->minor, GTK_MAJOR_VERSION, GTK_MINOR_VERSION); } + free_requires_info (req_info, NULL); } else if (strcmp (element_name, "interface") == 0) { @@ -987,6 +968,10 @@ end_element (GMarkupParseContext *context, /* If outside a requested object, simply ignore this tag */ return; } + else if (strcmp (element_name, "menu") == 0) + { + _gtk_builder_menu_end (data); + } else if (strcmp (element_name, "object") == 0) { ObjectInfo *object_info = state_pop_info (data, ObjectInfo); @@ -1116,17 +1101,19 @@ text (GMarkupParseContext *context, static void free_info (CommonInfo *info) { - if (strcmp (info->tag.name, "object") == 0) + if (strcmp (info->tag.name, "object") == 0) free_object_info ((ObjectInfo *)info); - else if (strcmp (info->tag.name, "child") == 0) + else if (strcmp (info->tag.name, "child") == 0) free_child_info ((ChildInfo *)info); - else if (strcmp (info->tag.name, "property") == 0) + else if (strcmp (info->tag.name, "property") == 0) free_property_info ((PropertyInfo *)info); - else if (strcmp (info->tag.name, "signal") == 0) + else if (strcmp (info->tag.name, "signal") == 0) _free_signal_info ((SignalInfo *)info, NULL); - else if (strcmp (info->tag.name, "requires") == 0) - _free_requires_info ((RequiresInfo *)info, NULL); - else + else if (strcmp (info->tag.name, "requires") == 0) + free_requires_info ((RequiresInfo *)info, NULL); + else if (strcmp (info->tag.name, "menu") == 0) + free_menu_info ((MenuInfo *)info); + else g_assert_not_reached (); } @@ -1135,7 +1122,6 @@ static const GMarkupParser parser = { end_element, text, NULL, - NULL }; void @@ -1161,7 +1147,8 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, data->builder = builder; data->filename = filename; data->domain = g_strdup (domain); - data->object_ids = g_hash_table_new (g_str_hash, g_str_equal); + data->object_ids = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify)g_free, NULL); data->requested_objects = NULL; if (requested_objs)