X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssshorthandproperty.c;h=c6ca6146890cae4c12db2c4dab906d319805657a;hb=9d81b69e06cd9c2ad9cb5204056bfae5a3128e9c;hp=7352788122cbe58608ecd592d103a45df01dc06e;hpb=32c8bbb575b7ef584a610a2ec2b5c1bc683bd4ab;p=~andy%2Fgtk diff --git a/gtk/gtkcssshorthandproperty.c b/gtk/gtkcssshorthandproperty.c index 735278812..c6ca61468 100644 --- a/gtk/gtkcssshorthandproperty.c +++ b/gtk/gtkcssshorthandproperty.c @@ -12,8 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * License along with this library. If not, see . * * Authors: Benjamin Otte */ @@ -22,10 +21,11 @@ #include "gtkcssshorthandpropertyprivate.h" +#include "gtkcssarrayvalueprivate.h" +#include "gtkcssinheritvalueprivate.h" +#include "gtkcssinitialvalueprivate.h" #include "gtkcssstylefuncsprivate.h" -#include "gtkcsstypesprivate.h" #include "gtkintl.h" -#include "gtkprivatetypebuiltins.h" enum { PROP_0, @@ -68,44 +68,32 @@ _gtk_css_shorthand_property_assign (GtkStyleProperty *property, GtkStateFlags state, const GValue *value) { - GParameter *parameters; - guint i, n_parameters; - - parameters = property->unpack_func (value, &n_parameters); + GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property); - for (i = 0; i < n_parameters; i++) - { - _gtk_style_property_assign (_gtk_style_property_lookup (parameters[i].name), - props, - state, - ¶meters[i].value); - g_value_unset (¶meters[i].value); - } - g_free (parameters); + shorthand->assign (shorthand, props, state, value); } static void _gtk_css_shorthand_property_query (GtkStyleProperty *property, - GtkStyleProperties *props, - GtkStateFlags state, - GValue *value) + GValue *value, + GtkStyleQueryFunc query_func, + gpointer query_data) { - property->pack_func (value, props, state); + GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property); + + return shorthand->query (shorthand, value, query_func, query_data); } -static gboolean +static GtkCssValue * gtk_css_shorthand_property_parse_value (GtkStyleProperty *property, - GValue *value, - GtkCssParser *parser, - GFile *base) + GtkCssParser *parser) { GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (property); - GValueArray *array; + GtkCssValue **data; + GtkCssValue *result; guint i; - array = g_value_array_new (shorthand->subproperties->len); - for (i = 0; i < shorthand->subproperties->len; i++) - g_value_array_append (array, NULL); + data = g_new0 (GtkCssValue *, shorthand->subproperties->len); if (_gtk_css_parser_try (parser, "initial", TRUE)) { @@ -114,9 +102,7 @@ gtk_css_shorthand_property_parse_value (GtkStyleProperty *property, */ for (i = 0; i < shorthand->subproperties->len; i++) { - GValue *val = g_value_array_get_nth (array, i); - g_value_init (val, GTK_TYPE_CSS_SPECIAL_VALUE); - g_value_set_enum (val, GTK_CSS_INITIAL); + data[i] = _gtk_css_initial_value_new (); } } else if (_gtk_css_parser_try (parser, "inherit", TRUE)) @@ -129,15 +115,18 @@ gtk_css_shorthand_property_parse_value (GtkStyleProperty *property, */ for (i = 0; i < shorthand->subproperties->len; i++) { - GValue *val = g_value_array_get_nth (array, i); - g_value_init (val, GTK_TYPE_CSS_SPECIAL_VALUE); - g_value_set_enum (val, GTK_CSS_INHERIT); + data[i] = _gtk_css_inherit_value_new (); } } - else if (!shorthand->parse (shorthand, array->values, parser, base)) + else if (!shorthand->parse (shorthand, data, parser)) { - g_value_array_free (array); - return FALSE; + for (i = 0; i < shorthand->subproperties->len; i++) + { + if (data[i] != NULL) + _gtk_css_value_unref (data[i]); + } + g_free (data); + return NULL; } /* All values that aren't set by the parse func are set to their @@ -145,16 +134,14 @@ gtk_css_shorthand_property_parse_value (GtkStyleProperty *property, * XXX: Is the default always initial or can it be inherit? */ for (i = 0; i < shorthand->subproperties->len; i++) { - GValue *val = g_value_array_get_nth (array, i); - if (G_IS_VALUE (val)) - continue; - g_value_init (val, GTK_TYPE_CSS_SPECIAL_VALUE); - g_value_set_enum (val, GTK_CSS_INITIAL); + if (data[i] == NULL) + data[i] = _gtk_css_initial_value_new (); } - g_value_init (value, G_TYPE_VALUE_ARRAY); - g_value_set_boxed (value, array); - return TRUE; + result = _gtk_css_array_value_new_from_array (data, shorthand->subproperties->len); + g_free (data); + + return result; } static void