mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-07 11:20:09 +00:00
Emit an error if image loading fails
Instead of spamming stderr with g_warning, use the new emit_error method of the GtkStyleProviderPrivate interface to emit an error if loading an image fails.
This commit is contained in:
parent
2c7fdf6432
commit
0fe468c789
@ -99,35 +99,46 @@ lookup_symbolic_colors (GtkCssStyle *style,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GtkCssImage *
|
static GtkCssImage *
|
||||||
gtk_css_image_recolor_load (GtkCssImageRecolor *recolor,
|
gtk_css_image_recolor_load (GtkCssImageRecolor *recolor,
|
||||||
GtkCssStyle *style,
|
GtkCssStyle *style,
|
||||||
GtkCssValue *palette,
|
GtkCssValue *palette,
|
||||||
gint scale)
|
gint scale,
|
||||||
|
GError **gerror)
|
||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (recolor);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (recolor);
|
||||||
GtkIconInfo *info;
|
GtkIconInfo *info;
|
||||||
GdkRGBA fg, success, warning, error;
|
GdkRGBA fg, success, warning, error;
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
GtkCssImage *image;
|
GtkCssImage *image;
|
||||||
GError *gerror = NULL;
|
GError *local_error = NULL;
|
||||||
|
|
||||||
lookup_symbolic_colors (style, palette, &fg, &success, &warning, &error);
|
lookup_symbolic_colors (style, palette, &fg, &success, &warning, &error);
|
||||||
|
|
||||||
info = gtk_icon_info_new_for_file (url->file, 0, scale);
|
info = gtk_icon_info_new_for_file (url->file, 0, scale);
|
||||||
pixbuf = gtk_icon_info_load_symbolic (info, &fg, &success, &warning, &error, NULL, &gerror);
|
pixbuf = gtk_icon_info_load_symbolic (info, &fg, &success, &warning, &error, NULL, &local_error);
|
||||||
g_object_unref (info);
|
g_object_unref (info);
|
||||||
|
|
||||||
if (pixbuf == NULL)
|
if (pixbuf == NULL)
|
||||||
{
|
{
|
||||||
char *uri;
|
cairo_surface_t *empty;
|
||||||
|
|
||||||
/* XXX: Get the error somehow back to the CssProvider */
|
if (gerror)
|
||||||
uri = g_file_get_uri (url->file);
|
{
|
||||||
g_warning ("Error loading image '%s': %s\n", uri, gerror->message);
|
char *uri;
|
||||||
g_error_free (gerror);
|
|
||||||
g_free (uri);
|
|
||||||
|
|
||||||
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), "image-missing", 24, 0, NULL);
|
uri = g_file_get_uri (url->file);
|
||||||
|
g_set_error (gerror,
|
||||||
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
|
"Error loading image '%s': %s", uri, local_error->message);
|
||||||
|
g_error_free (local_error);
|
||||||
|
g_free (uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
empty = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
|
||||||
|
image = _gtk_css_image_surface_new (empty);
|
||||||
|
cairo_surface_destroy (empty);
|
||||||
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
image = _gtk_css_image_surface_new_for_pixbuf (pixbuf);
|
image = _gtk_css_image_surface_new_for_pixbuf (pixbuf);
|
||||||
@ -147,6 +158,7 @@ gtk_css_image_recolor_compute (GtkCssImage *image,
|
|||||||
GtkCssValue *palette;
|
GtkCssValue *palette;
|
||||||
GtkCssImage *img;
|
GtkCssImage *img;
|
||||||
int scale;
|
int scale;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
scale = _gtk_style_provider_private_get_scale (provider);
|
scale = _gtk_style_provider_private_get_scale (provider);
|
||||||
|
|
||||||
@ -155,7 +167,14 @@ gtk_css_image_recolor_compute (GtkCssImage *image,
|
|||||||
else
|
else
|
||||||
palette = _gtk_css_value_ref (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_PALETTE));
|
palette = _gtk_css_value_ref (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_PALETTE));
|
||||||
|
|
||||||
img = gtk_css_image_recolor_load (recolor, style, palette, scale);
|
img = gtk_css_image_recolor_load (recolor, style, palette, scale, &error);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
GtkCssSection *section = gtk_css_style_get_section (style, property_id);
|
||||||
|
_gtk_style_provider_private_emit_error (provider, section, error);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
_gtk_css_value_unref (palette);
|
_gtk_css_value_unref (palette);
|
||||||
|
|
||||||
|
@ -23,14 +23,16 @@
|
|||||||
|
|
||||||
#include "gtkcssimageurlprivate.h"
|
#include "gtkcssimageurlprivate.h"
|
||||||
#include "gtkcssimagesurfaceprivate.h"
|
#include "gtkcssimagesurfaceprivate.h"
|
||||||
|
#include "gtkstyleproviderprivate.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (GtkCssImageUrl, _gtk_css_image_url, GTK_TYPE_CSS_IMAGE)
|
G_DEFINE_TYPE (GtkCssImageUrl, _gtk_css_image_url, GTK_TYPE_CSS_IMAGE)
|
||||||
|
|
||||||
static GtkCssImage *
|
static GtkCssImage *
|
||||||
gtk_css_image_url_load_image (GtkCssImageUrl *url)
|
gtk_css_image_url_load_image (GtkCssImageUrl *url,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
GError *error = NULL;
|
GError *local_error = NULL;
|
||||||
GFileInputStream *input;
|
GFileInputStream *input;
|
||||||
|
|
||||||
if (url->loaded_image)
|
if (url->loaded_image)
|
||||||
@ -44,16 +46,16 @@ gtk_css_image_url_load_image (GtkCssImageUrl *url)
|
|||||||
char *uri = g_file_get_uri (url->file);
|
char *uri = g_file_get_uri (url->file);
|
||||||
char *resource_path = g_uri_unescape_string (uri + strlen ("resource://"), NULL);
|
char *resource_path = g_uri_unescape_string (uri + strlen ("resource://"), NULL);
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_resource (resource_path, &error);
|
pixbuf = gdk_pixbuf_new_from_resource (resource_path, &local_error);
|
||||||
g_free (resource_path);
|
g_free (resource_path);
|
||||||
g_free (uri);
|
g_free (uri);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
input = g_file_read (url->file, NULL, &error);
|
input = g_file_read (url->file, NULL, &local_error);
|
||||||
if (input != NULL)
|
if (input != NULL)
|
||||||
{
|
{
|
||||||
pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (input), NULL, &error);
|
pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (input), NULL, &local_error);
|
||||||
g_object_unref (input);
|
g_object_unref (input);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -64,15 +66,22 @@ gtk_css_image_url_load_image (GtkCssImageUrl *url)
|
|||||||
|
|
||||||
if (pixbuf == NULL)
|
if (pixbuf == NULL)
|
||||||
{
|
{
|
||||||
cairo_surface_t *empty = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
|
cairo_surface_t *empty;
|
||||||
char *uri;
|
|
||||||
|
|
||||||
/* XXX: Can we get the error somehow sent to the CssProvider?
|
if (error)
|
||||||
* I don't like just dumping it to stderr or losing it completely. */
|
{
|
||||||
uri = g_file_get_uri (url->file);
|
char *uri;
|
||||||
g_warning ("Error loading image '%s': %s", uri, error->message);
|
|
||||||
g_error_free (error);
|
uri = g_file_get_uri (url->file);
|
||||||
g_free (uri);
|
g_set_error (error,
|
||||||
|
GTK_CSS_PROVIDER_ERROR,
|
||||||
|
GTK_CSS_PROVIDER_ERROR_FAILED,
|
||||||
|
"Error loading image '%s': %s", uri, local_error->message);
|
||||||
|
g_error_free (local_error);
|
||||||
|
g_free (uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
empty = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
|
||||||
url->loaded_image = _gtk_css_image_surface_new (empty);
|
url->loaded_image = _gtk_css_image_surface_new (empty);
|
||||||
cairo_surface_destroy (empty);
|
cairo_surface_destroy (empty);
|
||||||
return url->loaded_image;
|
return url->loaded_image;
|
||||||
@ -89,7 +98,7 @@ gtk_css_image_url_get_width (GtkCssImage *image)
|
|||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
|
||||||
return _gtk_css_image_get_width (gtk_css_image_url_load_image (url));
|
return _gtk_css_image_get_width (gtk_css_image_url_load_image (url, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -97,7 +106,7 @@ gtk_css_image_url_get_height (GtkCssImage *image)
|
|||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
|
||||||
return _gtk_css_image_get_height (gtk_css_image_url_load_image (url));
|
return _gtk_css_image_get_height (gtk_css_image_url_load_image (url, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
static double
|
static double
|
||||||
@ -105,7 +114,7 @@ gtk_css_image_url_get_aspect_ratio (GtkCssImage *image)
|
|||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
|
||||||
return _gtk_css_image_get_aspect_ratio (gtk_css_image_url_load_image (url));
|
return _gtk_css_image_get_aspect_ratio (gtk_css_image_url_load_image (url, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -116,7 +125,7 @@ gtk_css_image_url_draw (GtkCssImage *image,
|
|||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
|
||||||
_gtk_css_image_draw (gtk_css_image_url_load_image (url), cr, width, height);
|
_gtk_css_image_draw (gtk_css_image_url_load_image (url, NULL), cr, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkCssImage *
|
static GtkCssImage *
|
||||||
@ -127,8 +136,18 @@ gtk_css_image_url_compute (GtkCssImage *image,
|
|||||||
GtkCssStyle *parent_style)
|
GtkCssStyle *parent_style)
|
||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
GtkCssImage *copy;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
return g_object_ref (gtk_css_image_url_load_image (url));
|
copy = gtk_css_image_url_load_image (url, &error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
GtkCssSection *section = gtk_css_style_get_section (style, property_id);
|
||||||
|
_gtk_style_provider_private_emit_error (provider, section, error);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_object_ref (copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -150,7 +169,7 @@ gtk_css_image_url_print (GtkCssImage *image,
|
|||||||
{
|
{
|
||||||
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
|
||||||
|
|
||||||
_gtk_css_image_print (gtk_css_image_url_load_image (url), string);
|
_gtk_css_image_print (gtk_css_image_url_load_image (url, NULL), string);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user