From 915acce4702082432c1bd83afdfded8372a378b6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 8 Feb 2019 10:33:11 -0500 Subject: [PATCH] builder-tool: Fix preserving properties We were looking at the wrong class names here, we need to look at the owner type to match against our list. This fixes problems where gtk-builder-tool simplify inadvertedly loses hexpand or vexpand settings, messing up layout, as recently happend in gtk4-widget-factory. --- gtk/tools/gtk-builder-tool-simplify.c | 62 ++++++++++++--------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/gtk/tools/gtk-builder-tool-simplify.c b/gtk/tools/gtk-builder-tool-simplify.c index 759f7c5884..1847e37c99 100644 --- a/gtk/tools/gtk-builder-tool-simplify.c +++ b/gtk/tools/gtk-builder-tool-simplify.c @@ -143,9 +143,8 @@ canonical_boolean_value (MyParserData *data, * value from the superclass. */ static gboolean -needs_explicit_setting (const gchar *class_name, - const gchar *property_name, - gboolean packing) +needs_explicit_setting (GParamSpec *pspec, + gboolean packing) { struct _Prop { const char *class; @@ -163,18 +162,17 @@ needs_explicit_setting (const gchar *class_name, { "GtkWidget", "hexpand", 0 }, { "GtkWidget", "vexpand", 0 }, }; - gchar *canonical_name; gboolean found; gint k; + const char *class_name; - canonical_name = g_strdup (property_name); - g_strdelimit (canonical_name, "_", '-'); + class_name = g_type_name (pspec->owner_type); found = FALSE; for (k = 0; k < G_N_ELEMENTS (props); k++) { if (strcmp (class_name, props[k].class) == 0 && - strcmp (canonical_name, props[k].property) == 0 && + strcmp (pspec->name, props[k].property) == 0 && packing == props[k].packing) { found = TRUE; @@ -182,8 +180,6 @@ needs_explicit_setting (const gchar *class_name, } } - g_free (canonical_name); - return found; } @@ -303,35 +299,19 @@ get_property_pspec (MyParserData *data, static gboolean value_is_default (MyParserData *data, - const gchar *class_name, - const gchar *property_name, - const gchar *value_string, - gboolean packing, - gboolean cell_packing) + GParamSpec *pspec, + const gchar *value_string) { GValue value = { 0, }; gboolean ret; GError *error = NULL; - GParamSpec *pspec; - pspec = get_property_pspec (data, class_name, property_name, packing, cell_packing); - - if (pspec == NULL) - { - if (packing) - g_printerr (_("%s: Packing property %s::%s not found\n"), data->input_filename, class_name, property_name); - else if (cell_packing) - g_printerr (_("%s: Cell property %s::%s not found\n"), data->input_filename, class_name, property_name); - else - g_printerr (_("%s: Property %s::%s not found\n"), data->input_filename, class_name, property_name); - return FALSE; - } - else if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (pspec), G_TYPE_OBJECT)) + if (g_type_is_a (G_PARAM_SPEC_VALUE_TYPE (pspec), G_TYPE_OBJECT)) return FALSE; if (!gtk_builder_value_from_string (data->builder, pspec, value_string, &value, &error)) { - g_printerr (_("%s: Couldn’t parse value for %s::%s: %s\n"), data->input_filename, class_name, property_name, error->message); + g_printerr (_("%s: Couldn’t parse value for %s: %s\n"), data->input_filename, pspec->name, error->message); g_error_free (error); ret = FALSE; } @@ -411,11 +391,12 @@ property_can_be_omitted (Element *element, gint i; gboolean bound; gboolean translatable; - const gchar *class_name; - const gchar *property_name; - const gchar *value_string; + const char *class_name; + const char *property_name; + const char *value_string; gboolean packing = FALSE; gboolean cell_packing = FALSE; + GParamSpec *pspec; if (g_str_equal (element->parent->element_name, "packing")) packing = TRUE; @@ -445,10 +426,23 @@ property_can_be_omitted (Element *element, if (bound) return FALSE; - if (needs_explicit_setting (class_name, property_name, packing)) + pspec = get_property_pspec (data, class_name, property_name, packing, cell_packing); + + if (pspec == NULL) + { + if (packing) + g_printerr (_("%s: Packing property %s::%s not found\n"), data->input_filename, class_name, property_name); + else if (cell_packing) + g_printerr (_("%s: Cell property %s::%s not found\n"), data->input_filename, class_name, property_name); + else + g_printerr (_("%s: Property %s::%s not found\n"), data->input_filename, class_name, property_name); + return FALSE; + } + + if (needs_explicit_setting (pspec, packing)) return FALSE; - return value_is_default (data, class_name, property_name, value_string, packing, cell_packing); + return value_is_default (data, pspec, value_string); } static gboolean