[gtk/fix-current-color] Try to make late resolution of currentcolor work



commit 6078c545af9ba3c5dd04479610291caf5fb6e9ca
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Apr 15 21:16:09 2020 -0400

    Try to make late resolution of currentcolor work

 gtk/gskpango.c                | 13 +++++++------
 gtk/gtkcsscolorvalue.c        | 37 +++++++++++++++++++++++++++++++------
 gtk/gtkcsscolorvalueprivate.h |  4 ++--
 gtk/gtkcssimagefallback.c     |  2 +-
 gtk/gtkcssimagelinear.c       |  4 ++--
 gtk/gtkcssimageradial.c       |  2 +-
 gtk/gtkcssimagerecolor.c      |  2 +-
 gtk/gtkcsspalettevalue.c      |  2 +-
 gtk/gtkcssshadowvalue.c       | 14 +++++++-------
 gtk/gtkcssstaticstyle.c       | 34 +++++++---------------------------
 gtk/gtkcssstyle.c             | 22 ++++++++++------------
 gtk/gtkcssstyleprivate.h      | 16 ++++++++--------
 gtk/gtkflowbox.c              |  2 +-
 gtk/gtkicontheme.c            |  2 +-
 gtk/gtklabel.c                |  2 +-
 gtk/gtkpopover.c              |  3 ++-
 gtk/gtkrender.c               |  2 +-
 gtk/gtkrenderbackground.c     |  2 +-
 gtk/gtkrenderborder.c         | 10 +++++-----
 gtk/gtksnapshot.c             |  2 +-
 gtk/gtkstylecontext.c         | 13 +++++++------
 gtk/gtktextlayout.c           |  3 ++-
 gtk/gtktextutil.c             |  6 +++---
 gtk/gtktextview.c             |  5 +++--
 gtk/gtktreeview.c             | 10 ++++------
 gtk/gtkwindow.c               |  4 ++--
 26 files changed, 112 insertions(+), 106 deletions(-)
---
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index 5d2eb3c527..646c7f926d 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -364,20 +364,21 @@ gsk_pango_renderer_prepare_run (PangoRenderer  *renderer,
       GTK_IS_TEXT_VIEW (crenderer->widget))
     {
       GtkCssNode *node;
-      GtkCssValue *value;
+      GtkCssStyle *style;
 
       node = gtk_text_view_get_selection_node ((GtkTextView *)crenderer->widget);
-      value = gtk_css_node_get_style (node)->core->color;
-      fg_rgba = gtk_css_color_value_get_rgba (value);
+      style = gtk_css_node_get_style (node);
+      fg_rgba = gtk_css_color_value_get_rgba (style->core->color, NULL);
     }
   else if (crenderer->state == GSK_PANGO_RENDERER_CURSOR && gtk_widget_has_focus (crenderer->widget))
     {
       GtkCssNode *node;
-      GtkCssValue *value;
+      GtkCssStyle *style;
 
       node = gtk_widget_get_css_node (crenderer->widget);
-      value = gtk_css_node_get_style (node)->background->background_color;
-      fg_rgba = gtk_css_color_value_get_rgba (value);
+      style = gtk_css_node_get_style (node);
+      fg_rgba = gtk_css_color_value_get_rgba (style->background->background_color,
+                                              style->core->color);
     }
   else
     fg_rgba = appearance->fg_rgba;
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index cd80e2db2f..a4f27bd146 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -156,6 +156,10 @@ gtk_css_value_color_compute (GtkCssValue      *value,
                                                current,
                                                NULL);
     }
+  else if (value->type == COLOR_TYPE_CURRENT_COLOR)
+    {
+      resolved = _gtk_css_value_ref (value);
+    }
   else if (value->type == COLOR_TYPE_LITERAL)
     {
       resolved = _gtk_css_value_ref (value);
@@ -388,7 +392,7 @@ _gtk_css_color_value_resolve (GtkCssValue      *color,
         val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, cycle_list);
         if (val == NULL)
           return NULL;
-        c = gtk_css_color_value_get_rgba (val);
+        c = gtk_css_color_value_get_rgba (val, current);
 
         apply_shade (c, &shade, color->sym_col.shade.factor);
 
@@ -406,7 +410,7 @@ _gtk_css_color_value_resolve (GtkCssValue      *color,
         val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, cycle_list);
         if (val == NULL)
           return NULL;
-        c = gtk_css_color_value_get_rgba (val);
+        c = gtk_css_color_value_get_rgba (val, current);
 
         apply_alpha (c, &alpha, color->sym_col.alpha.factor);
 
@@ -424,12 +428,12 @@ _gtk_css_color_value_resolve (GtkCssValue      *color,
         val1 = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, cycle_list);
         if (val1 == NULL)
           return NULL;
-        color1 = gtk_css_color_value_get_rgba (val1);
+        color1 = gtk_css_color_value_get_rgba (val1, current);
 
         val2 = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, cycle_list);
         if (val2 == NULL)
           return NULL;
-        color2 = gtk_css_color_value_get_rgba (val2);
+        color2 = gtk_css_color_value_get_rgba (val2, current);
 
         apply_mix (color1, color2, &res, color->sym_col.mix.factor);
 
@@ -781,11 +785,32 @@ _gtk_css_color_value_parse (GtkCssParser *parser)
     return NULL;
 }
 
-const GdkRGBA *
-gtk_css_color_value_get_rgba (const GtkCssValue *color)
+static inline const GdkRGBA *
+get_rgba (const GtkCssValue *color)
 {
   g_assert (color->class == &GTK_CSS_VALUE_COLOR);
   g_assert (color->type == COLOR_TYPE_LITERAL);
 
   return &color->sym_col.rgba;
 }
+
+static GdkRGBA fallback;
+
+const GdkRGBA *
+gtk_css_color_value_get_rgba (const GtkCssValue *value,
+                              const GtkCssValue *color)
+{
+  if (value->type == COLOR_TYPE_CURRENT_COLOR)
+    {
+      if (color)
+        return get_rgba (color);
+      else
+        {
+          fallback = GDK_RGBA("FF69B4");
+          return &fallback;
+        }
+    }
+  else
+    return get_rgba (value);
+
+}
diff --git a/gtk/gtkcsscolorvalueprivate.h b/gtk/gtkcsscolorvalueprivate.h
index 15c6a0055e..8fd93614f7 100644
--- a/gtk/gtkcsscolorvalueprivate.h
+++ b/gtk/gtkcsscolorvalueprivate.h
@@ -44,8 +44,8 @@ GtkCssValue *   _gtk_css_color_value_resolve            (GtkCssValue      *color
                                                          GtkStyleProvider *provider,
                                                          GtkCssValue      *current,
                                                          GSList           *cycle_list);
-const GdkRGBA * gtk_css_color_value_get_rgba            (const GtkCssValue *color) G_GNUC_CONST;
-
+const GdkRGBA * gtk_css_color_value_get_rgba            (const GtkCssValue *value,
+                                                         const GtkCssValue *color) G_GNUC_CONST;
 
 G_END_DECLS
 
diff --git a/gtk/gtkcssimagefallback.c b/gtk/gtkcssimagefallback.c
index c6549c6bd4..258f82c3a3 100644
--- a/gtk/gtkcssimagefallback.c
+++ b/gtk/gtkcssimagefallback.c
@@ -72,7 +72,7 @@ gtk_css_image_fallback_snapshot (GtkCssImage *image,
     {
       if (fallback->color)
         {
-          const GdkRGBA *color = gtk_css_color_value_get_rgba (fallback->color);
+          const GdkRGBA *color = gtk_css_color_value_get_rgba (fallback->color, NULL);
           if (!gdk_rgba_is_clear (color))
             gtk_snapshot_append_color (snapshot, color,
                                        &GRAPHENE_RECT_INIT (0, 0, width, height));
diff --git a/gtk/gtkcssimagelinear.c b/gtk/gtkcssimagelinear.c
index 13f848d945..742c2c9bcc 100644
--- a/gtk/gtkcssimagelinear.c
+++ b/gtk/gtkcssimagelinear.c
@@ -193,7 +193,7 @@ gtk_css_image_linear_snapshot (GtkCssImage        *image,
           const GtkCssImageLinearColorStop *stop = &linear->color_stops[linear->n_stops - 1];
 
           gtk_snapshot_append_color (snapshot,
-                                     gtk_css_color_value_get_rgba (stop->color),
+                                     gtk_css_color_value_get_rgba (stop->color, NULL),
                                      &GRAPHENE_RECT_INIT (0, 0, width, height));
           return;
         }
@@ -237,7 +237,7 @@ gtk_css_image_linear_snapshot (GtkCssImage        *image,
           offset += step;
 
           stops[last].offset = (offset - start) / (end - start);
-          stops[last].color = *gtk_css_color_value_get_rgba (stop->color);
+          stops[last].color = *gtk_css_color_value_get_rgba (stop->color, NULL);
         }
 
       offset = pos;
diff --git a/gtk/gtkcssimageradial.c b/gtk/gtkcssimageradial.c
index 46e6da1584..de893194e7 100644
--- a/gtk/gtkcssimageradial.c
+++ b/gtk/gtkcssimageradial.c
@@ -206,7 +206,7 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
 
           stop = &radial->color_stops[last];
 
-          rgba = gtk_css_color_value_get_rgba (stop->color);
+          rgba = gtk_css_color_value_get_rgba (stop->color, NULL);
           offset += step;
 
           cairo_pattern_add_color_stop_rgba (pattern,
diff --git a/gtk/gtkcssimagerecolor.c b/gtk/gtkcssimagerecolor.c
index 23cbb16bbe..aa0e70758f 100644
--- a/gtk/gtkcssimagerecolor.c
+++ b/gtk/gtkcssimagerecolor.c
@@ -72,7 +72,7 @@ lookup_symbolic_colors (GtkCssStyle *style,
 {
   const GdkRGBA *lookup;
 
-  *color_out = *gtk_css_color_value_get_rgba (style->core->color);
+  *color_out = *gtk_css_color_value_get_rgba (style->core->color, NULL);
 
   lookup = gtk_css_palette_value_get_color (palette, "success");
   if (lookup)
diff --git a/gtk/gtkcsspalettevalue.c b/gtk/gtkcsspalettevalue.c
index 8245be9123..aaeb426673 100644
--- a/gtk/gtkcsspalettevalue.c
+++ b/gtk/gtkcsspalettevalue.c
@@ -351,7 +351,7 @@ gtk_css_palette_value_get_color (GtkCssValue *value,
   for (i = 0; i < value->n_colors; i ++)
     {
       if (strcmp (value->color_names[i], name) == 0)
-        return gtk_css_color_value_get_rgba (value->color_values[i]);
+        return gtk_css_color_value_get_rgba (value->color_values[i], NULL);
     }
 
   return NULL;
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 9a0917ef94..ccb547a104 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -544,12 +544,12 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue    *value,
         continue;
 
       /* We don't need to draw invisible shadows */
-      if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+      if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color, NULL)))
         continue;
 
       gtk_snapshot_append_outset_shadow (snapshot,
                                          border_box,
-                                         gtk_css_color_value_get_rgba (shadow->color),
+                                         gtk_css_color_value_get_rgba (shadow->color, NULL),
                                          _gtk_css_number_value_get (shadow->hoffset, 0),
                                          _gtk_css_number_value_get (shadow->voffset, 0),
                                          _gtk_css_number_value_get (shadow->spread, 0),
@@ -576,14 +576,14 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue    *value,
         continue;
 
       /* We don't need to draw invisible shadows */
-      if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+      if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color, NULL)))
         continue;
 
       dx = _gtk_css_number_value_get (shadow->hoffset, 0);
       dy = _gtk_css_number_value_get (shadow->voffset, 0);
       spread = _gtk_css_number_value_get (shadow->spread, 0);
       radius = _gtk_css_number_value_get (shadow->radius, 0);
-      color = gtk_css_color_value_get_rgba (shadow->color);
+      color = gtk_css_color_value_get_rgba (shadow->color, NULL);
 
       /* These are trivial to do with a color node */
       if (spread == 0 && radius == 0 &&
@@ -659,7 +659,7 @@ gtk_css_shadow_value_is_clear (const GtkCssValue *value)
     {
       const ShadowValue *shadow = &value->shadows[i];
 
-      if (!gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+      if (!gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color, NULL)))
         return FALSE;
     }
 
@@ -684,7 +684,7 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value,
     {
       const ShadowValue *shadow = &value->shadows[i];
 
-      if (!gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+      if (!gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color, NULL)))
         {
           need_shadow = TRUE;
           break;
@@ -701,7 +701,7 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value,
 
           shadows[i].dx = _gtk_css_number_value_get (shadow->hoffset, 0);
           shadows[i].dy = _gtk_css_number_value_get (shadow->voffset, 0);
-          shadows[i].color = *gtk_css_color_value_get_rgba (shadow->color);
+          shadows[i].color = *gtk_css_color_value_get_rgba (shadow->color, NULL);
           shadows[i].radius = _gtk_css_number_value_get (shadow->radius, 0);
         }
 
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index bd77af01f4..55d34d84cc 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -757,10 +757,10 @@ gtk_css_border_create_initial_values (void)
   values->border_top_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, NULL, NULL, NULL);
   values->border_bottom_left_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, NULL, NULL, NULL);
   values->border_bottom_right_radius = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, NULL, NULL, NULL);
-  values->border_top_color = NULL;
-  values->border_right_color = NULL;
-  values->border_bottom_color = NULL;
-  values->border_left_color = NULL;
+  values->border_top_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_TOP_COLOR, NULL, 
NULL, NULL);
+  values->border_right_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR, 
NULL, NULL, NULL);
+  values->border_bottom_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR, 
NULL, NULL, NULL);
+  values->border_left_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_LEFT_COLOR, NULL, 
NULL, NULL);
   values->border_image_source = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, 
NULL, NULL, NULL);
   values->border_image_repeat = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT, 
NULL, NULL, NULL);
   values->border_image_slice = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, 
NULL, NULL, NULL);
@@ -779,7 +779,7 @@ gtk_css_outline_create_initial_values (void)
   values->outline_style = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_STYLE, NULL, NULL, 
NULL);
   values->outline_width = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_WIDTH, NULL, NULL, 
NULL);
   values->outline_offset = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_OFFSET, NULL, NULL, 
NULL);
-  values->outline_color = NULL;
+  values->outline_color = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OUTLINE_COLOR, NULL, NULL, 
NULL);
 
   return (GtkCssValues *)values;
 }
@@ -804,7 +804,7 @@ gtk_css_font_variant_create_initial_values (void)
   values = (GtkCssFontVariantValues *)gtk_css_values_new (GTK_CSS_FONT_VARIANT_INITIAL_VALUES);
 
   values->text_decoration_line = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, 
NULL, NULL, NULL);
-  values->text_decoration_color = NULL;
+  values->text_decoration_color = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR, NULL, NULL, NULL);
   values->text_decoration_style = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, NULL, NULL, NULL);
   values->font_kerning = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FONT_KERNING, NULL, NULL, 
NULL);
   values->font_variant_ligatures = _gtk_css_initial_value_new_compute 
(GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, NULL, NULL, NULL);
@@ -1085,27 +1085,7 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
     }
   else
     {
-      /* We store currentcolor as NULL in the values structs,
-       * this gets resolved to the value of color in the style
-       * using the values struct - it needs to be resolved late
-       * since values structs are shared between styles.
-       */
-      switch (id)
-        {
-        case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR:
-        case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
-        case GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR:
-        case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR:
-        case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR:
-        case GTK_CSS_PROPERTY_OUTLINE_COLOR:
-        case GTK_CSS_PROPERTY_CARET_COLOR:
-        case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
-          value = NULL;
-          break;
-        default:
-          value = _gtk_css_initial_value_new_compute (id, provider, (GtkCssStyle *)style, parent_style);
-          break;
-        }
+      value = _gtk_css_initial_value_new_compute (id, provider, (GtkCssStyle *)style, parent_style);
     }
 
   gtk_css_static_style_set_value (style, id, value, section);
diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c
index d303fdecdd..74566c0c4f 100644
--- a/gtk/gtkcssstyle.c
+++ b/gtk/gtkcssstyle.c
@@ -122,7 +122,7 @@ gtk_css_style_get_value (GtkCssStyle *style,
     case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE:
       return style->font_variant->text_decoration_line;
     case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR:
-      return style->font_variant->text_decoration_color ? style->font_variant->text_decoration_color : 
style->core->color;
+      return style->font_variant->text_decoration_color;
     case GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE:
       return style->font_variant->text_decoration_style;
     case GTK_CSS_PROPERTY_FONT_KERNING:
@@ -198,15 +198,15 @@ gtk_css_style_get_value (GtkCssStyle *style,
     case GTK_CSS_PROPERTY_BACKGROUND_POSITION:
       return style->background->background_position;
     case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
-      return style->border->border_top_color ? style->border->border_top_color : style->core->color;
+      return style->border->border_top_color;
     case GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR:
-      return style->border->border_right_color ? style->border->border_right_color : style->core->color;
+      return style->border->border_right_color;
     case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR:
-      return style->border->border_bottom_color ? style->border->border_bottom_color : style->core->color;
+      return style->border->border_bottom_color;
     case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR:
-      return style->border->border_left_color ? style->border->border_left_color: style->core->color;
+      return style->border->border_left_color;
     case GTK_CSS_PROPERTY_OUTLINE_COLOR:
-      return style->outline->outline_color ? style->outline->outline_color : style->core->color;
+      return style->outline->outline_color;
     case GTK_CSS_PROPERTY_BACKGROUND_REPEAT:
       return style->background->background_repeat;
     case GTK_CSS_PROPERTY_BACKGROUND_IMAGE:
@@ -270,9 +270,9 @@ gtk_css_style_get_value (GtkCssStyle *style,
     case GTK_CSS_PROPERTY_FILTER:
       return style->other->filter;
     case GTK_CSS_PROPERTY_CARET_COLOR:
-      return style->font->caret_color ? style->font->caret_color : style->core->color;
+      return style->font->caret_color;
     case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
-      return style->font->secondary_caret_color ? style->font->secondary_caret_color : style->core->color;
+      return style->font->secondary_caret_color;
     case GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS:
       return style->font->font_feature_settings;
     case GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS:
@@ -437,10 +437,8 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style)
   /* text-decoration */
   decoration_line = _gtk_css_text_decoration_line_value_get (style->font_variant->text_decoration_line);
   decoration_style = _gtk_css_text_decoration_style_value_get (style->font_variant->text_decoration_style);
-  color = gtk_css_color_value_get_rgba (style->core->color);
-  decoration_color = gtk_css_color_value_get_rgba (style->font_variant->text_decoration_color
-                                                   ? style->font_variant->text_decoration_color
-                                                   : style->core->color);
+  color = gtk_css_color_value_get_rgba (style->core->color, NULL);
+  decoration_color = gtk_css_color_value_get_rgba (style->font_variant->text_decoration_color, 
style->core->color);
 
   switch (decoration_line)
     {
diff --git a/gtk/gtkcssstyleprivate.h b/gtk/gtkcssstyleprivate.h
index 1ee874d06b..d50ddb6528 100644
--- a/gtk/gtkcssstyleprivate.h
+++ b/gtk/gtkcssstyleprivate.h
@@ -114,10 +114,10 @@ struct _GtkCssBorderValues {
   GtkCssValue *border_top_right_radius;
   GtkCssValue *border_bottom_right_radius;
   GtkCssValue *border_bottom_left_radius;
-  GtkCssValue *border_top_color; // NULL if currentColor
-  GtkCssValue *border_right_color; // NULL if currentColor
-  GtkCssValue *border_bottom_color; // NULL if currentColor
-  GtkCssValue *border_left_color; // NULL if currentColor
+  GtkCssValue *border_top_color;
+  GtkCssValue *border_right_color;
+  GtkCssValue *border_bottom_color;
+  GtkCssValue *border_left_color;
   GtkCssValue *border_image_source;
   GtkCssValue *border_image_repeat;
   GtkCssValue *border_image_slice;
@@ -137,7 +137,7 @@ struct _GtkCssOutlineValues {
   GtkCssValue *outline_style;
   GtkCssValue *outline_width;
   GtkCssValue *outline_offset;
-  GtkCssValue *outline_color; // NULL if currentColor
+  GtkCssValue *outline_color;
 };
 
 struct _GtkCssFontValues {
@@ -148,8 +148,8 @@ struct _GtkCssFontValues {
   GtkCssValue *font_stretch;
   GtkCssValue *letter_spacing;
   GtkCssValue *text_shadow;
-  GtkCssValue *caret_color; // NULL if currentColor
-  GtkCssValue *secondary_caret_color; // NULL if currentColor
+  GtkCssValue *caret_color;
+  GtkCssValue *secondary_caret_color;
   GtkCssValue *font_feature_settings;
   GtkCssValue *font_variation_settings;
 };
@@ -157,7 +157,7 @@ struct _GtkCssFontValues {
 struct _GtkCssFontVariantValues {
   GtkCssValues base;
   GtkCssValue *text_decoration_line;
-  GtkCssValue *text_decoration_color; // NULL if currentColor
+  GtkCssValue *text_decoration_color;
   GtkCssValue *text_decoration_style;
   GtkCssValue *font_kerning;
   GtkCssValue *font_variant_ligatures;
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index 84ba41df2f..228ec3f270 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -2380,7 +2380,7 @@ gtk_flow_box_snapshot (GtkWidget   *widget,
           cairo_append_path (cr, path);
           cairo_path_destroy (path);
 
-          border_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BORDER_TOP_COLOR));
+          border_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BORDER_TOP_COLOR), _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
           gtk_style_context_get_border (context, &border);
 
           cairo_set_line_width (cr, border.left);
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index c8e5eaaa50..5c58be5324 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -2523,7 +2523,7 @@ gtk_icon_theme_lookup_symbolic_colors (GtkCssStyle *style,
 
   color = style->core->color;
   palette = style->core->icon_palette;
-  *color_out = *gtk_css_color_value_get_rgba (color);
+  *color_out = *gtk_css_color_value_get_rgba (color, NULL);
 
   lookup = gtk_css_palette_value_get_color (palette, "success");
   if (lookup)
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 992bc9cc69..452b57e9d6 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -3045,7 +3045,7 @@ gtk_label_update_layout_attributes (GtkLabel *label)
           pango_attr_list_insert (attrs, attribute);
 
           style = gtk_css_node_get_style (link->cssnode);
-          link_color = gtk_css_color_value_get_rgba (style->core->color);
+          link_color = gtk_css_color_value_get_rgba (style->core->color, NULL);
 
           attribute = pango_attr_foreground_new (link_color->red * 65535,
                                                  link_color->green * 65535,
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 11dd3f273b..7023d45adf 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -1455,7 +1455,8 @@ create_arrow_render_node (GtkPopover *popover)
       const GdkRGBA *border_color;
 
       style = gtk_css_node_get_style (priv->arrow_node);
-      border_color = gtk_css_color_value_get_rgba (style->border->border_left_color ? 
style->border->border_left_color : style->core->color);
+      border_color = gtk_css_color_value_get_rgba (style->border->border_left_color,
+                                                   style->core->color);
 
       gtk_popover_apply_tail_path (popover, cr);
       gdk_cairo_set_source_rgba (cr, border_color);
diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c
index c11e377aaf..45fe3088e8 100644
--- a/gtk/gtkrender.c
+++ b/gtk/gtkrender.c
@@ -383,7 +383,7 @@ gtk_do_render_line (GtkStyleContext *context,
 
   cairo_save (cr);
 
-  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
+  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR), 
NULL);
 
   cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
   cairo_set_line_width (cr, 1);
diff --git a/gtk/gtkrenderbackground.c b/gtk/gtkrenderbackground.c
index e366188852..1d93a318c9 100644
--- a/gtk/gtkrenderbackground.c
+++ b/gtk/gtkrenderbackground.c
@@ -273,7 +273,7 @@ gtk_css_style_snapshot_background (GtkCssBoxes *boxes,
     return;
 
   background_image = background->background_image;
-  bg_color = gtk_css_color_value_get_rgba (background->background_color);
+  bg_color = gtk_css_color_value_get_rgba (background->background_color, boxes->style->core->color);
   box_shadow = background->box_shadow;
 
   has_bg_color = !gdk_rgba_is_clear (bg_color);
diff --git a/gtk/gtkrenderborder.c b/gtk/gtkrenderborder.c
index a137d0814c..d734c1aad2 100644
--- a/gtk/gtkrenderborder.c
+++ b/gtk/gtkrenderborder.c
@@ -687,10 +687,10 @@ gtk_css_style_snapshot_border (GtkCssBoxes *boxes,
                                gtk_css_boxes_get_padding_rect (boxes)))
         return;
 
-      colors[0] = *gtk_css_color_value_get_rgba (border->border_top_color ? border->border_top_color : 
boxes->style->core->color);
-      colors[1] = *gtk_css_color_value_get_rgba (border->border_right_color ? border->border_right_color : 
boxes->style->core->color);
-      colors[2] = *gtk_css_color_value_get_rgba (border->border_bottom_color ? border->border_bottom_color : 
boxes->style->core->color);
-      colors[3] = *gtk_css_color_value_get_rgba (border->border_left_color ? border->border_left_color : 
boxes->style->core->color);
+      colors[0] = *gtk_css_color_value_get_rgba (border->border_top_color, boxes->style->core->color);
+      colors[1] = *gtk_css_color_value_get_rgba (border->border_right_color, boxes->style->core->color);
+      colors[2] = *gtk_css_color_value_get_rgba (border->border_bottom_color, boxes->style->core->color);
+      colors[3] = *gtk_css_color_value_get_rgba (border->border_left_color, boxes->style->core->color);
 
       alpha_test_vector = graphene_simd4f_init (colors[0].alpha, colors[1].alpha, colors[2].alpha, 
colors[3].alpha);
       if (graphene_simd4f_is_zero4 (alpha_test_vector))
@@ -745,7 +745,7 @@ gtk_css_style_snapshot_outline (GtkCssBoxes *boxes,
       border_style[1] = border_style[2] = border_style[3] = border_style[0];
       border_width[0] = _gtk_css_number_value_get (outline->outline_width, 100);
       border_width[3] = border_width[2] = border_width[1] = border_width[0];
-      colors[0] = *gtk_css_color_value_get_rgba (outline->outline_color ? outline->outline_color : 
boxes->style->core->color);
+      colors[0] = *gtk_css_color_value_get_rgba (outline->outline_color, boxes->style->core->color);
       colors[3] = colors[2] = colors[1] = colors[0];
 
       snapshot_border (snapshot,
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index a2b193685c..3a00e9350e 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -1732,7 +1732,7 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
   gtk_snapshot_save (snapshot);
   gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y));
 
-  fg_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
+  fg_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR), NULL);
 
   shadows_value = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_SHADOW);
   has_shadow = gtk_css_shadow_value_push_snapshot (shadows_value, snapshot);
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 15e0085537..3ac8548cf9 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -929,7 +929,7 @@ gtk_style_context_resolve_color (GtkStyleContext    *context,
   if (val == NULL)
     return FALSE;
 
-  *result = *gtk_css_color_value_get_rgba (val);
+  *result = *gtk_css_color_value_get_rgba (val, NULL);
   _gtk_css_value_unref (val);
   return TRUE;
 }
@@ -980,7 +980,7 @@ gtk_style_context_get_color (GtkStyleContext *context,
   g_return_if_fail (color != NULL);
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
 
-  *color = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
+  *color = *gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR), NULL);
 }
 
 /**
@@ -1072,10 +1072,10 @@ _gtk_style_context_get_cursor_color (GtkStyleContext *context,
   style = gtk_style_context_lookup_style (context);
 
   if (primary_color)
-    *primary_color = *gtk_css_color_value_get_rgba (style->font->caret_color ? style->font->caret_color : 
style->core->color);
+    *primary_color = *gtk_css_color_value_get_rgba (style->font->caret_color, style->core->color);
 
   if (secondary_color)
-    *secondary_color = *gtk_css_color_value_get_rgba (style->font->secondary_caret_color ? 
style->font->secondary_caret_color : style->core->color);
+    *secondary_color = *gtk_css_color_value_get_rgba (style->font->secondary_caret_color, 
style->core->color);
 }
 
 static void
@@ -1449,14 +1449,15 @@ _gtk_style_context_get_attributes (AtkAttributeSet *attributes,
   const GdkRGBA *color; 
   gchar *value;
 
-  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR));
+  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR),
+                                        _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
   value = g_strdup_printf ("%u,%u,%u",
                            (guint) ceil (color->red * 65536 - color->red),
                            (guint) ceil (color->green * 65536 - color->green),
                            (guint) ceil (color->blue * 65536 - color->blue));
   attributes = add_attribute (attributes, ATK_TEXT_ATTR_BG_COLOR, value);
 
-  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
+  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR), 
NULL);
   value = g_strdup_printf ("%u,%u,%u",
                            (guint) ceil (color->red * 65536 - color->red),
                            (guint) ceil (color->green * 65536 - color->green),
diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c
index a646151f29..bd72dad302 100644
--- a/gtk/gtktextlayout.c
+++ b/gtk/gtktextlayout.c
@@ -3977,7 +3977,8 @@ render_para (GskPangoRenderer   *crenderer,
       GtkCssNode *selection_node = gtk_text_view_get_selection_node ((GtkTextView*)crenderer->widget);
       gtk_style_context_save_to_node (context, selection_node);
 
-      selection = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR));
+      selection = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR),
+                                                _gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
 
       gtk_style_context_restore (context);
     }
diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c
index 6b95684e3c..5c1e74896a 100644
--- a/gtk/gtktextutil.c
+++ b/gtk/gtktextutil.c
@@ -131,7 +131,7 @@ gtk_text_util_create_drag_icon (GtkWidget *widget,
   snapshot = gtk_snapshot_new ();
 
   style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
-  color = gtk_css_color_value_get_rgba (style->core->color);
+  color = gtk_css_color_value_get_rgba (style->core->color, NULL);
 
   gtk_snapshot_append_layout (snapshot, layout, color);
 
@@ -157,8 +157,8 @@ set_attributes_from_style (GtkWidget         *widget,
   context = gtk_widget_get_style_context (widget);
   style = gtk_style_context_lookup_style (context);
 
-  *values->appearance.bg_rgba = *gtk_css_color_value_get_rgba (style->background->background_color);
-  *values->appearance.fg_rgba = *gtk_css_color_value_get_rgba (style->core->color);
+  *values->appearance.bg_rgba = *gtk_css_color_value_get_rgba (style->background->background_color, 
style->core->color);
+  *values->appearance.fg_rgba = *gtk_css_color_value_get_rgba (style->core->color, NULL);
 
   if (values->font)
     pango_font_description_free (values->font);
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index c4f7266515..c2a37b6108 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -7541,9 +7541,10 @@ gtk_text_view_set_attributes_from_style (GtkTextView        *text_view,
 
   context = gtk_widget_get_style_context (GTK_WIDGET (text_view));
 
-  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR));
+  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR),
+                                        _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
   *values->appearance.bg_rgba = *color;
-  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
+  color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR), 
NULL);
   *values->appearance.fg_rgba = *color;
 
   if (values->font)
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 30f97c408e..fbf44e7c03 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -4174,9 +4174,8 @@ gtk_tree_view_snapshot_grid_line (GtkTreeView            *tree_view,
   const GdkRGBA *grid_line_color;
 
   context = gtk_widget_get_style_context (GTK_WIDGET (tree_view));
-  grid_line_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context,
-                                                                                    
GTK_CSS_PROPERTY_BORDER_TOP_COLOR));
-
+  grid_line_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BORDER_TOP_COLOR),
+                                                  _gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
   if (!gdk_rgba_equal (grid_line_color, &tree_view->grid_line_color) ||
       (orientation == GTK_ORIENTATION_HORIZONTAL && !tree_view->horizontal_grid_line_texture) ||
       (orientation == GTK_ORIENTATION_VERTICAL && !tree_view->vertical_grid_line_texture))
@@ -4248,9 +4247,8 @@ gtk_tree_view_snapshot_tree_line (GtkTreeView            *tree_view,
   const GdkRGBA *tree_line_color;
 
   context = gtk_widget_get_style_context (GTK_WIDGET (tree_view));
-  tree_line_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context,
-                                                                                    
GTK_CSS_PROPERTY_BORDER_LEFT_COLOR));
-
+  tree_line_color = gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BORDER_LEFT_COLOR),
+                                                  _gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR));
   if (!gdk_rgba_equal (tree_line_color, &tree_view->tree_line_color) ||
       (orientation == GTK_ORIENTATION_HORIZONTAL && !tree_view->horizontal_tree_line_texture) ||
       (orientation == GTK_ORIENTATION_VERTICAL && !tree_view->vertical_tree_line_texture))
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 68ed529105..4266eca483 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -4706,8 +4706,8 @@ update_opaque_region (GtkWindow           *window,
 
   context = gtk_widget_get_style_context (widget);
 
-  is_opaque = gdk_rgba_is_opaque (gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR)));
-
+  is_opaque = gdk_rgba_is_opaque (gtk_css_color_value_get_rgba (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_BACKGROUND_COLOR),
+                                                                _gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_COLOR)));
   if (gtk_widget_get_opacity (widget) < 1.0)
     is_opaque = FALSE;
 


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