diff --git a/gtk/Makefile.am b/gtk/Makefile.am index a8922fc6e6..e8852d16a3 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -468,6 +468,7 @@ gtk_private_h_sources = \ gtkstylecontextprivate.h \ gtkstylepropertiesprivate.h \ gtkstylepropertyprivate.h \ + gtksymboliccolorprivate.h \ gtktextbtree.h \ gtktextbufferserialize.h \ gtktextchildprivate.h \ diff --git a/gtk/gtksymboliccolor.c b/gtk/gtksymboliccolor.c index 23ba2f3319..992b7a96fa 100644 --- a/gtk/gtksymboliccolor.c +++ b/gtk/gtksymboliccolor.c @@ -18,7 +18,7 @@ */ #include "config.h" -#include "gtksymboliccolor.h" +#include "gtksymboliccolorprivate.h" #include "gtkstyleproperties.h" #include "gtkintl.h" #include "gtkwin32themeprivate.h" @@ -506,6 +506,15 @@ _shade_color (GdkRGBA *color, *color = temp; } +static GtkSymbolicColor * +resolve_lookup_color (gpointer data, const char *name) +{ + if (data == NULL) + return NULL; + + return gtk_style_properties_lookup_color (data, name); +} + /** * gtk_symbolic_color_resolve: * @color: a #GtkSymbolicColor @@ -535,6 +544,22 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, g_return_val_if_fail (resolved_color != NULL, FALSE); g_return_val_if_fail (props == NULL || GTK_IS_STYLE_PROPERTIES (props), FALSE); + return _gtk_symbolic_color_resolve_full (color, + resolve_lookup_color, + props, + resolved_color); +} + +gboolean +_gtk_symbolic_color_resolve_full (GtkSymbolicColor *color, + GtkSymbolicColorLookupFunc func, + gpointer data, + GdkRGBA *resolved_color) +{ + g_return_val_if_fail (color != NULL, FALSE); + g_return_val_if_fail (resolved_color != NULL, FALSE); + g_return_val_if_fail (func != NULL, FALSE); + switch (color->type) { case COLOR_TYPE_LITERAL: @@ -544,15 +569,12 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, { GtkSymbolicColor *named_color; - if (props == NULL) - return FALSE; - - named_color = gtk_style_properties_lookup_color (props, color->name); + named_color = func (data, color->name); if (!named_color) return FALSE; - return gtk_symbolic_color_resolve (named_color, props, resolved_color); + return _gtk_symbolic_color_resolve_full (named_color, func, data, resolved_color); } break; @@ -560,7 +582,7 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, { GdkRGBA shade; - if (!gtk_symbolic_color_resolve (color->shade.color, props, &shade)) + if (!_gtk_symbolic_color_resolve_full (color->shade.color, func, data, &shade)) return FALSE; _shade_color (&shade, color->shade.factor); @@ -574,7 +596,7 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, { GdkRGBA alpha; - if (!gtk_symbolic_color_resolve (color->alpha.color, props, &alpha)) + if (!_gtk_symbolic_color_resolve_full (color->alpha.color, func, data, &alpha)) return FALSE; *resolved_color = alpha; @@ -586,10 +608,10 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, { GdkRGBA color1, color2; - if (!gtk_symbolic_color_resolve (color->mix.color1, props, &color1)) + if (!_gtk_symbolic_color_resolve_full (color->mix.color1, func, data, &color1)) return FALSE; - if (!gtk_symbolic_color_resolve (color->mix.color2, props, &color2)) + if (!_gtk_symbolic_color_resolve_full (color->mix.color2, func, data, &color2)) return FALSE; resolved_color->red = CLAMP (color1.red + ((color2.red - color1.red) * color->mix.factor), 0, 1); diff --git a/gtk/gtksymboliccolorprivate.h b/gtk/gtksymboliccolorprivate.h new file mode 100644 index 0000000000..1216a49317 --- /dev/null +++ b/gtk/gtksymboliccolorprivate.h @@ -0,0 +1,36 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2011 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_SYMBOLIC_COLOR_PRIVATE_H__ +#define __GTK_SYMBOLIC_COLOR_PRIVATE_H__ + +#include "gtk/gtksymboliccolor.h" + +G_BEGIN_DECLS + +typedef GtkSymbolicColor * (* GtkSymbolicColorLookupFunc) (gpointer data, const char *name); + +gboolean _gtk_symbolic_color_resolve_full (GtkSymbolicColor *color, + GtkSymbolicColorLookupFunc func, + gpointer data, + GdkRGBA *resolved_color); + +G_END_DECLS + +#endif /* __GTK_SYMBOLIC_COLOR_PRIVATE_H__ */