diff options
author | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2014-05-02 14:38:05 -0300 |
---|---|---|
committer | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2014-05-02 14:38:05 -0300 |
commit | b059098c71b5597b3fc1962b51cac1d058c8bd37 (patch) | |
tree | 669273be18677e59c3e8b52d2e5d24b25bcefa8f /gtk/gtkbuilderparser.c | |
parent | 35df3bc182e0839cf3afda85d1064e1c1c69c2a8 (diff) | |
download | gtk+-b059098c71b5597b3fc1962b51cac1d058c8bd37.tar.gz |
GtkBuilder: added template parent type check.
Diffstat (limited to 'gtk/gtkbuilderparser.c')
-rw-r--r-- | gtk/gtkbuilderparser.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index c09cb880fb..9b34993866 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -438,6 +438,7 @@ parse_template (GMarkupParseContext *context, ObjectInfo *object_info; int i; const gchar *object_class = NULL; + const gchar *parent_class = NULL; gint line, line2; GType template_type = _gtk_builder_get_template_type (data->builder); GType parsed_type; @@ -464,7 +465,7 @@ parse_template (GMarkupParseContext *context, if (strcmp (names[i], "class") == 0) object_class = values[i]; else if (strcmp (names[i], "parent") == 0) - /* Ignore 'parent' attribute, however it's needed by Glade */; + parent_class = values[i]; else { error_invalid_attribute (data, element_name, names[i], error); @@ -489,6 +490,29 @@ parse_template (GMarkupParseContext *context, return; } + if (parent_class) + { + GType parent_type = g_type_from_name (parent_class); + GType expected_type = g_type_parent (parsed_type); + + if (parent_type == G_TYPE_INVALID) + { + g_set_error (error, GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_VALUE, + "Invalid template parent type `%s'", + parent_class); + return; + } + if (parent_type != expected_type) + { + g_set_error (error, GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_TEMPLATE_MISMATCH, + "Template parent type `%s' does not match instance parent type `%s'.", + parent_class, g_type_name (expected_type)); + return; + } + } + ++data->cur_object_level; object_info = g_slice_new0 (ObjectInfo); |