diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 293d3d6785..e93a900403 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -3062,15 +3062,63 @@ gdk_color_to_css (GdkColor *color)
color->blue >> 8);
}
+static GdkPixbuf *
+_gtk_icon_info_load_symbolic_internal (GtkIconInfo *icon_info,
+ const gchar *css_fg,
+ const gchar *css_success,
+ const gchar *css_warning,
+ const gchar *css_error,
+ GError **error)
+{
+ GInputStream *stream;
+ GdkPixbuf *pixbuf;
+ gchar *data;
+
+ data = g_strconcat ("\n"
+ "",
+ NULL);
+
+ stream = g_memory_input_stream_new_from_data (data, -1, g_free);
+ pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
+ icon_info->desired_size,
+ icon_info->desired_size,
+ TRUE,
+ NULL,
+ error);
+ g_object_unref (stream);
+
+ return pixbuf;
+}
+
/**
* gtk_icon_info_load_symbolic:
* @icon_info: a #GtkIconInfo
- * @fg: a #GdkColor representing the foreground color of the icon
- * @success_color: (allow-none): a #GdkColor representing the warning color
+ * @fg: a #GdkRGBA representing the foreground color of the icon
+ * @success_color: (allow-none): a #GdkRGBA representing the warning color
* of the icon or %NULL to use the default color
- * @warning_color: (allow-none): a #GdkColor representing the warning color
+ * @warning_color: (allow-none): a #GdkRGBA representing the warning color
* of the icon or %NULL to use the default color
- * @error_color: (allow-none): a #GdkColor representing the error color
+ * @error_color: (allow-none): a #GdkRGBA representing the error color
* of the icon or %NULL to use the default color (allow-none)
* @was_symbolic: (allow-none): a #gboolean, returns whether the loaded icon
* was a symbolic one and whether the @fg color was applied to it.
@@ -3100,16 +3148,14 @@ gdk_color_to_css (GdkColor *color)
**/
GdkPixbuf *
gtk_icon_info_load_symbolic (GtkIconInfo *icon_info,
- GdkColor *fg,
- GdkColor *success_color,
- GdkColor *warning_color,
- GdkColor *error_color,
+ GdkRGBA *fg,
+ GdkRGBA *success_color,
+ GdkRGBA *warning_color,
+ GdkRGBA *error_color,
gboolean *was_symbolic,
GError **error)
{
GdkPixbuf *pixbuf;
- GInputStream *stream;
- gchar *data;
gchar *css_fg;
gchar *css_success;
gchar *css_warning;
@@ -3128,68 +3174,40 @@ gtk_icon_info_load_symbolic (GtkIconInfo *icon_info,
if (was_symbolic)
*was_symbolic = TRUE;
- css_fg = gdk_color_to_css (fg);
+ css_fg = gdk_rgba_to_string (fg);
if (!warning_color)
{
GdkColor warning_default_color = { 0, 0xf500, 0x7900, 0x3e00 };
css_warning = gdk_color_to_css (&warning_default_color);
}
else
- css_warning = gdk_color_to_css (warning_color);
+ css_warning = gdk_rgba_to_string (warning_color);
+
if (!error_color)
{
GdkColor error_default_color = { 0, 0xcc00, 0x0000, 0x0000 };
css_error = gdk_color_to_css (&error_default_color);
}
else
- css_error = gdk_color_to_css (error_color);
+ css_error = gdk_rgba_to_string (error_color);
+
if (!success_color)
{
GdkColor success_default_color = { 0, 0x4e00, 0x9a00, 0x0600 };
css_success = gdk_color_to_css (&success_default_color);
}
else
- css_success = gdk_color_to_css (success_color);
+ css_success = gdk_rgba_to_string (success_color);
- data = g_strconcat (
-"\n"
-"",
- NULL);
+ pixbuf = _gtk_icon_info_load_symbolic_internal (icon_info,
+ css_fg, css_success,
+ css_warning, css_error,
+ error);
g_free (css_fg);
g_free (css_warning);
g_free (css_success);
g_free (css_error);
- stream = g_memory_input_stream_new_from_data (data, -1, g_free);
-
- pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
- icon_info->desired_size,
- icon_info->desired_size,
- TRUE,
- NULL,
- error);
- g_object_unref (stream);
-
return pixbuf;
}
@@ -3222,6 +3240,7 @@ gtk_icon_info_load_symbolic_for_style (GtkIconInfo *icon_info,
gboolean *was_symbolic,
GError **error)
{
+ GdkPixbuf *pixbuf;
GdkColor success_color;
GdkColor warning_color;
GdkColor error_color;
@@ -3229,6 +3248,19 @@ gtk_icon_info_load_symbolic_for_style (GtkIconInfo *icon_info,
GdkColor *success = NULL;
GdkColor *warning = NULL;
GdkColor *err = NULL;
+ gchar *css_fg, *css_success;
+ gchar *css_warning, *css_error;
+
+ if (!icon_info->filename ||
+ !g_str_has_suffix (icon_info->filename, "-symbolic.svg"))
+ {
+ if (was_symbolic)
+ *was_symbolic = FALSE;
+ return gtk_icon_info_load_icon (icon_info, error);
+ }
+
+ if (was_symbolic)
+ *was_symbolic = TRUE;
fg = &style->fg[state];
if (gtk_style_lookup_color (style, "success_color", &success_color))
@@ -3238,8 +3270,22 @@ gtk_icon_info_load_symbolic_for_style (GtkIconInfo *icon_info,
if (gtk_style_lookup_color (style, "error_color", &error_color))
err = &error_color;
- return gtk_icon_info_load_symbolic (icon_info, fg, success, warning, err,
- was_symbolic, error);
+ css_fg = gdk_color_to_css (fg);
+ css_success = gdk_color_to_css (success);
+ css_warning = gdk_color_to_css (warning);
+ css_error = gdk_color_to_css (err);
+
+ pixbuf = _gtk_icon_info_load_symbolic_internal (icon_info,
+ css_fg, css_success,
+ css_warning, css_error,
+ error);
+
+ g_free (css_fg);
+ g_free (css_success);
+ g_free (css_warning);
+ g_free (css_error);
+
+ return pixbuf;
}
/**
diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h
index 37f7d89ba7..f493ba98a0 100644
--- a/gtk/gtkicontheme.h
+++ b/gtk/gtkicontheme.h
@@ -172,11 +172,11 @@ GdkPixbuf * gtk_icon_info_get_builtin_pixbuf (GtkIconInfo *icon_info
GdkPixbuf * gtk_icon_info_load_icon (GtkIconInfo *icon_info,
GError **error);
GdkPixbuf * gtk_icon_info_load_symbolic (GtkIconInfo *icon_info,
- GdkColor *fg,
- GdkColor *success_color,
- GdkColor *warning_color,
- GdkColor *error_color,
- gboolean *was_symbolic,
+ GdkRGBA *fg,
+ GdkRGBA *success_color,
+ GdkRGBA *warning_color,
+ GdkRGBA *error_color,
+ gboolean *was_symbolic,
GError **error);
GdkPixbuf * gtk_icon_info_load_symbolic_for_style (GtkIconInfo *icon_info,
GtkStyle *style,