+ if (data->dup && !g_task_had_error (task))
+ {
+ pixbuf = g_task_propagate_pointer (task, NULL);
+
+ g_assert (pixbuf != NULL); /* we checked for !had_error above */
+
+ symbolic_cache = symbolic_pixbuf_cache_matches (icon_info->symbolic_pixbuf_cache,
+ data->fg_set ? &data->fg : NULL,
+ data->success_color_set ? &data->success_color : NULL,
+ data->warning_color_set ? &data->warning_color : NULL,
+ data->error_color_set ? &data->error_color : NULL);
+
+ if (symbolic_cache == NULL)
+ {
+ symbolic_cache = icon_info->symbolic_pixbuf_cache =
+ symbolic_pixbuf_cache_new (pixbuf,
+ data->fg_set ? &data->fg : NULL,
+ data->success_color_set ? &data->success_color : NULL,
+ data->warning_color_set ? &data->warning_color : NULL,
+ data->error_color_set ? &data->error_color : NULL,
+ icon_info->symbolic_pixbuf_cache);
+ }
+
+ g_object_unref (pixbuf);
+
+ return symbolic_cache_get_proxy (symbolic_cache, icon_info);
+ }
+
+ return g_task_propagate_pointer (task, error);
+}
+
+/**
+ * gtk_icon_info_load_symbolic_for_context_async:
+ * @icon_info: a #GtkIconInfo structure from gtk_icon_theme_lookup_icon()
+ * @context: a #GtkStyleContext
+ * @cancellable: (allow-none): optional #GCancellable object,
+ * %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the
+ * request is satisfied
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously load, render and scale a symbolic icon previously looked up
+ * from the icon theme using gtk_icon_theme_lookup_icon().
+ *
+ * For more details, see gtk_icon_info_load_symbolic_for_context() which is the synchronous
+ * version of this call.
+ *
+ * Since: 3.8
+ **/
+void
+gtk_icon_info_load_symbolic_for_context_async (GtkIconInfo *icon_info,
+ GtkStyleContext *context,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GdkRGBA *color = NULL;
+ GdkRGBA fg;
+ GdkRGBA *fgp;
+ GdkRGBA success_color;
+ GdkRGBA *success_colorp;
+ GdkRGBA warning_color;
+ GdkRGBA *warning_colorp;
+ GdkRGBA error_color;
+ GdkRGBA *error_colorp;
+ GtkStateFlags state;
+
+ g_return_if_fail (icon_info != NULL);
+ g_return_if_fail (context != NULL);
+
+ fgp = success_colorp = warning_colorp = error_colorp = NULL;
+
+ state = gtk_style_context_get_state (context);
+ gtk_style_context_get (context, state, "color", &color, NULL);
+ if (color)
+ {
+ fg = *color;
+ fgp = &fg;
+ gdk_rgba_free (color);
+ }
+
+ if (gtk_style_context_lookup_color (context, "success_color", &success_color))
+ success_colorp = &success_color;
+
+ if (gtk_style_context_lookup_color (context, "warning_color", &warning_color))
+ warning_colorp = &warning_color;
+
+ if (gtk_style_context_lookup_color (context, "error_color", &error_color))
+ error_colorp = &error_color;
+
+ gtk_icon_info_load_symbolic_async (icon_info,
+ fgp, success_colorp,
+ warning_colorp, error_colorp,
+ cancellable, callback, user_data);
+}
+
+/**
+ * gtk_icon_info_load_symbolic_for_context_finish:
+ * @icon_info: a #GtkIconInfo structure from gtk_icon_theme_lookup_icon()
+ * @res: a #GAsyncResult
+ * @was_symbolic: (out) (allow-none): a #gboolean, returns whether the
+ * loaded icon was a symbolic one and whether the @fg color was
+ * applied to it.
+ * @error: (allow-none): location to store error information on failure,
+ * or %NULL.
+ *
+ * Finishes an async icon load, see gtk_icon_info_load_symbolic_for_context_async().
+ *
+ * Return value: (transfer full): the rendered icon; this may be a newly
+ * created icon or a new reference to an internal icon, so you must
+ * not modify the icon. Use g_object_unref() to release your reference
+ * to the icon.
+ *
+ * Since: 3.8
+ **/
+GdkPixbuf *
+gtk_icon_info_load_symbolic_for_context_finish (GtkIconInfo *icon_info,
+ GAsyncResult *result,
+ gboolean *was_symbolic,
+ GError **error)
+{
+ return gtk_icon_info_load_symbolic_finish (icon_info, result, was_symbolic, error);
+}
+
+static GdkRGBA *
+color_to_rgba (GdkColor *color, GdkRGBA *rgba)
+{
+ rgba->red = color->red / 65535.0;
+ rgba->green = color->green / 65535.0;
+ rgba->blue = color->blue / 65535.0;
+ rgba->alpha = 1.0;
+ return rgba;
+}
+
+/**
+ * gtk_icon_info_load_symbolic_for_style:
+ * @icon_info: a #GtkIconInfo
+ * @style: a #GtkStyle to take the colors from
+ * @state: the widget state to use for colors
+ * @was_symbolic: (out) (allow-none): a #gboolean, returns whether the
+ * loaded icon was a symbolic one and whether the @fg color was
+ * applied to it.
+ * @error: (allow-none): location to store error information on failure,
+ * or %NULL.
+ *
+ * Loads an icon, modifying it to match the system colours for the foreground,
+ * success, warning and error colors provided. If the icon is not a symbolic
+ * one, the function will return the result from gtk_icon_info_load_icon().
+ *
+ * This allows loading symbolic icons that will match the system theme.
+ *
+ * See gtk_icon_info_load_symbolic() for more details.
+ *
+ * Return value: (transfer full): a #GdkPixbuf representing the loaded icon
+ *
+ * Since: 3.0
+ *
+ * Deprecated: 3.0: Use gtk_icon_info_load_symbolic_for_context() instead
+ **/
+GdkPixbuf *
+gtk_icon_info_load_symbolic_for_style (GtkIconInfo *icon_info,
+ GtkStyle *style,
+ GtkStateType state,
+ gboolean *was_symbolic,
+ GError **error)
+{
+ GdkColor color;
+ GdkRGBA fg;
+ GdkRGBA success_color;
+ GdkRGBA *success_colorp;
+ GdkRGBA warning_color;
+ GdkRGBA *warning_colorp;
+ GdkRGBA error_color;
+ GdkRGBA *error_colorp;
+ gchar *icon_uri;
+ gboolean is_symbolic;
+
+ g_return_val_if_fail (icon_info != NULL, NULL);
+ g_return_val_if_fail (style != NULL, NULL);
+
+ icon_uri = NULL;
+ if (icon_info->icon_file)
+ icon_uri = g_file_get_uri (icon_info->icon_file);
+
+ is_symbolic = (icon_uri != NULL) && (g_str_has_suffix (icon_uri, "-symbolic.svg"));
+ g_free (icon_uri);
+
+ if (was_symbolic)
+ *was_symbolic = is_symbolic;
+
+ if (!is_symbolic)
+ return gtk_icon_info_load_icon (icon_info, error);
+
+ color_to_rgba (&style->fg[state], &fg);
+
+ success_colorp = warning_colorp = error_colorp = NULL;
+
+ if (gtk_style_lookup_color (style, "success_color", &color))
+ success_colorp = color_to_rgba (&color, &success_color);
+
+ if (gtk_style_lookup_color (style, "warning_color", &color))
+ warning_colorp = color_to_rgba (&color, &warning_color);
+
+ if (gtk_style_lookup_color (style, "error_color", &color))
+ error_colorp = color_to_rgba (&color, &error_color);
+
+ return _gtk_icon_info_load_symbolic_internal (icon_info,
+ &fg, success_colorp,
+ warning_colorp, error_colorp,
+ TRUE,
+ error);