css: Handle 'currentColor' special value
Computes to the value of the 'color' property, or when used on that property, is treated as 'inherit'.
This commit is contained in:
@ -173,6 +173,14 @@ rgba_value_parse (GtkCssParser *parser,
|
|||||||
GtkSymbolicColor *symbolic;
|
GtkSymbolicColor *symbolic;
|
||||||
GdkRGBA rgba;
|
GdkRGBA rgba;
|
||||||
|
|
||||||
|
if (_gtk_css_parser_try (parser, "currentcolor", TRUE))
|
||||||
|
{
|
||||||
|
g_value_unset (value);
|
||||||
|
g_value_init (value, GTK_TYPE_CSS_SPECIAL_VALUE);
|
||||||
|
g_value_set_enum (value, GTK_CSS_CURRENT_COLOR);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
symbolic = _gtk_css_parser_read_symbolic_color (parser);
|
symbolic = _gtk_css_parser_read_symbolic_color (parser);
|
||||||
if (symbolic == NULL)
|
if (symbolic == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -215,7 +223,12 @@ rgba_value_compute (GValue *computed,
|
|||||||
{
|
{
|
||||||
GdkRGBA rgba, white = { 1, 1, 1, 1 };
|
GdkRGBA rgba, white = { 1, 1, 1, 1 };
|
||||||
|
|
||||||
if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR))
|
if (G_VALUE_HOLDS (specified, GTK_TYPE_CSS_SPECIAL_VALUE))
|
||||||
|
{
|
||||||
|
g_assert (g_value_get_enum (specified) == GTK_CSS_CURRENT_COLOR);
|
||||||
|
g_value_copy (_gtk_style_context_peek_property (context, "color"), computed);
|
||||||
|
}
|
||||||
|
else if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR))
|
||||||
{
|
{
|
||||||
if (_gtk_style_context_resolve_color (context,
|
if (_gtk_style_context_resolve_color (context,
|
||||||
g_value_get_boxed (specified),
|
g_value_get_boxed (specified),
|
||||||
|
@ -45,6 +45,30 @@
|
|||||||
|
|
||||||
/*** REGISTRATION ***/
|
/*** REGISTRATION ***/
|
||||||
|
|
||||||
|
static void
|
||||||
|
color_compute (GtkCssStyleProperty *property,
|
||||||
|
GValue *computed,
|
||||||
|
GtkStyleContext *context,
|
||||||
|
const GValue *specified)
|
||||||
|
{
|
||||||
|
g_value_init (computed, GDK_TYPE_RGBA);
|
||||||
|
|
||||||
|
if (G_VALUE_HOLDS (specified, GTK_TYPE_CSS_SPECIAL_VALUE))
|
||||||
|
{
|
||||||
|
GtkStyleContext *parent = gtk_style_context_get_parent (context);
|
||||||
|
g_assert (g_value_get_enum (specified) == GTK_CSS_CURRENT_COLOR);
|
||||||
|
|
||||||
|
if (parent)
|
||||||
|
g_value_copy (_gtk_style_context_peek_property (parent, "color"), computed);
|
||||||
|
else
|
||||||
|
_gtk_css_style_compute_value (computed,
|
||||||
|
context,
|
||||||
|
_gtk_css_style_property_get_initial_value (property));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_gtk_css_style_compute_value (computed, context, specified);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_gtk_style_property_register (const char * name,
|
_gtk_style_property_register (const char * name,
|
||||||
GType value_type,
|
GType value_type,
|
||||||
@ -420,7 +444,7 @@ _gtk_css_style_property_init_properties (void)
|
|||||||
GTK_STYLE_PROPERTY_INHERIT,
|
GTK_STYLE_PROPERTY_INHERIT,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
color_compute,
|
||||||
&rgba);
|
&rgba);
|
||||||
gtk_style_property_register ("font-size",
|
gtk_style_property_register ("font-size",
|
||||||
G_TYPE_DOUBLE,
|
G_TYPE_DOUBLE,
|
||||||
|
Reference in New Issue
Block a user