cssimage: Store the URI we're loaded from

I'd like to use it when printing the value, but I haven't found a way to
do that sanely yet, as I'd need to be able to print relative paths for
make check to work (otherwise the srcdir would blow things up). And we
use a GString to output to, so there's no way to attach a base dir to
that.

If anyone has an idea how to achieve that, poke me. Having the real
filename in debug prints sounds like a very good idea to me.

https://bugzilla.gnome.org/show_bug.cgi?id=692934
This commit is contained in:
Benjamin Otte 2013-01-02 15:27:00 +01:00
parent 5607a2125f
commit 6348ded15d
2 changed files with 8 additions and 7 deletions

View File

@ -66,21 +66,20 @@ gtk_css_image_url_parse (GtkCssImage *image,
{ {
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image); GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GFile *file;
cairo_t *cr; cairo_t *cr;
GError *error = NULL; GError *error = NULL;
GFileInputStream *input; GFileInputStream *input;
file = _gtk_css_parser_read_url (parser); url->file = _gtk_css_parser_read_url (parser);
if (file == NULL) if (url->file == NULL)
return FALSE; return FALSE;
/* We special case resources here so we can use /* We special case resources here so we can use
gdk_pixbuf_new_from_resource, which in turn has some special casing gdk_pixbuf_new_from_resource, which in turn has some special casing
for GdkPixdata files to avoid duplicating the memory for the pixbufs */ for GdkPixdata files to avoid duplicating the memory for the pixbufs */
if (g_file_has_uri_scheme (file, "resource")) if (g_file_has_uri_scheme (url->file, "resource"))
{ {
char *uri = g_file_get_uri (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, &error);
@ -89,7 +88,7 @@ gtk_css_image_url_parse (GtkCssImage *image,
} }
else else
{ {
input = g_file_read (file, NULL, &error); input = g_file_read (url->file, NULL, &error);
if (input == NULL) if (input == NULL)
{ {
_gtk_css_parser_take_error (parser, error); _gtk_css_parser_take_error (parser, error);
@ -99,7 +98,6 @@ gtk_css_image_url_parse (GtkCssImage *image,
pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (input), NULL, &error); pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (input), NULL, &error);
g_object_unref (input); g_object_unref (input);
} }
g_object_unref (file);
if (pixbuf == NULL) if (pixbuf == NULL)
{ {
@ -158,6 +156,8 @@ gtk_css_image_url_dispose (GObject *object)
{ {
GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (object); GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (object);
g_clear_object (&url->file);
if (url->surface) if (url->surface)
{ {
cairo_surface_destroy (url->surface); cairo_surface_destroy (url->surface);

View File

@ -38,6 +38,7 @@ struct _GtkCssImageUrl
{ {
GtkCssImage parent; GtkCssImage parent;
GFile *file; /* the file we're loading from */
cairo_surface_t *surface; /* the surface we render - guaranteed to be an image surface */ cairo_surface_t *surface; /* the surface we render - guaranteed to be an image surface */
}; };