summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-07-16 14:48:43 +0200
committerBenjamin Otte <otte@redhat.com>2012-08-28 15:42:23 +0200
commit0e2f35ed882ab11d010866d32f2f65232145b8d0 (patch)
treef8e1af229adca8cdcce0b08808c3f6571615dd22
parent9e7e65ca6e01246cf9eea156f0153014b58e4d36 (diff)
downloadgtk+-0e2f35ed882ab11d010866d32f2f65232145b8d0.tar.gz
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.
-rw-r--r--gtk/gtkcssarrayvalue.c11
-rw-r--r--gtk/gtkcssbgsizevalue.c13
-rw-r--r--gtk/gtkcssbordervalue.c11
-rw-r--r--gtk/gtkcsscomputedvalues.c2
-rw-r--r--gtk/gtkcsscornervalue.c13
-rw-r--r--gtk/gtkcsseasevalue.c7
-rw-r--r--gtk/gtkcssenginevalue.c7
-rw-r--r--gtk/gtkcssenumvalue.c7
-rw-r--r--gtk/gtkcssimagelinear.c6
-rw-r--r--gtk/gtkcssimagevalue.c9
-rw-r--r--gtk/gtkcssinheritvalue.c12
-rw-r--r--gtk/gtkcssinitialvalue.c10
-rw-r--r--gtk/gtkcssnumbervalue.c9
-rw-r--r--gtk/gtkcsspositionvalue.c13
-rw-r--r--gtk/gtkcssrepeatvalue.c7
-rw-r--r--gtk/gtkcssrgbavalue.c7
-rw-r--r--gtk/gtkcssshadowsvalue.c11
-rw-r--r--gtk/gtkcssshadowvalue.c19
-rw-r--r--gtk/gtkcssstringvalue.c7
-rw-r--r--gtk/gtkcsstypedvalue.c9
-rw-r--r--gtk/gtkcsstypesprivate.h10
-rw-r--r--gtk/gtkcssvalue.c20
-rw-r--r--gtk/gtkcssvalueprivate.h6
-rw-r--r--gtk/gtksymboliccolor.c12
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)
* <ulink url="http://www.w3.org/TR/css3-cascade/#computed>
* the CSS documentation</ulink>.
*
- * Returns: the comptued value
+ * Returns: the computed value
**/
GtkCssValue *
-_gtk_css_value_compute (GtkCssValue *value,
- guint property_id,
- GtkStyleContext *context)
+_gtk_css_value_compute (GtkCssValue *value,
+ guint property_id,
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies)
{
+ GtkCssDependencies fallback;
+
g_return_val_if_fail (value != NULL, NULL);
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
- return value->class->compute (value, property_id, context);
+ if (dependencies == NULL)
+ dependencies = &fallback;
+ *dependencies = 0;
+
+ return value->class->compute (value, property_id, context, dependencies);
}
gboolean
diff --git a/gtk/gtkcssvalueprivate.h b/gtk/gtkcssvalueprivate.h
index 74550f794e..629cc754b2 100644
--- a/gtk/gtkcssvalueprivate.h
+++ b/gtk/gtkcssvalueprivate.h
@@ -44,7 +44,8 @@ struct _GtkCssValueClass {
GtkCssValue * (* compute) (GtkCssValue *value,
guint property_id,
- GtkStyleContext *context);
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies);
gboolean (* equal) (const GtkCssValue *value1,
const GtkCssValue *value2);
GtkCssValue * (* transition) (GtkCssValue *start,
@@ -65,7 +66,8 @@ void _gtk_css_value_unref (GtkCssValue
GtkCssValue *_gtk_css_value_compute (GtkCssValue *value,
guint property_id,
- GtkStyleContext *context);
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies);
gboolean _gtk_css_value_equal (const GtkCssValue *value1,
const GtkCssValue *value2);
gboolean _gtk_css_value_equal0 (const GtkCssValue *value1,
diff --git a/gtk/gtksymboliccolor.c b/gtk/gtksymboliccolor.c
index 8429bbc67b..9fcfd4957e 100644
--- a/gtk/gtksymboliccolor.c
+++ b/gtk/gtksymboliccolor.c
@@ -142,7 +142,8 @@ gtk_css_value_symbolic_get_fallback (guint property_id,
case GTK_CSS_PROPERTY_OUTLINE_COLOR:
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);
default:
if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
g_warning ("No fallback color defined for property '%s'",
@@ -152,12 +153,15 @@ gtk_css_value_symbolic_get_fallback (guint property_id,
}
static GtkCssValue *
-gtk_css_value_symbolic_compute (GtkCssValue *value,
- guint property_id,
- GtkStyleContext *context)
+gtk_css_value_symbolic_compute (GtkCssValue *value,
+ guint property_id,
+ GtkStyleContext *context,
+ GtkCssDependencies *dependencies)
{
GtkCssValue *resolved, *current;
+ *dependencies = GTK_CSS_DEPENDS_ON_EVERYTHING;
+
/* The computed value of the ‘currentColor’ keyword is the computed
* value of the ‘color’ property. If the ‘currentColor’ keyword is
* set on the ‘color’ property itself, it is treated as ‘color: inherit’.