diff options
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r-- | gtk/gtkbuilder.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 7878a4360e..b07ee5eeab 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -372,36 +372,43 @@ gtk_builder_get_property (GObject *object, * GtkWindow -> gtk_window_get_type * GtkHBox -> gtk_hbox_get_type * GtkUIManager -> gtk_ui_manager_get_type - * + * GdkRGB -> gdk_rgb_get_type */ -static GType -_gtk_builder_resolve_type_lazily (const gchar *name) +static gchar * +type_name_mangle (const gchar *name) { - static GModule *module = NULL; - GTypeGetFunc func; GString *symbol_name = g_string_new (""); - char c, *symbol; int i; - GType gtype = G_TYPE_INVALID; - if (!module) - module = g_module_open (NULL, 0); - for (i = 0; name[i] != '\0'; i++) { - c = name[i]; /* skip if uppercase, first or previous is uppercase */ - if ((c == g_ascii_toupper (c) && - i > 0 && name[i-1] != g_ascii_toupper (name[i-1])) || + if ((i > 0 && name[i] == g_ascii_toupper (name[i]) && + (name[i-1] != g_ascii_toupper (name[i-1]) || i == 1)) || (i > 2 && name[i] == g_ascii_toupper (name[i]) && - name[i-1] == g_ascii_toupper (name[i-1]) && - name[i-2] == g_ascii_toupper (name[i-2]))) + name[i-1] == g_ascii_toupper (name[i-1]) && + name[i-2] == g_ascii_toupper (name[i-2]) && + name[i+1] != 0 && name[i+1] != g_ascii_toupper (name[i+1]))) g_string_append_c (symbol_name, '_'); - g_string_append_c (symbol_name, g_ascii_tolower (c)); + g_string_append_c (symbol_name, g_ascii_tolower (name[i])); } g_string_append (symbol_name, "_get_type"); + + return g_string_free (symbol_name, FALSE); +} + +static GType +_gtk_builder_resolve_type_lazily (const gchar *name) +{ + static GModule *module = NULL; + GTypeGetFunc func; + gchar *symbol; + GType gtype = G_TYPE_INVALID; + + if (!module) + module = g_module_open (NULL, 0); - symbol = g_string_free (symbol_name, FALSE); + symbol = type_name_mangle (name); if (g_module_symbol (module, symbol, (gpointer)&func)) gtype = func (); |