diff options
author | Alexander Larsson <alexl@redhat.com> | 2012-03-06 14:16:32 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2012-03-08 11:03:57 +0100 |
commit | 7603e6e47395b8e1d66522a22255637fa10d3a47 (patch) | |
tree | 0f5e58f31234cea8f6b6503e2b85b646dc603b29 /gtk/gtkcssstylefuncs.c | |
parent | 0ece7a5de3eae5f4d7e4d1623d191a0a0628e652 (diff) | |
download | gtk+-7603e6e47395b8e1d66522a22255637fa10d3a47.tar.gz |
css: Use GtkCssValues instead of GValue in the css machinery
Also, in places where we're computing a new CssValue based on an
old one, make sure that if nothing changes we're returning a reference
to the old one, rather than creating a new identical instance.
Diffstat (limited to 'gtk/gtkcssstylefuncs.c')
-rw-r--r-- | gtk/gtkcssstylefuncs.c | 94 |
1 files changed, 44 insertions, 50 deletions
diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c index e2ccd75505..b1e373e82a 100644 --- a/gtk/gtkcssstylefuncs.c +++ b/gtk/gtkcssstylefuncs.c @@ -54,9 +54,8 @@ typedef gboolean (* GtkStyleParseFunc) (GtkCssParser GValue *value); typedef void (* GtkStylePrintFunc) (const GValue *value, GString *string); -typedef void (* GtkStyleComputeFunc) (GValue *computed, - GtkStyleContext *context, - const GValue *specified); +typedef GtkCssValue * (* GtkStyleComputeFunc) (GtkStyleContext *context, + GtkCssValue *specified); static void register_conversion_function (GType type, @@ -212,31 +211,31 @@ rgba_value_print (const GValue *value, } } -static void -rgba_value_compute (GValue *computed, - GtkStyleContext *context, - const GValue *specified) +static GtkCssValue * +rgba_value_compute (GtkStyleContext *context, + GtkCssValue *specified) { GdkRGBA rgba, white = { 1, 1, 1, 1 }; - - if (G_VALUE_HOLDS (specified, GTK_TYPE_CSS_SPECIAL_VALUE)) + + if (_gtk_css_value_holds (specified, GTK_TYPE_CSS_SPECIAL_VALUE)) { + return _gtk_css_value_new_from_rgba (NULL); } - else if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR)) + else if (_gtk_css_value_holds (specified, GTK_TYPE_SYMBOLIC_COLOR)) { - GtkSymbolicColor *symbolic = g_value_get_boxed (specified); - + GtkSymbolicColor *symbolic = _gtk_css_value_get_symbolic_color (specified); + if (symbolic == _gtk_symbolic_color_get_current_color ()) - g_value_copy (_gtk_style_context_peek_property (context, "color"), computed); + return _gtk_css_value_ref (_gtk_style_context_peek_property (context, "color")); else if (_gtk_style_context_resolve_color (context, symbolic, &rgba)) - g_value_set_boxed (computed, &rgba); + return _gtk_css_value_new_from_rgba (&rgba); else - g_value_set_boxed (computed, &white); + return _gtk_css_value_new_from_rgba (&white); } else - g_value_copy (specified, computed); + return _gtk_css_value_ref (specified); } static gboolean @@ -287,18 +286,17 @@ color_value_print (const GValue *value, } } -static void -color_value_compute (GValue *computed, - GtkStyleContext *context, - const GValue *specified) +static GtkCssValue * +color_value_compute (GtkStyleContext *context, + GtkCssValue *specified) { GdkRGBA rgba; GdkColor color = { 0, 65535, 65535, 65535 }; - if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR)) + if (_gtk_css_value_holds (specified, GTK_TYPE_SYMBOLIC_COLOR)) { if (_gtk_style_context_resolve_color (context, - g_value_get_boxed (specified), + _gtk_css_value_get_symbolic_color (specified), &rgba)) { color.red = rgba.red * 65535. + 0.5; @@ -306,10 +304,10 @@ color_value_compute (GValue *computed, color.blue = rgba.blue * 65535. + 0.5; } - g_value_set_boxed (computed, &color); + return _gtk_css_value_new_from_color (&color); } else - g_value_copy (specified, computed); + return _gtk_css_value_ref (specified); } static gboolean @@ -877,21 +875,20 @@ pattern_value_print (const GValue *value, } } -static void -pattern_value_compute (GValue *computed, - GtkStyleContext *context, - const GValue *specified) +static GtkCssValue * +pattern_value_compute (GtkStyleContext *context, + GtkCssValue *specified) { - if (G_VALUE_HOLDS (specified, GTK_TYPE_GRADIENT)) + if (_gtk_css_value_holds (specified, GTK_TYPE_GRADIENT)) { cairo_pattern_t *gradient; - gradient = gtk_gradient_resolve_for_context (g_value_get_boxed (specified), context); + gradient = gtk_gradient_resolve_for_context (_gtk_css_value_get_gradient (specified), context); - g_value_take_boxed (computed, gradient); + return _gtk_css_value_new_take_pattern (gradient); } else - g_value_copy (specified, computed); + return _gtk_css_value_ref (specified); } static gboolean @@ -996,18 +993,17 @@ shadow_value_print (const GValue *value, _gtk_shadow_print (shadow, string); } -static void -shadow_value_compute (GValue *computed, - GtkStyleContext *context, - const GValue *specified) +static GtkCssValue * +shadow_value_compute (GtkStyleContext *context, + GtkCssValue *specified) { GtkShadow *shadow; - - shadow = g_value_get_boxed (specified); + + shadow = _gtk_css_value_get_shadow (specified); if (shadow) shadow = _gtk_shadow_resolve (shadow, context); - g_value_take_boxed (computed, shadow); + return _gtk_css_value_new_take_shadow (shadow); } static gboolean @@ -1337,28 +1333,26 @@ _gtk_css_style_print_value (const GValue *value, * @specified must be a result of a call to * _gtk_css_style_parse_value() with the same type as @computed. **/ -void -_gtk_css_style_compute_value (GValue *computed, - GtkStyleContext *context, - const GValue *specified) +GtkCssValue * +_gtk_css_style_compute_value (GtkStyleContext *context, + GType target_type, + GtkCssValue *specified) { GtkStyleComputeFunc func; - g_return_if_fail (G_IS_VALUE (computed)); - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (G_IS_VALUE (specified)); + g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); gtk_css_style_funcs_init (); func = g_hash_table_lookup (compute_funcs, - GSIZE_TO_POINTER (G_VALUE_TYPE (computed))); + GSIZE_TO_POINTER (target_type)); if (func == NULL) func = g_hash_table_lookup (compute_funcs, - GSIZE_TO_POINTER (g_type_fundamental (G_VALUE_TYPE (computed)))); + GSIZE_TO_POINTER (g_type_fundamental (target_type))); if (func) - func (computed, context, specified); + return func (context, specified); else - g_value_copy (specified, computed); + return _gtk_css_value_ref (specified); } |