From 181ac0280d05d4e3385b0d66896c9f04b02f63c3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 4 Jan 2012 19:15:00 +0100 Subject: [PATCH] shorthand: Implement the 'background' shorthand Weee, shorthands are now really trivial \o/ --- gtk/gtkcssshorthandpropertyimpl.c | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/gtk/gtkcssshorthandpropertyimpl.c b/gtk/gtkcssshorthandpropertyimpl.c index caaf01ed34..cd1dfda7bb 100644 --- a/gtk/gtkcssshorthandpropertyimpl.c +++ b/gtk/gtkcssshorthandpropertyimpl.c @@ -28,6 +28,7 @@ #include "gtkcssimageprivate.h" #include "gtkcssstylefuncsprivate.h" #include "gtkcsstypesprivate.h" +#include "gtkprivatetypebuiltins.h" /* this is in case round() is not provided by the compiler, * such as in the case of C89 compilers, like MSVC @@ -274,6 +275,72 @@ parse_font (GtkCssShorthandProperty *shorthand, return TRUE; } +static gboolean +parse_background (GtkCssShorthandProperty *shorthand, + GValue *values, + GtkCssParser *parser, + GFile *base) +{ + int enum_value; + + do + { + /* the image part */ + if (!G_IS_VALUE (&values[0]) && + (_gtk_css_parser_has_prefix (parser, "none") || + _gtk_css_image_can_parse (parser))) + { + GtkCssImage *image; + + if (_gtk_css_parser_try (parser, "none", TRUE)) + image = NULL; + else + { + image = _gtk_css_image_new_parse (parser, base); + if (image == NULL) + return FALSE; + } + + g_value_init (&values[0], GTK_TYPE_CSS_IMAGE); + g_value_take_object (&values[0], image); + } + else if (!G_IS_VALUE (&values[1]) && + _gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_BACKGROUND_REPEAT, &enum_value)) + { + g_value_init (&values[1], GTK_TYPE_CSS_BACKGROUND_REPEAT); + g_value_set_enum (&values[1], enum_value); + } + else if ((!G_IS_VALUE (&values[2]) || !G_IS_VALUE (&values[3])) && + _gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_AREA, &enum_value)) + { + guint idx = !G_IS_VALUE (&values[2]) ? 2 : 3; + g_value_init (&values[idx], GTK_TYPE_CSS_AREA); + g_value_set_enum (&values[idx], enum_value); + } + else if (!G_IS_VALUE (&values[4])) + { + GtkSymbolicColor *symbolic; + + symbolic = _gtk_css_parser_read_symbolic_color (parser); + if (symbolic == NULL) + return FALSE; + + g_value_init (&values[4], GTK_TYPE_SYMBOLIC_COLOR); + g_value_take_boxed (&values[4], symbolic); + } + else + { + /* We parsed everything and there's still stuff left? + * Pretend we didn't notice and let the normal code produce + * a 'junk at end of value' error */ + break; + } + } + while (!value_is_done_parsing (parser)); + + return TRUE; +} + /*** PACKING ***/ static GParameter * @@ -639,6 +706,8 @@ _gtk_css_shorthand_property_init_properties (void) "border-bottom-right-radius", "border-bottom-left-radius", NULL }; const char *border_color_subproperties[] = { "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", NULL }; const char *border_image_subproperties[] = { "border-image-source", "border-image-slice", "border-image-width", "border-image-repeat", NULL }; + const char *background_subproperties[] = { "background-image", "background-repeat", "background-clip", "background-origin", + "background-color", NULL }; _gtk_css_shorthand_property_register ("font", PANGO_TYPE_FONT_DESCRIPTION, @@ -682,4 +751,10 @@ _gtk_css_shorthand_property_init_properties (void) parse_border_image, NULL, NULL); + _gtk_css_shorthand_property_register ("background", + G_TYPE_NONE, + background_subproperties, + parse_background, + NULL, + NULL); }