From 2d46618e08418c325bd0cc9dd520ffcfbf5d163d Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 2 Jan 2012 10:06:47 +0100 Subject: [PATCH] styleproperty: Let parse_value() initialize the value ... and document that behavior. --- gtk/gtkcssprovider.c | 1 - gtk/gtkcssshorthandproperty.c | 1 - gtk/gtkcssstyleproperty.c | 21 +++++++++++++++------ gtk/gtkstyleproperty.c | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 9943814950..b6cb329fce 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -2353,7 +2353,6 @@ parse_declaration (GtkCssScanner *scanner, gtk_css_scanner_push_section (scanner, GTK_CSS_SECTION_VALUE); val = property_value_new (scanner->section); - g_value_init (&val->value, _gtk_style_property_get_value_type (property)); if (_gtk_style_property_parse_value (property, &val->value, diff --git a/gtk/gtkcssshorthandproperty.c b/gtk/gtkcssshorthandproperty.c index 2c6906b9b2..8258c001f4 100644 --- a/gtk/gtkcssshorthandproperty.c +++ b/gtk/gtkcssshorthandproperty.c @@ -153,7 +153,6 @@ gtk_css_shorthand_property_parse_value (GtkStyleProperty *property, g_value_set_enum (val, GTK_CSS_INITIAL); } - g_value_unset (value); g_value_init (value, G_TYPE_VALUE_ARRAY); g_value_set_boxed (value, array); return TRUE; diff --git a/gtk/gtkcssstyleproperty.c b/gtk/gtkcssstyleproperty.c index b7c7afedf7..6232373856 100644 --- a/gtk/gtkcssstyleproperty.c +++ b/gtk/gtkcssstyleproperty.c @@ -324,12 +324,13 @@ gtk_css_style_property_parse_value (GtkStyleProperty *property, GtkCssParser *parser, GFile *base) { + gboolean success; + if (_gtk_css_parser_try (parser, "initial", TRUE)) { /* the initial value can be explicitly specified with the * ‘initial’ keyword which all properties accept. */ - g_value_unset (value); g_value_init (value, GTK_TYPE_CSS_SPECIAL_VALUE); g_value_set_enum (value, GTK_CSS_INITIAL); return TRUE; @@ -342,7 +343,6 @@ gtk_css_style_property_parse_value (GtkStyleProperty *property, * strengthen inherited values in the cascade, and it can * also be used on properties that are not normally inherited. */ - g_value_unset (value); g_value_init (value, GTK_TYPE_CSS_SPECIAL_VALUE); g_value_set_enum (value, GTK_CSS_INHERIT); return TRUE; @@ -351,22 +351,31 @@ gtk_css_style_property_parse_value (GtkStyleProperty *property, { GError *error = NULL; char *value_str; - gboolean success; value_str = _gtk_css_parser_read_value (parser); if (value_str == NULL) return FALSE; + g_value_init (value, _gtk_style_property_get_value_type (property)); success = (*property->property_parse_func) (value_str, value, &error); g_free (value_str); + if (!success) + g_value_unset (value); return success; } - else if (property->parse_func) - return (* property->parse_func) (parser, base, value); + + g_value_init (value, _gtk_style_property_get_value_type (property)); + if (property->parse_func) + success = (* property->parse_func) (parser, base, value); else - return _gtk_css_style_parse_value (value, parser, base); + success = _gtk_css_style_parse_value (value, parser, base); + + if (!success) + g_value_unset (value); + + return success; } static void diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c index 4bc9c38d6f..b181be9065 100644 --- a/gtk/gtkstyleproperty.c +++ b/gtk/gtkstyleproperty.c @@ -379,6 +379,25 @@ border_corner_radius_value_print (const GValue *value, /*** API ***/ +/** + * _gtk_style_property_parse_value: + * @property: the property + * @value: an uninitialized value + * @parser: the parser to parse from + * @base: the base file for @aprser + * + * Tries to parse the given @property from the given @parser into + * @value. The type that @value will be assigned is dependant on + * the parser and no assumptions must be made about it. If the + * parsing fails, %FALSE will be returned and @value will be + * left uninitialized. + * + * Only if @property is a #GtkCssShorthandProperty, the @value will + * always contain a #GValueArray with the values to be used for + * the subproperties. + * + * Returns: %TRUE on success + **/ gboolean _gtk_style_property_parse_value (GtkStyleProperty *property, GValue *value,