X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssstylefuncs.c;h=af1c1b1b6f41262fdd95bc713c15bdbcf595ebde;hb=56bcb1933f6de613e5d8689e23420d47b65425c3;hp=f3b58e57e3ac22939fb28cae9c02c691a3607a30;hpb=9b7640b898c61eb4ff49140880f2bb2b70eb9f0b;p=~andy%2Fgtk diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c index f3b58e57e..af1c1b1b6 100644 --- a/gtk/gtkcssstylefuncs.c +++ b/gtk/gtkcssstylefuncs.c @@ -27,19 +27,21 @@ #include #include -#include "gtkanimationdescription.h" +#include "gtkcsscolorvalueprivate.h" #include "gtkcssimagegradientprivate.h" #include "gtkcssprovider.h" +#include "gtkcssrgbavalueprivate.h" +#include "gtkcsstypedvalueprivate.h" #include "gtkcsstypesprivate.h" -#include "gtkgradient.h" #include "gtkprivatetypebuiltins.h" -#include "gtkshadowprivate.h" #include "gtkstylecontextprivate.h" -#include "gtksymboliccolorprivate.h" #include "gtkthemingengine.h" #include "gtktypebuiltins.h" #include "gtkwin32themeprivate.h" +#include "deprecated/gtkgradientprivate.h" +#include "deprecated/gtksymboliccolorprivate.h" + /* this is in case round() is not provided by the compiler, * such as in the case of C89 compilers, like MSVC */ @@ -49,13 +51,15 @@ static GHashTable *parse_funcs = NULL; static GHashTable *print_funcs = NULL; static GHashTable *compute_funcs = NULL; -typedef gboolean (* GtkStyleParseFunc) (GtkCssParser *parser, - GFile *base, - GValue *value); -typedef void (* GtkStylePrintFunc) (const GValue *value, - GString *string); -typedef GtkCssValue * (* GtkStyleComputeFunc) (GtkStyleContext *context, - GtkCssValue *specified); +typedef gboolean (* GtkStyleParseFunc) (GtkCssParser *parser, + GValue *value); +typedef void (* GtkStylePrintFunc) (const GValue *value, + GString *string); +typedef GtkCssValue * (* GtkStyleComputeFunc) (GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssValue *specified, + GtkCssDependencies *dependencies); static void register_conversion_function (GType type, @@ -163,22 +167,16 @@ enum_print (int value, static gboolean rgba_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkSymbolicColor *symbolic; GdkRGBA rgba; - if (_gtk_css_parser_try (parser, "currentcolor", TRUE)) - { - symbolic = gtk_symbolic_color_ref (_gtk_symbolic_color_get_current_color ()); - } - else - { - symbolic = _gtk_css_parser_read_symbolic_color (parser); - if (symbolic == NULL) - return FALSE; - } + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + + symbolic = _gtk_css_symbolic_value_new (parser); + if (symbolic == NULL) + return FALSE; if (gtk_symbolic_color_resolve (symbolic, NULL, &rgba)) { @@ -192,6 +190,8 @@ rgba_value_parse (GtkCssParser *parser, g_value_take_boxed (value, symbolic); } + G_GNUC_END_IGNORE_DEPRECATIONS; + return TRUE; } @@ -212,25 +212,40 @@ rgba_value_print (const GValue *value, } static GtkCssValue * -rgba_value_compute (GtkStyleContext *context, - GtkCssValue *specified) +rgba_value_compute (GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssValue *specified, + GtkCssDependencies *dependencies) { GdkRGBA white = { 1, 1, 1, 1 }; - GtkCssValue *res; + const GValue *value; + + value = _gtk_css_typed_value_get (specified); - if (_gtk_css_value_holds (specified, GTK_TYPE_SYMBOLIC_COLOR)) + if (G_VALUE_HOLDS (value, GTK_TYPE_SYMBOLIC_COLOR)) { - GtkSymbolicColor *symbolic = _gtk_css_value_get_symbolic_color (specified); - - if (symbolic == _gtk_symbolic_color_get_current_color ()) - return _gtk_css_value_ref (_gtk_style_context_peek_property (context, "color")); - else { - res = _gtk_style_context_resolve_color_value (context, symbolic); - if (res != NULL) - return res; + GtkSymbolicColor *symbolic = g_value_get_boxed (value); + GtkCssValue *val; + GValue new_value = G_VALUE_INIT; + GdkRGBA rgba; + + val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (symbolic), + provider, + _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR), + GTK_CSS_DEPENDS_ON_COLOR, + dependencies); + if (val != NULL) + { + rgba = *_gtk_css_rgba_value_get_rgba (val); + _gtk_css_value_unref (val); + } + else + rgba = white; - return _gtk_css_value_new_from_rgba (&white); - } + g_value_init (&new_value, GDK_TYPE_RGBA); + g_value_set_boxed (&new_value, &rgba); + return _gtk_css_typed_value_new_take (&new_value); } else return _gtk_css_value_ref (specified); @@ -238,13 +253,14 @@ rgba_value_compute (GtkStyleContext *context, static gboolean color_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkSymbolicColor *symbolic; GdkRGBA rgba; - symbolic = _gtk_css_parser_read_symbolic_color (parser); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + + symbolic = _gtk_css_symbolic_value_new (parser); if (symbolic == NULL) return FALSE; @@ -265,6 +281,8 @@ color_value_parse (GtkCssParser *parser, g_value_take_boxed (value, symbolic); } + G_GNUC_END_IGNORE_DEPRECATIONS; + return TRUE; } @@ -285,24 +303,39 @@ color_value_print (const GValue *value, } static GtkCssValue * -color_value_compute (GtkStyleContext *context, - GtkCssValue *specified) +color_value_compute (GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssValue *specified, + GtkCssDependencies *dependencies) { - GdkRGBA rgba; GdkColor color = { 0, 65535, 65535, 65535 }; + const GValue *value; - if (_gtk_css_value_holds (specified, GTK_TYPE_SYMBOLIC_COLOR)) + value = _gtk_css_typed_value_get (specified); + + if (G_VALUE_HOLDS (value, GTK_TYPE_SYMBOLIC_COLOR)) { - if (_gtk_style_context_resolve_color (context, - _gtk_css_value_get_symbolic_color (specified), - &rgba)) + GValue new_value = G_VALUE_INIT; + GtkCssValue *val; + + val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (g_value_get_boxed (value)), + provider, + _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR), + GTK_CSS_DEPENDS_ON_COLOR, + dependencies); + if (val != NULL) { - color.red = rgba.red * 65535. + 0.5; - color.green = rgba.green * 65535. + 0.5; - color.blue = rgba.blue * 65535. + 0.5; + const GdkRGBA *rgba = _gtk_css_rgba_value_get_rgba (val); + color.red = rgba->red * 65535. + 0.5; + color.green = rgba->green * 65535. + 0.5; + color.blue = rgba->blue * 65535. + 0.5; + _gtk_css_value_unref (val); } - return _gtk_css_value_new_from_color (&color); + g_value_init (&new_value, GDK_TYPE_COLOR); + g_value_set_boxed (&new_value, &color); + return _gtk_css_typed_value_new_take (&new_value); } else return _gtk_css_value_ref (specified); @@ -310,21 +343,13 @@ color_value_compute (GtkStyleContext *context, static gboolean symbolic_color_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkSymbolicColor *symbolic; - if (_gtk_css_parser_try (parser, "currentcolor", TRUE)) - { - symbolic = gtk_symbolic_color_ref (_gtk_symbolic_color_get_current_color ()); - } - else - { - symbolic = _gtk_css_parser_read_symbolic_color (parser); - if (symbolic == NULL) - return FALSE; - } + symbolic = _gtk_css_symbolic_value_new (parser); + if (symbolic == NULL) + return FALSE; g_value_take_boxed (value, symbolic); return TRUE; @@ -336,6 +361,8 @@ symbolic_color_value_print (const GValue *value, { GtkSymbolicColor *symbolic = g_value_get_boxed (value); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + if (symbolic == NULL) g_string_append (string, "none"); else @@ -344,11 +371,12 @@ symbolic_color_value_print (const GValue *value, g_string_append (string, s); g_free (s); } + + G_GNUC_END_IGNORE_DEPRECATIONS; } static gboolean font_description_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { PangoFontDescription *font_desc; @@ -390,7 +418,6 @@ font_description_value_print (const GValue *value, static gboolean boolean_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { if (_gtk_css_parser_try (parser, "true", TRUE) || @@ -424,14 +451,13 @@ boolean_value_print (const GValue *value, static gboolean int_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { gint i; if (_gtk_css_parser_begins_with (parser, '-')) { - int res = _gtk_win32_theme_int_parse (parser, base, &i); + int res = _gtk_win32_theme_int_parse (parser, &i); if (res >= 0) { g_value_set_int (value, i); @@ -459,7 +485,6 @@ int_value_print (const GValue *value, static gboolean uint_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { guint u; @@ -483,7 +508,6 @@ uint_value_print (const GValue *value, static gboolean double_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { gdouble d; @@ -507,7 +531,6 @@ double_value_print (const GValue *value, static gboolean float_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { gdouble d; @@ -531,7 +554,6 @@ float_value_print (const GValue *value, static gboolean string_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { char *str = _gtk_css_parser_read_string (parser); @@ -552,7 +574,6 @@ string_value_print (const GValue *value, static gboolean theming_engine_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkThemingEngine *engine; @@ -604,46 +625,8 @@ theming_engine_value_print (const GValue *value, } } -static gboolean -animation_description_value_parse (GtkCssParser *parser, - GFile *base, - GValue *value) -{ - GtkAnimationDescription *desc; - char *str; - - str = _gtk_css_parser_read_value (parser); - if (str == NULL) - return FALSE; - - desc = _gtk_animation_description_from_string (str); - g_free (str); - - if (desc == NULL) - { - _gtk_css_parser_error (parser, "Invalid animation description"); - return FALSE; - } - - g_value_take_boxed (value, desc); - return TRUE; -} - -static void -animation_description_value_print (const GValue *value, - GString *string) -{ - GtkAnimationDescription *desc = g_value_get_boxed (value); - - if (desc == NULL) - g_string_append (string, "none"); - else - _gtk_animation_description_print (desc, string); -} - static gboolean border_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkBorder border = { 0, }; @@ -656,7 +639,7 @@ border_value_parse (GtkCssParser *parser, { /* These are strictly speaking signed, but we want to be able to use them for unsigned types too, as the actual ranges of values make this safe */ - int res = _gtk_win32_theme_int_parse (parser, base, &numbers[i]); + int res = _gtk_win32_theme_int_parse (parser, &numbers[i]); if (res == 0) /* Parse error, report */ return FALSE; @@ -714,7 +697,6 @@ border_value_print (const GValue *value, GString *string) static gboolean gradient_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GtkGradient *gradient; @@ -733,6 +715,8 @@ gradient_value_print (const GValue *value, { GtkGradient *gradient = g_value_get_boxed (value); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + if (gradient == NULL) g_string_append (string, "none"); else @@ -741,11 +725,12 @@ gradient_value_print (const GValue *value, g_string_append (string, s); g_free (s); } + + G_GNUC_END_IGNORE_DEPRECATIONS; } static gboolean pattern_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { if (_gtk_css_parser_try (parser, "none", TRUE)) @@ -756,7 +741,7 @@ pattern_value_parse (GtkCssParser *parser, { g_value_unset (value); g_value_init (value, GTK_TYPE_GRADIENT); - return gradient_value_parse (parser, base, value); + return gradient_value_parse (parser, value); } else { @@ -769,7 +754,7 @@ pattern_value_parse (GtkCssParser *parser, cairo_t *cr; cairo_matrix_t matrix; - file = _gtk_css_parser_read_url (parser, base); + file = _gtk_css_parser_read_url (parser); if (file == NULL) return FALSE; @@ -864,9 +849,11 @@ pattern_value_print (const GValue *value, } surface_print (surface, string); break; - case CAIRO_PATTERN_TYPE_SOLID: case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: + g_string_append (string, "none /* FIXME: add support for printing gradients */"); + break; + case CAIRO_PATTERN_TYPE_SOLID: default: g_assert_not_reached (); break; @@ -874,192 +861,31 @@ pattern_value_print (const GValue *value, } static GtkCssValue * -pattern_value_compute (GtkStyleContext *context, - GtkCssValue *specified) +pattern_value_compute (GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssValue *specified, + GtkCssDependencies *dependencies) { - if (_gtk_css_value_holds (specified, GTK_TYPE_GRADIENT)) + const GValue *value = _gtk_css_typed_value_get (specified); + + if (G_VALUE_HOLDS (value, GTK_TYPE_GRADIENT)) { + GValue new_value = G_VALUE_INIT; cairo_pattern_t *gradient; - gradient = gtk_gradient_resolve_for_context (_gtk_css_value_get_gradient (specified), context); + gradient = _gtk_gradient_resolve_full (g_value_get_boxed (value), provider, values, parent_values, dependencies); - return _gtk_css_value_new_take_pattern (gradient); + g_value_init (&new_value, CAIRO_GOBJECT_TYPE_PATTERN); + g_value_take_boxed (&new_value, gradient); + return _gtk_css_typed_value_new_take (&new_value); } else return _gtk_css_value_ref (specified); } -static gboolean -shadow_value_parse (GtkCssParser *parser, - GFile *base, - GValue *value) -{ - gboolean have_inset, have_color, have_lengths; - gdouble hoffset, voffset, blur, spread; - GtkSymbolicColor *color; - GtkShadow *shadow; - guint i; - - if (_gtk_css_parser_try (parser, "none", TRUE)) - return TRUE; - - shadow = _gtk_shadow_new (); - - do - { - have_inset = have_lengths = have_color = FALSE; - - for (i = 0; i < 3; i++) - { - if (!have_inset && - _gtk_css_parser_try (parser, "inset", TRUE)) - { - have_inset = TRUE; - continue; - } - - if (!have_lengths && - _gtk_css_parser_try_double (parser, &hoffset)) - { - have_lengths = TRUE; - - if (!_gtk_css_parser_try_double (parser, &voffset)) - { - _gtk_css_parser_error (parser, "Horizontal and vertical offsets are required"); - _gtk_shadow_unref (shadow); - return FALSE; - } - - if (!_gtk_css_parser_try_double (parser, &blur)) - blur = 0; - - if (!_gtk_css_parser_try_double (parser, &spread)) - spread = 0; - - continue; - } - - if (!have_color) - { - have_color = TRUE; - - /* XXX: the color is optional and UA-defined if it's missing, - * but it doesn't really make sense for us... - */ - color = _gtk_css_parser_read_symbolic_color (parser); - - if (color == NULL) - { - _gtk_shadow_unref (shadow); - return FALSE; - } - } - } - - if (!have_color || !have_lengths) - { - _gtk_css_parser_error (parser, "Must specify at least color and offsets"); - _gtk_shadow_unref (shadow); - return FALSE; - } - - _gtk_shadow_append (shadow, - hoffset, voffset, - blur, spread, - have_inset, color); - - gtk_symbolic_color_unref (color); - - } - while (_gtk_css_parser_try (parser, ",", TRUE)); - - g_value_take_boxed (value, shadow); - return TRUE; -} - -static void -shadow_value_print (const GValue *value, - GString *string) -{ - GtkShadow *shadow; - - shadow = g_value_get_boxed (value); - - if (shadow == NULL) - g_string_append (string, "none"); - else - _gtk_shadow_print (shadow, string); -} - -static GtkCssValue * -shadow_value_compute (GtkStyleContext *context, - GtkCssValue *specified) -{ - GtkShadow *shadow; - - shadow = _gtk_css_value_get_shadow (specified); - if (shadow) - shadow = _gtk_shadow_resolve (shadow, context); - - return _gtk_css_value_new_take_shadow (shadow); -} - -static gboolean -border_image_repeat_value_parse (GtkCssParser *parser, - GFile *file, - GValue *value) -{ - GtkCssBorderImageRepeat image_repeat; - GtkCssBorderRepeatStyle styles[2]; - gint i, v; - - for (i = 0; i < 2; i++) - { - if (_gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_BORDER_REPEAT_STYLE, &v)) - styles[i] = v; - else if (i == 0) - { - styles[1] = styles[0] = GTK_CSS_REPEAT_STYLE_STRETCH; - break; - } - else - styles[i] = styles[0]; - } - - image_repeat.hrepeat = styles[0]; - image_repeat.vrepeat = styles[1]; - - g_value_set_boxed (value, &image_repeat); - - return TRUE; -} - -static void -border_image_repeat_value_print (const GValue *value, - GString *string) -{ - GtkCssBorderImageRepeat *image_repeat; - - image_repeat = g_value_get_boxed (value); - - enum_print (image_repeat->hrepeat, GTK_TYPE_CSS_BORDER_REPEAT_STYLE, string); - if (image_repeat->hrepeat != image_repeat->vrepeat) - { - g_string_append (string, " "); - enum_print (image_repeat->vrepeat, GTK_TYPE_CSS_BORDER_REPEAT_STYLE, string); - } -} - -static void -css_number_print (const GValue *value, - GString *string) -{ - _gtk_css_number_print (g_value_get_boxed (value), string); -} - static gboolean enum_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { int v; @@ -1082,7 +908,6 @@ enum_value_print (const GValue *value, static gboolean flags_value_parse (GtkCssParser *parser, - GFile *base, GValue *value) { GFlagsClass *flags_class; @@ -1208,10 +1033,6 @@ gtk_css_style_funcs_init (void) theming_engine_value_parse, theming_engine_value_print, NULL); - register_conversion_function (GTK_TYPE_ANIMATION_DESCRIPTION, - animation_description_value_parse, - animation_description_value_print, - NULL); register_conversion_function (GTK_TYPE_BORDER, border_value_parse, border_value_print, @@ -1224,18 +1045,6 @@ gtk_css_style_funcs_init (void) pattern_value_parse, pattern_value_print, pattern_value_compute); - register_conversion_function (GTK_TYPE_CSS_BORDER_IMAGE_REPEAT, - border_image_repeat_value_parse, - border_image_repeat_value_print, - NULL); - register_conversion_function (GTK_TYPE_SHADOW, - shadow_value_parse, - shadow_value_print, - shadow_value_compute); - register_conversion_function (GTK_TYPE_CSS_NUMBER, - NULL, - css_number_print, - NULL); register_conversion_function (G_TYPE_ENUM, enum_value_parse, enum_value_print, @@ -1250,7 +1059,6 @@ gtk_css_style_funcs_init (void) * _gtk_css_style_parse_value: * @value: the value to parse into. Must be a valid initialized #GValue * @parser: the parser to parse from - * @base: the base URL for @parser * * This is the generic parsing function used for CSS values. If the * function fails to parse a value, it will emit an error on @parser, @@ -1260,8 +1068,7 @@ gtk_css_style_funcs_init (void) **/ gboolean _gtk_css_style_parse_value (GValue *value, - GtkCssParser *parser, - GFile *base) + GtkCssParser *parser) { GtkStyleParseFunc func; @@ -1284,7 +1091,7 @@ _gtk_css_style_parse_value (GValue *value, return FALSE; } - return (*func) (parser, base, value); + return (*func) (parser, value); } /** @@ -1322,23 +1129,35 @@ _gtk_css_style_print_value (const GValue *value, /** * _gtk_css_style_compute_value: - * @computed: (out): a value to be filled with the result - * @context: the context to use for computing the value + * @provider: Style provider to look up information from + * @values: The values to compute for + * @parent_values: Values to look up inherited values from + * @target_type: Type the resulting value should have * @specified: the value to use for the computation + * @dependencies: (out): Value initialized with 0 to take the dependencies + * of the returned value * * Converts the @specified value into the @computed value using the * information in @context. The values must have matching types, ie * @specified must be a result of a call to * _gtk_css_style_parse_value() with the same type as @computed. + * + * Returns: the resulting value **/ GtkCssValue * -_gtk_css_style_compute_value (GtkStyleContext *context, - GType target_type, - GtkCssValue *specified) +_gtk_css_style_compute_value (GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GType target_type, + GtkCssValue *specified, + GtkCssDependencies *dependencies) { GtkStyleComputeFunc func; - g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); + g_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL); + g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL); + g_return_val_if_fail (*dependencies == 0, NULL); gtk_css_style_funcs_init (); @@ -1349,7 +1168,7 @@ _gtk_css_style_compute_value (GtkStyleContext *context, GSIZE_TO_POINTER (g_type_fundamental (target_type))); if (func) - return func (context, specified); + return func (provider, values, parent_values, specified, dependencies); else return _gtk_css_value_ref (specified); }