diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2007-06-30 07:03:34 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2007-06-30 07:03:34 +0000 |
commit | 988a3e2bf4809359ef65134bc1fb985e7c468c9d (patch) | |
tree | d796dc52a7a74af54dbf0324d085992fc9016015 /gtk/gtkbuilderparser.c | |
parent | 357e2cbfff1c0b36035ea73007c8faf7c20daf64 (diff) | |
download | gtk+-988a3e2bf4809359ef65134bc1fb985e7c468c9d.tar.gz |
Move type-func to <object> instead of <child>, add a test to make sure
2007-06-30 Johan Dahlin <jdahlin@async.com.br>
* gtk/gtkbuilderparser.c: (_get_type_by_symbol), (parse_object),
(parse_child):
* tests/buildertest.c: (test_types):
Move type-func to <object> instead of <child>, add a test to
make sure that it works as desired, #452463
svn path=/trunk/; revision=18306
Diffstat (limited to 'gtk/gtkbuilderparser.c')
-rw-r--r-- | gtk/gtkbuilderparser.c | 68 |
1 files changed, 36 insertions, 32 deletions
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index a18d5ec7c4..dd1305b970 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -227,6 +227,26 @@ builder_construct (ParserData *data, return object; } +static gchar * +_get_type_by_symbol (const gchar* symbol) +{ + static GModule *module = NULL; + GTypeGetFunc func; + GType type; + + if (!module) + module = g_module_open (NULL, 0); + + if (!g_module_symbol (module, symbol, (gpointer)&func)) + return NULL; + + type = func (); + if (type == G_TYPE_INVALID) + return NULL; + + return g_strdup (g_type_name (type)); +} + static void parse_object (ParserData *data, const gchar *element_name, @@ -258,6 +278,22 @@ parse_object (ParserData *data, object_id = g_strdup (values[i]); else if (strcmp (names[i], "constructor") == 0) constructor = g_strdup (values[i]); + else if (strcmp (names[i], "type-func") == 0) + { + /* Call the GType function, and return the name of the GType, + * it's guaranteed afterwards that g_type_from_name on the name + * will return our GType + */ + object_class = _get_type_by_symbol (values[i]); + if (!object_class) + { + g_set_error (error, GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION, + _("Invalid type function: `%s'"), + values[i]); + return; + } + } else { error_invalid_attribute (data, element_name, names[i], error); @@ -303,26 +339,6 @@ free_object_info (ObjectInfo *info) g_slice_free (ObjectInfo, info); } -static gchar * -_get_type_by_symbol (const gchar* symbol) -{ - static GModule *module = NULL; - GTypeGetFunc func; - GType type; - - if (!module) - module = g_module_open (NULL, 0); - - if (!g_module_symbol (module, symbol, (gpointer)&func)) - return NULL; - - type = func (); - if (type == G_TYPE_INVALID) - return NULL; - - return g_strdup (g_type_name (type)); -} - static void parse_child (ParserData *data, const gchar *element_name, @@ -354,18 +370,6 @@ parse_child (ParserData *data, child_info->type = g_strdup (values[i]); else if (strcmp (names[i], "internal-child") == 0) child_info->internal_child = g_strdup (values[i]); - else if (strcmp (names[i], "type-func") == 0) - { - child_info->type = _get_type_by_symbol (values[i]); - if (!child_info->type) - { - g_set_error (error, GTK_BUILDER_ERROR, - GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION, - _("Invalid type function: `%s'"), - values[i]); - return; - } - } else error_invalid_attribute (data, element_name, names[i], error); } |