summaryrefslogtreecommitdiff
path: root/tools/gtk-builder-tool-simplify.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gtk-builder-tool-simplify.c')
-rw-r--r--tools/gtk-builder-tool-simplify.c81
1 files changed, 75 insertions, 6 deletions
diff --git a/tools/gtk-builder-tool-simplify.c b/tools/gtk-builder-tool-simplify.c
index 3eb5a21f78..0f13bf7a6d 100644
--- a/tools/gtk-builder-tool-simplify.c
+++ b/tools/gtk-builder-tool-simplify.c
@@ -255,6 +255,7 @@ is_pcdata_element (Element *element)
"col",
"item",
"mark",
+ "lookup",
NULL,
};
@@ -579,6 +580,52 @@ property_is_boolean (Element *element,
return FALSE;
}
+static gboolean
+property_is_enum (Element *element,
+ MyParserData *data,
+ GType *type)
+{
+ GParamSpec *pspec = NULL;
+ const char *class_name;
+ const char *property_name;
+ int i;
+ PropKind kind;
+
+ kind = get_prop_kind (element);
+ class_name = get_class_name (element);
+ property_name = "";
+
+ for (i = 0; element->attribute_names[i]; i++)
+ {
+ if (strcmp (element->attribute_names[i], "name") == 0)
+ property_name = (const char *)element->attribute_values[i];
+ }
+
+ if (class_name && property_name)
+ pspec = get_property_pspec (data, class_name, property_name, kind);
+ if (pspec && G_TYPE_IS_ENUM (G_PARAM_SPEC_VALUE_TYPE (pspec)))
+ {
+ *type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+ return TRUE;
+ }
+
+ *type = G_TYPE_NONE;
+ return FALSE;
+}
+
+static char *
+canonical_enum_value (MyParserData *data,
+ GType type,
+ const char *string)
+{
+ GValue value = G_VALUE_INIT;
+
+ if (gtk_builder_value_from_string_type (data->builder, type, string, &value, NULL))
+ return g_strdup_printf ("%d", g_value_get_enum (&value));
+
+ return NULL;
+}
+
static void
warn_missing_property (Element *element,
MyParserData *data,
@@ -1871,16 +1918,38 @@ simplify_element (Element *element,
MyParserData *data)
{
GList *l;
+ GType type;
if (!is_pcdata_element (element))
- g_clear_pointer (&element->data, g_free);
- else if (g_str_equal (element->element_name, "property") &&
- property_is_boolean (element, data))
{
- const char *b = canonical_boolean_value (data, element->data);
- g_free (element->data);
- element->data = g_strdup (b);
+ g_clear_pointer (&element->data, g_free);
}
+ else if (g_str_equal (element->element_name, "property"))
+ {
+ if (property_is_boolean (element, data))
+ {
+ const char *b = canonical_boolean_value (data, element->data);
+ g_free (element->data);
+ element->data = g_strdup (b);
+ }
+ else if (property_is_enum (element, data, &type))
+ {
+ char *e = canonical_enum_value (data, type, element->data);
+ g_free (element->data);
+ element->data = e;
+ }
+
+ for (int i = 0; element->attribute_names[i]; i++)
+ {
+ if (g_str_equal (element->attribute_names[i], "translatable"))
+ {
+ const char *b = canonical_boolean_value (data, element->attribute_values[i]);
+ g_free (element->attribute_values[i]);
+ element->attribute_values[i] = g_strdup (b);
+ break;
+ }
+ }
+ }
l = element->children;
while (l)