From 0e2f35ed882ab11d010866d32f2f65232145b8d0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 16 Jul 2012 14:48:43 +0200 Subject: [PATCH] css: Introduce dependencies for value computations When values are computed, they might depend on various other values and we need to track this so we can update the values when those other values change. This is the first step in making that happen. This patch does not do any dependency tracking at all, instead it uses GTK_CSS_DEPENDS_ON_EVERYTHING as a sort of FIXME. --- gtk/gtkcssarrayvalue.c | 11 +++++++---- gtk/gtkcssbgsizevalue.c | 13 ++++++++----- gtk/gtkcssbordervalue.c | 11 +++++++---- gtk/gtkcsscomputedvalues.c | 2 +- gtk/gtkcsscornervalue.c | 13 ++++++++----- gtk/gtkcsseasevalue.c | 7 ++++--- gtk/gtkcssenginevalue.c | 7 ++++--- gtk/gtkcssenumvalue.c | 7 ++++--- gtk/gtkcssimagelinear.c | 6 +++--- gtk/gtkcssimagevalue.c | 9 ++++++--- gtk/gtkcssinheritvalue.c | 12 ++++++++---- gtk/gtkcssinitialvalue.c | 10 ++++++---- gtk/gtkcssnumbervalue.c | 9 ++++++--- gtk/gtkcsspositionvalue.c | 13 ++++++++----- gtk/gtkcssrepeatvalue.c | 7 ++++--- gtk/gtkcssrgbavalue.c | 7 ++++--- gtk/gtkcssshadowsvalue.c | 11 +++++++---- gtk/gtkcssshadowvalue.c | 19 +++++++++++-------- gtk/gtkcssstringvalue.c | 7 ++++--- gtk/gtkcsstypedvalue.c | 9 ++++++--- gtk/gtkcsstypesprivate.h | 10 ++++++++++ gtk/gtkcssvalue.c | 20 +++++++++++++++----- gtk/gtkcssvalueprivate.h | 6 ++++-- gtk/gtksymboliccolor.c | 12 ++++++++---- 24 files changed, 153 insertions(+), 85 deletions(-) diff --git a/gtk/gtkcssarrayvalue.c b/gtk/gtkcssarrayvalue.c index a4fa0f4b62..418ac65598 100644 --- a/gtk/gtkcssarrayvalue.c +++ b/gtk/gtkcssarrayvalue.c @@ -41,9 +41,10 @@ gtk_css_value_array_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_array_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_array_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssValue *result; gboolean changed = FALSE; @@ -52,10 +53,12 @@ gtk_css_value_array_compute (GtkCssValue *value, if (value->n_values == 0) return _gtk_css_value_ref (value); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + result = _gtk_css_array_value_new_from_array (value->values, value->n_values); for (i = 0; i < value->n_values; i++) { - result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context); + result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, NULL); changed |= (result->values[i] != value->values[i]); } diff --git a/gtk/gtkcssbgsizevalue.c b/gtk/gtkcssbgsizevalue.c index 38f605496e..2bff385b9f 100644 --- a/gtk/gtkcssbgsizevalue.c +++ b/gtk/gtkcssbgsizevalue.c @@ -41,15 +41,18 @@ gtk_css_value_bg_size_free (GtkCssValue *value) } GtkCssValue * -gtk_css_value_bg_size_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_bg_size_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { if (value->x == NULL && value->y == NULL) return _gtk_css_value_ref (value); - return _gtk_css_bg_size_value_new (value->x ? _gtk_css_value_compute (value->x, property_id, context) : NULL, - value->y ? _gtk_css_value_compute (value->y, property_id, context) : NULL); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + + return _gtk_css_bg_size_value_new (value->x ? _gtk_css_value_compute (value->x, property_id, context, NULL) : NULL, + value->y ? _gtk_css_value_compute (value->y, property_id, context, NULL) : NULL); } static gboolean diff --git a/gtk/gtkcssbordervalue.c b/gtk/gtkcssbordervalue.c index 45f7fd14e4..085e3f2e40 100644 --- a/gtk/gtkcssbordervalue.c +++ b/gtk/gtkcssbordervalue.c @@ -42,14 +42,17 @@ gtk_css_value_border_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_border_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_border_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssValue *computed; gboolean changed = FALSE; guint i; + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + computed = _gtk_css_border_value_new (NULL, NULL, NULL, NULL); computed->fill = value->fill; @@ -57,7 +60,7 @@ gtk_css_value_border_compute (GtkCssValue *value, { if (value->values[i]) { - computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, context); + computed->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, NULL); changed |= (computed->values[i] != value->values[i]); } } diff --git a/gtk/gtkcsscomputedvalues.c b/gtk/gtkcsscomputedvalues.c index 7aa121f023..ad0353046d 100644 --- a/gtk/gtkcsscomputedvalues.c +++ b/gtk/gtkcsscomputedvalues.c @@ -113,7 +113,7 @@ _gtk_css_computed_values_compute_value (GtkCssComputedValues *values, else _gtk_css_value_ref (specified); - g_ptr_array_index (values->values, id) = _gtk_css_value_compute (specified, id, context); + g_ptr_array_index (values->values, id) = _gtk_css_value_compute (specified, id, context, NULL); if (section) { diff --git a/gtk/gtkcsscornervalue.c b/gtk/gtkcsscornervalue.c index 7e41688950..8710243aff 100644 --- a/gtk/gtkcsscornervalue.c +++ b/gtk/gtkcsscornervalue.c @@ -37,14 +37,17 @@ gtk_css_value_corner_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_corner_compute (GtkCssValue *corner, - guint property_id, - GtkStyleContext *context) +gtk_css_value_corner_compute (GtkCssValue *corner, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssValue *x, *y; - x = _gtk_css_value_compute (corner->x, property_id, context); - y = _gtk_css_value_compute (corner->y, property_id, context); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + + x = _gtk_css_value_compute (corner->x, property_id, context, NULL); + y = _gtk_css_value_compute (corner->y, property_id, context, NULL); if (x == corner->x && y == corner->y) { _gtk_css_value_unref (x); diff --git a/gtk/gtkcsseasevalue.c b/gtk/gtkcsseasevalue.c index 122d6c1299..81c9bce56a 100644 --- a/gtk/gtkcsseasevalue.c +++ b/gtk/gtkcsseasevalue.c @@ -50,9 +50,10 @@ gtk_css_value_ease_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_ease_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_ease_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcssenginevalue.c b/gtk/gtkcssenginevalue.c index 8041090a09..a39ac6c57d 100644 --- a/gtk/gtkcssenginevalue.c +++ b/gtk/gtkcssenginevalue.c @@ -35,9 +35,10 @@ gtk_css_value_engine_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_engine_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_engine_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcssenumvalue.c b/gtk/gtkcssenumvalue.c index fb9c836388..9ea7ae8f01 100644 --- a/gtk/gtkcssenumvalue.c +++ b/gtk/gtkcssenumvalue.c @@ -36,9 +36,10 @@ gtk_css_value_enum_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_enum_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_enum_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcssimagelinear.c b/gtk/gtkcssimagelinear.c index 10977e8ff2..998d3660cf 100644 --- a/gtk/gtkcssimagelinear.c +++ b/gtk/gtkcssimagelinear.c @@ -420,7 +420,7 @@ gtk_css_image_linear_compute (GtkCssImage *image, copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL); copy->repeating = linear->repeating; - copy->angle = _gtk_css_value_compute (linear->angle, property_id, context); + copy->angle = _gtk_css_value_compute (linear->angle, property_id, context, NULL); g_array_set_size (copy->stops, linear->stops->len); for (i = 0; i < linear->stops->len; i++) @@ -430,10 +430,10 @@ gtk_css_image_linear_compute (GtkCssImage *image, stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i); scopy = &g_array_index (copy->stops, GtkCssImageLinearColorStop, i); - scopy->color = _gtk_css_value_compute (stop->color, property_id, context); + scopy->color = _gtk_css_value_compute (stop->color, property_id, context, NULL); if (stop->offset) - scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context); + scopy->offset = _gtk_css_value_compute (stop->offset, property_id, context, NULL); else scopy->offset = NULL; } diff --git a/gtk/gtkcssimagevalue.c b/gtk/gtkcssimagevalue.c index 5cd4929234..e56db9d476 100644 --- a/gtk/gtkcssimagevalue.c +++ b/gtk/gtkcssimagevalue.c @@ -34,9 +34,10 @@ gtk_css_value_image_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_image_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_image_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssImage *image, *computed; @@ -53,6 +54,8 @@ gtk_css_value_image_compute (GtkCssValue *value, return _gtk_css_value_ref (value); } + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + return _gtk_css_image_value_new (computed); } diff --git a/gtk/gtkcssinheritvalue.c b/gtk/gtkcssinheritvalue.c index 6faeef3c84..58964be240 100644 --- a/gtk/gtkcssinheritvalue.c +++ b/gtk/gtkcssinheritvalue.c @@ -34,18 +34,22 @@ gtk_css_value_inherit_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_inherit_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_inherit_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkStyleContext *parent = gtk_style_context_get_parent (context); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + if (parent) return _gtk_css_value_ref (_gtk_style_context_peek_property (parent, property_id)); else return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)), property_id, - context); + context, + NULL); } static gboolean diff --git a/gtk/gtkcssinitialvalue.c b/gtk/gtkcssinitialvalue.c index 7bebbc87d7..45cadd7c17 100644 --- a/gtk/gtkcssinitialvalue.c +++ b/gtk/gtkcssinitialvalue.c @@ -33,13 +33,15 @@ gtk_css_value_initial_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_initial_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_initial_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value (_gtk_css_style_property_lookup_by_id (property_id)), property_id, - context); + context, + dependencies); } static gboolean diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c index 479662c22b..535c20587f 100644 --- a/gtk/gtkcssnumbervalue.c +++ b/gtk/gtkcssnumbervalue.c @@ -35,9 +35,10 @@ gtk_css_value_number_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_number_compute (GtkCssValue *number, - guint property_id, - GtkStyleContext *context) +gtk_css_value_number_compute (GtkCssValue *number, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkBorderStyle border_style; @@ -73,6 +74,8 @@ gtk_css_value_number_compute (GtkCssValue *number, break; } + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + switch (number->unit) { default: diff --git a/gtk/gtkcsspositionvalue.c b/gtk/gtkcsspositionvalue.c index 9f4b0d3f0a..6a6cbe3828 100644 --- a/gtk/gtkcsspositionvalue.c +++ b/gtk/gtkcsspositionvalue.c @@ -37,14 +37,15 @@ gtk_css_value_position_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_position_compute (GtkCssValue *position, - guint property_id, - GtkStyleContext *context) +gtk_css_value_position_compute (GtkCssValue *position, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssValue *x, *y; - x = _gtk_css_value_compute (position->x, property_id, context); - y = _gtk_css_value_compute (position->y, property_id, context); + x = _gtk_css_value_compute (position->x, property_id, context, NULL); + y = _gtk_css_value_compute (position->y, property_id, context, NULL); if (x == position->x && y == position->y) { _gtk_css_value_unref (x); @@ -52,6 +53,8 @@ gtk_css_value_position_compute (GtkCssValue *position, return _gtk_css_value_ref (position); } + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + return _gtk_css_position_value_new (x, y); } diff --git a/gtk/gtkcssrepeatvalue.c b/gtk/gtkcssrepeatvalue.c index 97fe41f349..6f070727e8 100644 --- a/gtk/gtkcssrepeatvalue.c +++ b/gtk/gtkcssrepeatvalue.c @@ -34,9 +34,10 @@ gtk_css_value_repeat_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_repeat_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_repeat_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcssrgbavalue.c b/gtk/gtkcssrgbavalue.c index 7a641a3a77..3bb6897d13 100644 --- a/gtk/gtkcssrgbavalue.c +++ b/gtk/gtkcssrgbavalue.c @@ -35,9 +35,10 @@ gtk_css_value_rgba_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_rgba_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_rgba_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c index 387076eb38..ce37d86b4d 100644 --- a/gtk/gtkcssshadowsvalue.c +++ b/gtk/gtkcssshadowsvalue.c @@ -48,9 +48,10 @@ gtk_css_value_shadows_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_shadows_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_shadows_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssValue *result; guint i; @@ -58,10 +59,12 @@ gtk_css_value_shadows_compute (GtkCssValue *value, if (value->len == 0) return _gtk_css_value_ref (value); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + result = gtk_css_shadows_value_new (value->values, value->len); for (i = 0; i < value->len; i++) { - result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context); + result->values[i] = _gtk_css_value_compute (value->values[i], property_id, context, NULL); } return result; diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 3351d6f8dd..9b2d897aea 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -60,16 +60,19 @@ gtk_css_value_shadow_free (GtkCssValue *shadow) } static GtkCssValue * -gtk_css_value_shadow_compute (GtkCssValue *shadow, - guint property_id, - GtkStyleContext *context) +gtk_css_value_shadow_compute (GtkCssValue *shadow, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { - return gtk_css_shadow_value_new (_gtk_css_value_compute (shadow->hoffset, property_id, context), - _gtk_css_value_compute (shadow->voffset, property_id, context), - _gtk_css_value_compute (shadow->radius, property_id, context), - _gtk_css_value_compute (shadow->spread, property_id, context), + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + + return gtk_css_shadow_value_new (_gtk_css_value_compute (shadow->hoffset, property_id, context, NULL), + _gtk_css_value_compute (shadow->voffset, property_id, context, NULL), + _gtk_css_value_compute (shadow->radius, property_id, context, NULL), + _gtk_css_value_compute (shadow->spread, property_id, context, NULL), shadow->inset, - _gtk_css_value_compute (shadow->color, property_id, context)); + _gtk_css_value_compute (shadow->color, property_id, context, NULL)); } static gboolean diff --git a/gtk/gtkcssstringvalue.c b/gtk/gtkcssstringvalue.c index 2bc140dd97..328fd21dc5 100644 --- a/gtk/gtkcssstringvalue.c +++ b/gtk/gtkcssstringvalue.c @@ -33,9 +33,10 @@ gtk_css_value_string_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_string_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_string_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { return _gtk_css_value_ref (value); } diff --git a/gtk/gtkcsstypedvalue.c b/gtk/gtkcsstypedvalue.c index 60eeea8c68..fd8f0ad925 100644 --- a/gtk/gtkcsstypedvalue.c +++ b/gtk/gtkcsstypedvalue.c @@ -35,12 +35,15 @@ gtk_css_value_typed_free (GtkCssValue *value) } static GtkCssValue * -gtk_css_value_typed_compute (GtkCssValue *value, - guint property_id, - GtkStyleContext *context) +gtk_css_value_typed_compute (GtkCssValue *value, + guint property_id, + GtkStyleContext *context, + GtkCssDependencies *dependencies) { GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (_gtk_css_style_property_lookup_by_id (property_id)); + *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING; + return _gtk_css_style_compute_value (context, custom->pspec->value_type, value); } diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index b0db18d0b9..dfc9527e0d 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -56,6 +56,16 @@ typedef enum { /*< skip >*/ GTK_CSS_CHANGE_PARENT_POSITION | GTK_CSS_CHANGE_PARENT_SIBLING_POSITION | \ GTK_CSS_CHANGE_PARENT_STATE | GTK_CSS_CHANGE_PARENT_SIBLING_STATE) +typedef enum /*< skip >*/ { + GTK_CSS_DEPENDS_ON_PARENT = (1 << 0), + GTK_CSS_EQUALS_PARENT = (1 << 1), + GTK_CSS_DEPENDS_ON_COLOR = (1 << 2), + GTK_CSS_DEPENDS_ON_FONT_SIZE = (1 << 3) +} GtkCssDependencies; + +#define GTK_CSS_DEPENDS_ON_EVERYTHING (GTK_CSS_DEPENDS_ON_PARENT | GTK_CSS_EQUALS_PARENT \ + | GTK_CSS_DEPENDS_ON_COLOR | GTK_CSS_DEPENDS_ON_FONT_SIZE) + enum { /*< skip >*/ GTK_CSS_PROPERTY_COLOR, GTK_CSS_PROPERTY_FONT_SIZE, diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 5d5d39227f..e057f90b50 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -66,6 +66,9 @@ _gtk_css_value_unref (GtkCssValue *value) * @value: the value to compute from * @property_id: the ID of the property to compute * @context: the context to use for resolving + * @dependencies: (out) (allow-none): Set to the dependencies of the + * computed values that indicate when this value needs to be + * recomputed and how. * * Converts the specified @value into the computed value for the CSS * property given by @property_id using the information in @context. @@ -73,17 +76,24 @@ _gtk_css_value_unref (GtkCssValue *value) *