diff options
author | Alexander Larsson <alexl@redhat.com> | 2020-01-28 14:54:18 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2020-01-29 19:12:15 +0100 |
commit | 6af4b6a644bb8ad29088cf5dc37dbe426a005937 (patch) | |
tree | d81603c08bdac0fff0d240cc23f65cb0c7a39f61 /gtk | |
parent | 0d666f0cec38b53f5c181b43c948892b906768f7 (diff) | |
download | gtk+-6af4b6a644bb8ad29088cf5dc37dbe426a005937.tar.gz |
icon-theme: Drop all load() calls from GtkIconInfo
All users now either use it directly as a paintable or download
the texture to use the pixels.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkicontheme.c | 1019 | ||||
-rw-r--r-- | gtk/gtkicontheme.h | 65 |
2 files changed, 27 insertions, 1057 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index ff9f307ab7..1d88e81e26 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -2517,115 +2517,40 @@ gtk_icon_theme_error_quark (void) return g_quark_from_static_string ("gtk-icon-theme-error-quark"); } -/** - * gtk_icon_theme_load_icon: - * @self: a #GtkIconTheme - * @icon_name: the name of the icon to lookup - * @size: the desired icon size. The resulting icon may not be - * exactly this size; see gtk_icon_info_load_icon(). - * @flags: flags modifying the behavior of the icon lookup - * @error: (allow-none): Location to store error information on failure, - * or %NULL. - * - * Looks up an icon in an icon theme, scales it to the given size - * and renders it into a pixbuf. This is a convenience function; - * if more details about the icon are needed, use - * gtk_icon_theme_lookup_icon() followed by gtk_icon_info_load_icon(). - * - * Note that you probably want to listen for icon theme changes and - * update the icon. This is usually done by connecting to the - * GtkWidget::style-set signal. If for some reason you do not want to - * update the icon when the icon theme changes, you should consider - * using gdk_pixbuf_copy() to make a private copy of the pixbuf - * returned by this function. Otherwise GTK+ may need to keep the old - * icon theme loaded, which would be a waste of memory. - * - * Returns: (nullable) (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. %NULL if the icon isn’t found. - */ -GdkPaintable * -gtk_icon_theme_load_icon (GtkIconTheme *self, - const gchar *icon_name, - gint size, - GtkIconLookupFlags flags, - GError **error) -{ - g_return_val_if_fail (GTK_IS_ICON_THEME (self), NULL); - g_return_val_if_fail (icon_name != NULL, NULL); - g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 || - (flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - - return gtk_icon_theme_load_icon_for_scale (self, icon_name, - size, 1, flags, error); -} - -/** - * gtk_icon_theme_load_icon_for_scale: - * @self: a #GtkIconTheme - * @icon_name: the name of the icon to lookup - * @size: the desired icon size. The resulting icon may not be - * exactly this size; see gtk_icon_info_load_icon(). - * @scale: desired scale - * @flags: flags modifying the behavior of the icon lookup - * @error: (allow-none): Location to store error information on failure, - * or %NULL. - * - * Looks up an icon in an icon theme for a particular window scale, - * scales it to the given size and renders it into a pixbuf. This is a - * convenience function; if more details about the icon are needed, - * use gtk_icon_theme_lookup_icon() followed by - * gtk_icon_info_load_icon(). - * - * Note that you probably want to listen for icon theme changes and - * update the icon. This is usually done by connecting to the - * GtkWidget::style-set signal. If for some reason you do not want to - * update the icon when the icon theme changes, you should consider - * using gdk_pixbuf_copy() to make a private copy of the pixbuf - * returned by this function. Otherwise GTK+ may need to keep the old - * icon theme loaded, which would be a waste of memory. - * - * Returns: (nullable) (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. %NULL if the icon isn’t found. - */ -GdkPaintable * -gtk_icon_theme_load_icon_for_scale (GtkIconTheme *self, - const gchar *icon_name, - gint size, - gint scale, - GtkIconLookupFlags flags, - GError **error) +void +gtk_icon_theme_lookup_symbolic_colors (GtkCssStyle *style, + GdkRGBA *color_out, + GdkRGBA *success_out, + GdkRGBA *warning_out, + GdkRGBA *error_out) { - GtkIconInfo *icon_info; - GdkPaintable *paintable = NULL; + GtkCssValue *palette, *color; + const GdkRGBA *lookup; - g_return_val_if_fail (GTK_IS_ICON_THEME (self), NULL); - g_return_val_if_fail (icon_name != NULL, NULL); - g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 || - (flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - g_return_val_if_fail (scale >= 1, NULL); + color = style->core->color; + palette = style->core->icon_palette; + *color_out = *gtk_css_color_value_get_rgba (color); - icon_info = gtk_icon_theme_lookup_icon_for_scale (self, icon_name, size, scale, - flags | GTK_ICON_LOOKUP_USE_BUILTIN); - if (!icon_info) - { - g_set_error (error, GTK_ICON_THEME_ERROR, GTK_ICON_THEME_NOT_FOUND, - _("Icon “%s” not present in theme %s"), icon_name, self->current_theme); - return NULL; - } + lookup = gtk_css_palette_value_get_color (palette, "success"); + if (lookup) + *success_out = *lookup; + else + *success_out = *color_out; - paintable = gtk_icon_info_load_icon (icon_info, error); - g_prefix_error (error, "Failed to load %s: ", icon_info->filename); - g_object_unref (icon_info); + lookup = gtk_css_palette_value_get_color (palette, "warning"); + if (lookup) + *warning_out = *lookup; + else + *warning_out = *color_out; - return paintable; + lookup = gtk_css_palette_value_get_color (palette, "error"); + if (lookup) + *error_out = *lookup; + else + *error_out = *color_out; } + /** * gtk_icon_theme_has_icon: * @self: a #GtkIconTheme @@ -3601,48 +3526,6 @@ icon_info_compute_rendered_size (GtkIconInfo *icon_info) icon_info->rendered_size = rendered_size; } -/* This only copies whatever is needed to load the pixbuf, - * so that we can do a load in a thread without affecting - * the original IconInfo from the thread. - */ -static GtkIconInfo * -icon_info_dup (GtkIconInfo *icon_info) -{ - GtkIconInfo *dup; - - dup = icon_info_new (icon_info->dir_type, icon_info->dir_size, icon_info->dir_scale); - - dup->filename = g_strdup (icon_info->filename); - dup->is_svg = icon_info->is_svg; - - if (icon_info->loadable) - dup->loadable = g_object_ref (icon_info->loadable); - - if (icon_info->cache_pixbuf) - dup->cache_pixbuf = g_object_ref (icon_info->cache_pixbuf); - - dup->unscaled_scale = icon_info->unscaled_scale; - dup->desired_size = icon_info->desired_size; - dup->desired_scale = icon_info->desired_scale; - dup->forced_size = icon_info->forced_size; - dup->rendered_size = icon_info->rendered_size; - dup->is_resource = icon_info->is_resource; - dup->min_size = icon_info->min_size; - dup->max_size = icon_info->max_size; - - g_mutex_lock (&icon_info->cache_lock); - - if (icon_info->texture) - dup->texture = g_object_ref (icon_info->texture); - dup->scale = icon_info->scale; - dup->symbolic_width = icon_info->symbolic_width; - dup->symbolic_height = icon_info->symbolic_height; - - g_mutex_unlock (&icon_info->cache_lock); - - return dup; -} - static void gtk_icon_info_finalize (GObject *object) { @@ -3762,29 +3645,6 @@ gtk_icon_info_is_symbolic (GtkIconInfo *icon_info) icon_uri_is_symbolic (icon_info->filename, -1); } -/* If this returns TRUE, its safe to call icon_info_ensure_scale_and_texture__locked - * without blocking. Call with cache_lock held. - */ -static gboolean -icon_info_get_pixbuf_ready__locked (GtkIconInfo *icon_info) -{ - return icon_info->texture != NULL || icon_info->load_error != NULL; -} - -static gboolean -icon_info_get_pixbuf_ready__unlocked (GtkIconInfo *icon_info) -{ - gboolean res; - - g_mutex_lock (&icon_info->cache_lock); - - res = icon_info_get_pixbuf_ready__locked (icon_info); - - g_mutex_unlock (&icon_info->cache_lock); - - return res; -} - static void icon_info_add_to_lru_cache__locked (GtkIconInfo *info) { @@ -4239,831 +4099,6 @@ icon_info_paintable_init (GdkPaintableInterface *iface) iface->get_intrinsic_height = icon_info_paintable_get_intrinsic_height; } - -/** - * gtk_icon_info_load_icon: - * @self: a #GtkIconInfo from gtk_icon_theme_lookup_icon() - * @error: (allow-none): location to store error information on failure, - * or %NULL. - * - * Renders an icon previously looked up in an icon theme using - * gtk_icon_theme_lookup_icon(); the size will be based on the size - * passed to gtk_icon_theme_lookup_icon(). Note that the resulting - * pixbuf may not be exactly this size; an icon theme may have icons - * that differ slightly from their nominal sizes, and in addition GTK+ - * will avoid scaling icons that it considers sufficiently close to the - * requested size or for which the source image would have to be scaled - * up too far. (This maintains sharpness.). This behaviour can be changed - * by passing the %GTK_ICON_LOOKUP_FORCE_SIZE flag when obtaining - * the #GtkIconInfo. If this flag has been specified, the pixbuf - * returned by this function will be scaled to the exact size. - * - * Returns: (transfer full) (nullable): the rendered icon. - * Use g_object_unref() to release your reference to the icon. - */ -GdkPaintable * -gtk_icon_info_load_icon (GtkIconInfo *icon_info, - GError **error) -{ - g_return_val_if_fail (icon_info != NULL, NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - GdkPaintable *paintable = NULL; - - g_mutex_lock (&icon_info->cache_lock); - - if (!icon_info->texture) - { - icon_info_ensure_scale_and_texture__locked (icon_info); - - /* Still no texture -> error */ - if (!icon_info->texture) - { - if (icon_info->load_error) - { - if (error) - *error = g_error_copy (icon_info->load_error); - } - else - { - g_set_error_literal (error, - GTK_ICON_THEME_ERROR, - GTK_ICON_THEME_NOT_FOUND, - _("Failed to load icon")); - } - - goto out; - } - } - - paintable = GDK_PAINTABLE (g_object_ref (icon_info->texture)); - - out: - g_mutex_unlock (&icon_info->cache_lock); - - return paintable; -} - -/** - * gtk_icon_info_load_icon_async: - * @self: a #GtkIconInfo from gtk_icon_theme_lookup_icon() - * @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 an icon previously looked up - * from the icon theme using gtk_icon_theme_lookup_icon(). - * - * For more details, see gtk_icon_info_load_icon() which is the synchronous - * version of this call. - */ -void -gtk_icon_info_load_icon_async (GtkIconInfo *icon_info, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - - task = g_task_new (icon_info, cancellable, callback, user_data); - - if (icon_info_get_pixbuf_ready__unlocked (icon_info)) - { - GError *error = NULL; - GdkPaintable *paintable = gtk_icon_info_load_icon (icon_info, &error); - - if (paintable == NULL) - g_task_return_error (task, error); - else - g_task_return_pointer (task, paintable, g_object_unref); - } - else - { - GtkIconInfo *dup = icon_info_dup (icon_info); - g_task_set_task_data (task, dup, g_object_unref); - g_task_run_in_thread (task, load_icon_thread); - } - - g_object_unref (task); -} - -/** - * gtk_icon_info_load_icon_finish: - * @self: a #GtkIconInfo from gtk_icon_theme_lookup_icon() - * @res: a #GAsyncResult - * @error: (allow-none): location to store error information on failure, - * or %NULL. - * - * Finishes an async icon load, see gtk_icon_info_load_icon_async(). - * - * Returns: (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. - */ -GdkPaintable * -gtk_icon_info_load_icon_finish (GtkIconInfo *icon_info, - GAsyncResult *result, - GError **error) -{ - GTask *task = G_TASK (result); - GtkIconInfo *dup; - - g_return_val_if_fail (g_task_is_valid (result, icon_info), NULL); - - dup = g_task_get_task_data (task); - if (dup == NULL || g_task_had_error (task)) - return g_task_propagate_pointer (task, error); - - /* We ran the thread and it was not cancelled */ - - /* Check if someone else updated the icon_info in between */ - g_mutex_lock (&icon_info->cache_lock); - if (!icon_info_get_pixbuf_ready__locked (icon_info)) - { - /* If not, copy results from dup back to icon_info */ - icon_info->scale = dup->scale; - g_clear_object (&icon_info->texture); - if (dup->texture) - icon_info->texture = g_object_ref (dup->texture); - g_clear_error (&icon_info->load_error); - if (dup->load_error) - icon_info->load_error = g_error_copy (dup->load_error); - } - - g_assert (icon_info_get_pixbuf_ready__locked (icon_info)); - - g_mutex_unlock (&icon_info->cache_lock); - - /* This is now guaranteed to not block */ - return gtk_icon_info_load_icon (icon_info, error); -} - -static GdkPixbuf * -gtk_icon_info_load_symbolic_png (GtkIconInfo *icon_info, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - GError **error) -{ - GdkRGBA fg_default = { 0.7450980392156863, 0.7450980392156863, 0.7450980392156863, 1.0}; - GdkRGBA success_default = { 0.3046921492332342,0.6015716792553597, 0.023437857633325704, 1.0}; - GdkRGBA warning_default = {0.9570458533607996, 0.47266346227206835, 0.2421911955443656, 1.0 }; - GdkRGBA error_default = { 0.796887159533074, 0 ,0, 1.0 }; - GdkPixbuf *pixbuf; - GdkPixbuf *colored; - - g_mutex_lock (&icon_info->cache_lock); - - if (!icon_info_ensure_scale_and_texture__locked (icon_info)) - { - if (icon_info->load_error) - { - if (error) - *error = g_error_copy (icon_info->load_error); - } - else - { - g_set_error_literal (error, - GTK_ICON_THEME_ERROR, - GTK_ICON_THEME_NOT_FOUND, - _("Failed to load icon")); - } - g_mutex_unlock (&icon_info->cache_lock); - - return NULL; - } - - pixbuf = gdk_pixbuf_get_from_texture (icon_info->texture); - g_mutex_unlock (&icon_info->cache_lock); - - colored = gtk_color_symbolic_pixbuf (pixbuf, - fg ? fg : &fg_default, - success_color ? success_color : &success_default, - warning_color ? warning_color : &warning_default, - error_color ? error_color : &error_default); - g_object_unref (pixbuf); - return colored; -} - -#define MAX_RGB_STRING_LENGTH (3 + 1 + ((3 + 1) * 3) + 1 + 1) -static inline void -rgba_to_string_noalpha (const GdkRGBA *rgba, - char *buff) -{ - /* gdk_rgba_to_string inlined in here for the alpha == 1 case, - * and g_strdup_printf replaced with g_snprintf */ - g_snprintf (buff, - MAX_RGB_STRING_LENGTH, - "rgb(%d,%d,%d)", - (int)(0.5 + CLAMP (rgba->red, 0., 1.) * 255.), - (int)(0.5 + CLAMP (rgba->green, 0., 1.) * 255.), - (int)(0.5 + CLAMP (rgba->blue, 0., 1.) * 255.)); -} - -static GdkPixbuf * -gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - GError **error) -{ - GInputStream *stream; - GdkPixbuf *pixbuf; - char css_fg[MAX_RGB_STRING_LENGTH]; - char css_warning[MAX_RGB_STRING_LENGTH] = "rgb(245,121,62)"; - char css_success[MAX_RGB_STRING_LENGTH] = "rgb(78,154,6)"; - char css_error[MAX_RGB_STRING_LENGTH] = "rgb(204,0,0)"; - gchar *svg_data; - gchar *width; - gchar *height; - guint texture_width, texture_height; - char *escaped_file_data; - double alpha; - gchar alphastr[G_ASCII_DTOSTR_BUF_SIZE]; - - alpha = fg->alpha; - - rgba_to_string_noalpha (fg, css_fg); - - if (warning_color) - rgba_to_string_noalpha (warning_color, css_warning); - - if (error_color) - rgba_to_string_noalpha (error_color, css_error); - - if (success_color) - rgba_to_string_noalpha (success_color, css_success); - - if (icon_info->is_resource) - { - GBytes *bytes; - const char *data; - gsize file_len; - - bytes = g_resources_lookup_data (icon_info->filename, G_RESOURCE_LOOKUP_FLAGS_NONE, error); - if (bytes == NULL) - return NULL; - data = g_bytes_get_data (bytes, &file_len); - escaped_file_data = g_base64_encode ((guchar *) data, file_len); - g_bytes_unref (bytes); - } - else - { - char *file_data; - gsize file_len; - - if (!g_file_get_contents (icon_info->filename, &file_data, &file_len, error)) - return NULL; - escaped_file_data = g_base64_encode ((guchar *) file_data, file_len); - g_free (file_data); - } - - g_mutex_lock (&icon_info->cache_lock); - if (!icon_info_ensure_scale_and_texture__locked (icon_info)) - { - g_propagate_error (error, icon_info->load_error); - icon_info->load_error = NULL; - g_mutex_unlock (&icon_info->cache_lock); - g_free (escaped_file_data); - return NULL; - } - - if (icon_info->symbolic_width == 0 || - icon_info->symbolic_height == 0) - { - /* Fetch size from the original icon */ - if (icon_info->is_resource) - pixbuf = gdk_pixbuf_new_from_resource (icon_info->filename, error); - else - pixbuf = gdk_pixbuf_new_from_file (icon_info->filename, error); - - if (!pixbuf) - { - g_free (escaped_file_data); - g_mutex_unlock (&icon_info->cache_lock); - return NULL; - } - - icon_info->symbolic_width = gdk_pixbuf_get_width (pixbuf); - icon_info->symbolic_height = gdk_pixbuf_get_height (pixbuf); - g_object_unref (pixbuf); - } - - GTK_NOTE (ICONTHEME, { - int symbolic_size = MAX (icon_info->symbolic_width, icon_info->symbolic_height); - if (icon_info->dir_type == ICON_THEME_DIR_UNTHEMED) - g_message ("Symbolic icon %s is not in an icon theme directory", - icon_info->key.icon_names ? icon_info->key.icon_names[0] : icon_info->filename); - else if (icon_info->dir_size * icon_info->dir_scale != symbolic_size) - g_message ("Symbolic icon %s of size %d is in an icon theme directory of size %d", - icon_info->key.icon_names ? icon_info->key.icon_names[0] : icon_info->filename, - symbolic_size, - icon_info->dir_size * icon_info->dir_scale); - }); - - width = g_strdup_printf ("%d", icon_info->symbolic_width); - height = g_strdup_printf ("%d", icon_info->symbolic_height); - - texture_width = gdk_texture_get_width (icon_info->texture); - texture_height = gdk_texture_get_height (icon_info->texture); - - g_mutex_unlock (&icon_info->cache_lock); - - g_ascii_dtostr (alphastr, G_ASCII_DTOSTR_BUF_SIZE, CLAMP (alpha, 0, 1)); - - svg_data = g_strconcat ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" - "<svg version=\"1.1\"\n" - " xmlns=\"http://www.w3.org/2000/svg\"\n" - " xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n" - " width=\"", width, "\"\n" - " height=\"", height, "\">\n" - " <style type=\"text/css\">\n" - " rect,path,ellipse,circle,polygon {\n" - " fill: ", css_fg," !important;\n" - " }\n" - " .warning {\n" - " fill: ", css_warning, " !important;\n" - " }\n" - " .error {\n" - " fill: ", css_error ," !important;\n" - " }\n" - " .success {\n" - " fill: ", css_success, " !important;\n" - " }\n" - " </style>\n" - " <g opacity=\"", alphastr, "\" ><xi:include href=\"data:text/xml;base64,", escaped_file_data, "\"/></g>\n" - "</svg>", - NULL); - g_free (escaped_file_data); - g_free (width); - g_free (height); - - stream = g_memory_input_stream_new_from_data (svg_data, -1, g_free); - pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream, - "svg", - texture_width, - texture_height, - TRUE, - NULL, - error); - g_object_unref (stream); - - return pixbuf; -} - - -static GdkPixbuf * -gtk_icon_info_load_symbolic_internal (GtkIconInfo *icon_info, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - GError **error) -{ - GdkPixbuf *pixbuf; - - if (g_str_has_suffix (icon_info->filename, ".symbolic.png")) - pixbuf = gtk_icon_info_load_symbolic_png (icon_info, fg, success_color, warning_color, error_color, error); - else - pixbuf = gtk_icon_info_load_symbolic_svg (icon_info, fg, success_color, warning_color, error_color, error); - - return pixbuf; -} - -/** - * gtk_icon_info_load_symbolic: - * @self: a #GtkIconInfo - * @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 #GdkRGBA representing the warning color - * of the icon or %NULL to use the default 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: (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. - * - * Unless you are implementing a widget, you will want to use - * g_themed_icon_new_with_default_fallbacks() to load the icon. - * - * As implementation details, the icon loaded needs to be of SVG type, - * contain the “symbolic” term as the last component of the icon name, - * and use the “fg”, “success”, “warning” and “error” CSS styles in the - * SVG file itself. - * - * See the [Symbolic Icons Specification](http://www.freedesktop.org/wiki/SymbolicIcons) - * for more information about symbolic icons. - * - * Returns: (transfer full): a #GdkPixbuf representing the loaded icon - */ -GdkPaintable * -gtk_icon_info_load_symbolic (GtkIconInfo *icon_info, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - gboolean *was_symbolic, - GError **error) -{ - GdkPixbuf *pixbuf; - gboolean is_symbolic; - - g_return_val_if_fail (icon_info != NULL, NULL); - g_return_val_if_fail (fg != NULL, NULL); - - is_symbolic = gtk_icon_info_is_symbolic (icon_info); - - if (was_symbolic) - *was_symbolic = is_symbolic; - - if (!is_symbolic) - return gtk_icon_info_load_icon (icon_info, error); - - pixbuf = gtk_icon_info_load_symbolic_internal (icon_info, - fg, success_color, - warning_color, error_color, - error); - if (pixbuf) - { - GdkTexture *texture = gdk_texture_new_for_pixbuf (pixbuf); - g_object_unref (pixbuf); - - return GDK_PAINTABLE (texture); - } - - return NULL; -} - -void -gtk_icon_theme_lookup_symbolic_colors (GtkCssStyle *style, - GdkRGBA *color_out, - GdkRGBA *success_out, - GdkRGBA *warning_out, - GdkRGBA *error_out) -{ - GtkCssValue *palette, *color; - const GdkRGBA *lookup; - - color = style->core->color; - palette = style->core->icon_palette; - *color_out = *gtk_css_color_value_get_rgba (color); - - lookup = gtk_css_palette_value_get_color (palette, "success"); - if (lookup) - *success_out = *lookup; - else - *success_out = *color_out; - - lookup = gtk_css_palette_value_get_color (palette, "warning"); - if (lookup) - *warning_out = *lookup; - else - *warning_out = *color_out; - - lookup = gtk_css_palette_value_get_color (palette, "error"); - if (lookup) - *error_out = *lookup; - else - *error_out = *color_out; -} - -/** - * gtk_icon_info_load_symbolic_for_context: - * @self: a #GtkIconInfo - * @context: a #GtkStyleContext - * @was_symbolic: (out) (allow-none): a #gboolean, returns whether the - * loaded icon was a symbolic one and whether the foreground 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 colors 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 function uses the regular foreground color and the symbolic colors - * with the names “success_color”, “warning_color” and “error_color” from - * the context. - * - * This allows loading symbolic icons that will match the system theme. - * - * See gtk_icon_info_load_symbolic() for more details. - * - * Returns: (transfer full) (nullable): a #GdkPixbuf representing the loaded icon - * or %NULL If the icon could not be loaded - */ -GdkPaintable * -gtk_icon_info_load_symbolic_for_context (GtkIconInfo *icon_info, - GtkStyleContext *context, - gboolean *was_symbolic, - GError **error) -{ - GdkRGBA fg; - GdkRGBA success_color; - GdkRGBA warning_color; - GdkRGBA error_color; - gboolean is_symbolic; - GdkPixbuf *pixbuf; - - g_return_val_if_fail (icon_info != NULL, NULL); - g_return_val_if_fail (context != NULL, NULL); - - is_symbolic = gtk_icon_info_is_symbolic (icon_info); - - if (was_symbolic) - *was_symbolic = is_symbolic; - - if (!is_symbolic) - return gtk_icon_info_load_icon (icon_info, error); - - gtk_icon_theme_lookup_symbolic_colors (gtk_style_context_lookup_style (context), - &fg, &success_color, - &warning_color, &error_color); - - pixbuf = gtk_icon_info_load_symbolic_internal (icon_info, - &fg, &success_color, - &warning_color, &error_color, - error); - - if (pixbuf) - { - GdkTexture *texture = gdk_texture_new_for_pixbuf (pixbuf); - g_object_unref (pixbuf); - - return GDK_PAINTABLE (texture); - } - - return NULL; -} - -typedef struct { - guint is_symbolic : 1; - guint success_color_set : 1; - guint warning_color_set : 1; - guint error_color_set : 1; - guint fg_set : 1; - GtkIconInfo *dup; - GdkRGBA fg; - GdkRGBA success_color; - GdkRGBA warning_color; - GdkRGBA error_color; -} AsyncSymbolicData; - -static void -async_symbolic_data_free (AsyncSymbolicData *data) -{ - if (data->dup) - g_object_unref (data->dup); - g_slice_free (AsyncSymbolicData, data); -} - -static void -async_load_no_symbolic_cb (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GtkIconInfo *icon_info = GTK_ICON_INFO (source_object); - GTask *task = user_data; - GError *error = NULL; - GdkPaintable *paintable; - - paintable = gtk_icon_info_load_icon_finish (icon_info, res, &error); - if (paintable == NULL) - g_task_return_error (task, error); - else - g_task_return_pointer (task, paintable, g_object_unref); - g_object_unref (task); -} - -static void -load_symbolic_icon_thread (GTask *task, - gpointer source_object, - gpointer task_data, - GCancellable *cancellable) -{ - AsyncSymbolicData *data = task_data; - GError *error; - GdkPixbuf *pixbuf; - - error = NULL; - pixbuf = gtk_icon_info_load_symbolic_internal (data->dup, - 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, - &error); - if (pixbuf == NULL) - g_task_return_error (task, error); - else - g_task_return_pointer (task, pixbuf, g_object_unref); -} - -/** - * gtk_icon_info_load_symbolic_async: - * @self: a #GtkIconInfo from gtk_icon_theme_lookup_icon() - * @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 #GdkRGBA representing the warning color - * of the icon or %NULL to use the default color - * @error_color: (allow-none): a #GdkRGBA representing the error color - * of the icon or %NULL to use the default color (allow-none) - * @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() which is the synchronous - * version of this call. - */ -void -gtk_icon_info_load_symbolic_async (GtkIconInfo *icon_info, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - AsyncSymbolicData *data; - - g_return_if_fail (icon_info != NULL); - g_return_if_fail (fg != NULL); - - task = g_task_new (icon_info, cancellable, callback, user_data); - - data = g_slice_new0 (AsyncSymbolicData); - g_task_set_task_data (task, data, (GDestroyNotify) async_symbolic_data_free); - - data->is_symbolic = gtk_icon_info_is_symbolic (icon_info); - - if (!data->is_symbolic) - { - gtk_icon_info_load_icon_async (icon_info, cancellable, async_load_no_symbolic_cb, g_object_ref (task)); - } - else - { - if (fg) - { - data->fg = *fg; - data->fg_set = TRUE; - } - - if (success_color) - { - data->success_color = *success_color; - data->success_color_set = TRUE; - } - - if (warning_color) - { - data->warning_color = *warning_color; - data->warning_color_set = TRUE; - } - - if (error_color) - { - data->error_color = *error_color; - data->error_color_set = TRUE; - } - - data->dup = icon_info_dup (icon_info); - g_task_run_in_thread (task, load_symbolic_icon_thread); - } - g_object_unref (task); -} - -/** - * gtk_icon_info_load_symbolic_finish: - * @self: a #GtkIconInfo 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_async(). - * - * Returns: (transfer full): the rendered icon; - * Use g_object_unref() to release your reference - * to the icon. - */ -GdkPaintable * -gtk_icon_info_load_symbolic_finish (GtkIconInfo *icon_info, - GAsyncResult *result, - gboolean *was_symbolic, - GError **error) -{ - GTask *task = G_TASK (result); - AsyncSymbolicData *data = g_task_get_task_data (task); - GdkPixbuf *pixbuf; - GdkTexture *texture; - - if (was_symbolic) - *was_symbolic = data->is_symbolic; - - 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 */ - } - else - { - pixbuf = g_task_propagate_pointer (task, error); - } - - texture = gdk_texture_new_for_pixbuf (pixbuf); - g_object_unref (pixbuf); - - return GDK_PAINTABLE (texture); -} - -/** - * gtk_icon_info_load_symbolic_for_context_async: - * @self: a #GtkIconInfo 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. - */ -void -gtk_icon_info_load_symbolic_for_context_async (GtkIconInfo *icon_info, - GtkStyleContext *context, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GdkRGBA fg; - GdkRGBA success_color; - GdkRGBA warning_color; - GdkRGBA error_color; - - g_return_if_fail (icon_info != NULL); - g_return_if_fail (context != NULL); - - gtk_icon_theme_lookup_symbolic_colors (gtk_style_context_lookup_style (context), - &fg, &success_color, - &warning_color, &error_color); - - gtk_icon_info_load_symbolic_async (icon_info, - &fg, &success_color, - &warning_color, &error_color, - cancellable, callback, user_data); -} - -/** - * gtk_icon_info_load_symbolic_for_context_finish: - * @self: a #GtkIconInfo 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(). - * - * Returns: (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. - */ -GdkPaintable * -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); -} - /** * gtk_icon_theme_lookup_by_gicon: * @self: a #GtkIconTheme diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h index 6ec132b272..c1f60303be 100644 --- a/gtk/gtkicontheme.h +++ b/gtk/gtkicontheme.h @@ -182,20 +182,6 @@ GtkIconInfo * gtk_icon_theme_choose_icon_finish (GtkIconTheme GAsyncResult *result, GError **error); GDK_AVAILABLE_IN_ALL -GdkPaintable *gtk_icon_theme_load_icon (GtkIconTheme *self, - const char *icon_name, - int size, - GtkIconLookupFlags flags, - GError **error); -GDK_AVAILABLE_IN_ALL -GdkPaintable *gtk_icon_theme_load_icon_for_scale (GtkIconTheme *self, - const gchar *icon_name, - gint size, - gint scale, - GtkIconLookupFlags flags, - GError **error); - -GDK_AVAILABLE_IN_ALL GtkIconInfo * gtk_icon_theme_lookup_by_gicon (GtkIconTheme *self, GIcon *icon, gint size, @@ -246,57 +232,6 @@ void gtk_icon_info_snapshot_with_colors (GtkIconInfo *icon_info const GdkRGBA *success_color, const GdkRGBA *warning_color, const GdkRGBA *error_color); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_icon (GtkIconInfo *self, - GError **error); -GDK_AVAILABLE_IN_ALL -void gtk_icon_info_load_icon_async (GtkIconInfo *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_icon_finish (GtkIconInfo *self, - GAsyncResult *res, - GError **error); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_symbolic (GtkIconInfo *self, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - gboolean *was_symbolic, - GError **error); -GDK_AVAILABLE_IN_ALL -void gtk_icon_info_load_symbolic_async (GtkIconInfo *self, - const GdkRGBA *fg, - const GdkRGBA *success_color, - const GdkRGBA *warning_color, - const GdkRGBA *error_color, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_symbolic_finish (GtkIconInfo *self, - GAsyncResult *res, - gboolean *was_symbolic, - GError **error); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_symbolic_for_context (GtkIconInfo *self, - GtkStyleContext *context, - gboolean *was_symbolic, - GError **error); -GDK_AVAILABLE_IN_ALL -void gtk_icon_info_load_symbolic_for_context_async (GtkIconInfo *self, - GtkStyleContext *context, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -GDK_AVAILABLE_IN_ALL -GdkPaintable * gtk_icon_info_load_symbolic_for_context_finish (GtkIconInfo *self, - GAsyncResult *res, - gboolean *was_symbolic, - GError **error); - G_END_DECLS |