forked from AuroraMiddleware/gtk
css: Make CSS resolving work according to spec
See inline code comments taken from http://dev.w3.org/csswg/css3-cascade/#cascade This now respects the special values "inherit" and "initial" properly. Note that those values cannot be parsed yet. This will be added in a future commit.
This commit is contained in:
parent
5a815e2159
commit
fbedcdaf7d
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include "gtkcsslookupprivate.h"
|
#include "gtkcsslookupprivate.h"
|
||||||
|
|
||||||
|
#include "gtkcsstypesprivate.h"
|
||||||
|
#include "gtkprivatetypebuiltins.h"
|
||||||
#include "gtkstylepropertyprivate.h"
|
#include "gtkstylepropertyprivate.h"
|
||||||
#include "gtkstylepropertiesprivate.h"
|
#include "gtkstylepropertiesprivate.h"
|
||||||
|
|
||||||
@ -120,13 +122,95 @@ _gtk_css_lookup_resolve (GtkCssLookup *lookup,
|
|||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
if (lookup->values[i] == NULL)
|
const GtkStyleProperty *prop = _gtk_style_property_get (i);
|
||||||
continue;
|
const GValue *result;
|
||||||
|
|
||||||
_gtk_style_properties_set_property_by_property (props,
|
/* http://www.w3.org/TR/css3-cascade/#cascade
|
||||||
_gtk_style_property_get (i),
|
* Then, for every element, the value for each property can be found
|
||||||
0,
|
* by following this pseudo-algorithm:
|
||||||
lookup->values[i]);
|
* 1) Identify all declarations that apply to the element
|
||||||
|
*/
|
||||||
|
if (lookup->values[i] != NULL)
|
||||||
|
{
|
||||||
|
/* 2) If the cascading process (described below) yields a winning
|
||||||
|
* declaration and the value of the winning declaration is not
|
||||||
|
* ‘initial’ or ‘inherit’, the value of the winning declaration
|
||||||
|
* becomes the specified value.
|
||||||
|
*/
|
||||||
|
if (!G_VALUE_HOLDS (lookup->values[i], GTK_TYPE_CSS_SPECIAL_VALUE))
|
||||||
|
{
|
||||||
|
result = lookup->values[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (g_value_get_enum (lookup->values[i]))
|
||||||
|
{
|
||||||
|
case GTK_CSS_INHERIT:
|
||||||
|
/* 3) if the value of the winning declaration is ‘inherit’,
|
||||||
|
* the inherited value (see below) becomes the specified value.
|
||||||
|
*/
|
||||||
|
result = NULL;
|
||||||
|
break;
|
||||||
|
case GTK_CSS_INITIAL:
|
||||||
|
/* if the value of the winning declaration is ‘initial’,
|
||||||
|
* the initial value (see below) becomes the specified value.
|
||||||
|
*/
|
||||||
|
result = _gtk_style_property_get_initial_value (prop);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* This is part of (2) above */
|
||||||
|
result = lookup->values[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_gtk_style_property_is_inherit (prop))
|
||||||
|
{
|
||||||
|
/* 4) if the property is inherited, the inherited value becomes
|
||||||
|
* the specified value.
|
||||||
|
*/
|
||||||
|
result = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* 5) Otherwise, the initial value becomes the specified value.
|
||||||
|
*/
|
||||||
|
result = _gtk_style_property_get_initial_value (prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
_gtk_style_properties_set_property_by_property (props,
|
||||||
|
prop,
|
||||||
|
0,
|
||||||
|
result);
|
||||||
|
}
|
||||||
|
else if (parent == NULL)
|
||||||
|
{
|
||||||
|
/* If the ‘inherit’ value is set on the root element, the property is
|
||||||
|
* assigned its initial value. */
|
||||||
|
_gtk_style_properties_set_property_by_property (props,
|
||||||
|
prop,
|
||||||
|
0,
|
||||||
|
_gtk_style_property_get_initial_value (prop));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GValue value = { 0, };
|
||||||
|
/* Set NULL here and do the inheritance upon lookup? */
|
||||||
|
gtk_style_context_get_property (parent,
|
||||||
|
prop->pspec->name,
|
||||||
|
gtk_style_context_get_state (parent),
|
||||||
|
&value);
|
||||||
|
_gtk_style_properties_set_property_by_property (props,
|
||||||
|
prop,
|
||||||
|
0,
|
||||||
|
&value);
|
||||||
|
g_value_unset (&value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return props;
|
return props;
|
||||||
|
Loading…
Reference in New Issue
Block a user