* 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.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
-#include "gtksymboliccolor.h"
+#include "gtksymboliccolorprivate.h"
#include "gtkstyleproperties.h"
#include "gtkintl.h"
#include "gtkwin32themeprivate.h"
COLOR_TYPE_SHADE,
COLOR_TYPE_ALPHA,
COLOR_TYPE_MIX,
- COLOR_TYPE_WIN32
+ COLOR_TYPE_WIN32,
+ COLOR_TYPE_CURRENT_COLOR
} ColorType;
struct _GtkSymbolicColor
* Creates a symbolic color based on the current win32
* theme.
*
- * Note that while this call is availible on all platforms
+ * Note that while this call is available on all platforms
* the actual value returned is not reliable on non-win32
* platforms.
*
* Returns: A newly created #GtkSymbolicColor
*
* Since: 3.4
- **/
+ */
GtkSymbolicColor *
-gtk_symbolic_color_new_win32 (const gchar *theme_class,
- gint id)
+gtk_symbolic_color_new_win32 (const gchar *theme_class,
+ gint id)
{
GtkSymbolicColor *symbolic_color;
return symbolic_color;
}
+/**
+ * _gtk_symbolic_color_get_current_color:
+ *
+ * Gets the color representing the CSS 'currentColor' keyword.
+ * This color will resolve to the color set for the color property.
+ *
+ * Returns: (transfer none): The singleton representing the
+ * 'currentColor' keyword
+ **/
+GtkSymbolicColor *
+_gtk_symbolic_color_get_current_color (void)
+{
+ static GtkSymbolicColor *current_color = NULL;
+
+ if (G_UNLIKELY (current_color == NULL))
+ {
+ current_color = g_slice_new0 (GtkSymbolicColor);
+ current_color->type = COLOR_TYPE_CURRENT_COLOR;
+ current_color->ref_count = 1;
+ }
+
+ return current_color;
+}
+
/**
* gtk_symbolic_color_ref:
* @color: a #GtkSymbolicColor
*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
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:
{
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;
{
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);
{
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;
{
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);
color->win32.id,
resolved_color);
+ break;
+ case COLOR_TYPE_CURRENT_COLOR:
+ return FALSE;
break;
default:
g_assert_not_reached ();
color->win32.theme_class, color->win32.id);
}
break;
+ case COLOR_TYPE_CURRENT_COLOR:
+ s = g_strdup ("currentColor");
+ break;
default:
g_assert_not_reached ();
}