[gtk+/wip/css: 123/154] css: Handle 'currentColor' special value



commit c1e3b8b066516ee8d9d6bec1cc40f3d863334045
Author: Benjamin Otte <otte redhat com>
Date:   Tue Jan 3 04:38:09 2012 +0100

    css: Handle 'currentColor' special value
    
    Computes to the value of the 'color' property, or when used on that
    property, is treated as 'inherit'.

 gtk/gtkcssstylefuncs.c        |   15 ++++++++++++++-
 gtk/gtkcssstylepropertyimpl.c |   26 +++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c
index af1ad5c..7b53bbb 100644
--- a/gtk/gtkcssstylefuncs.c
+++ b/gtk/gtkcssstylefuncs.c
@@ -173,6 +173,14 @@ rgba_value_parse (GtkCssParser *parser,
   GtkSymbolicColor *symbolic;
   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);
   if (symbolic == NULL)
     return FALSE;
@@ -215,7 +223,12 @@ rgba_value_compute (GValue          *computed,
 {
   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,
                                             g_value_get_boxed (specified),
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index 2d1ae65..053cafb 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -46,6 +46,30 @@
 /*** 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
 _gtk_style_property_register (const char *                   name,
                               GType                          value_type,
                               GtkStylePropertyFlags          flags,
@@ -420,7 +444,7 @@ _gtk_css_style_property_init_properties (void)
                                           GTK_STYLE_PROPERTY_INHERIT,
                                           NULL,
                                           NULL,
-                                          NULL,
+                                          color_compute,
                                           &rgba);
   gtk_style_property_register            ("font-size",
                                           G_TYPE_DOUBLE,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]