summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilder.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-09-26 23:28:55 -0400
committerMatthias Clasen <mclasen@redhat.com>2014-09-26 23:30:29 -0400
commitf35dff334fc9e52582fd49d47440f4b1f0e7e91b (patch)
tree365b4e0c8dbe8080ce2b77ea1057d9d037a6251e /gtk/gtkbuilder.c
parent0c2f3402c3214ae8daa37a3aa350db31ed5e5ddc (diff)
downloadgtk+-f35dff334fc9e52582fd49d47440f4b1f0e7e91b.tar.gz
Factor out a function
Factor out the typename-to-get-type mangling as a separate function, for easier testing. Also fix some cases where it doesn't, currently, like GString -> g_string_get_type and GdkRGB -> gdk_rgb_get_type
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r--gtk/gtkbuilder.c41
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 ();