static GtkCssImage * gtk_css_image_url_load_image (GtkCssImageUrl *url, GError **error) { GdkTexture *texture; GError *local_error = NULL; if (url->loaded_image) return url->loaded_image; /* We special case resources here so we can use gdk_pixbuf_new_from_resource, which in turn has some special casing for GdkPixdata files to avoid duplicating the memory for the pixbufs */ if (g_file_has_uri_scheme (url->file, "resource")) { char *uri = g_file_get_uri (url->file); char *resource_path = g_uri_unescape_string (uri + strlen ("resource://"), NULL); texture = gdk_texture_new_from_resource (resource_path); g_free (resource_path); g_free (uri); } else { texture = gdk_texture_new_from_file (url->file, &local_error); } if (texture == NULL) { if (error) { char *uri; uri = g_file_get_uri (url->file); g_set_error (error, GTK_CSS_PARSER_ERROR, GTK_CSS_PARSER_ERROR_FAILED, "Error loading image '%s': %s", uri, local_error->message); g_free (uri); } url->loaded_image = gtk_css_image_invalid_new (); } else { url->loaded_image = gtk_css_image_paintable_new (GDK_PAINTABLE (texture), GDK_PAINTABLE (texture)); g_object_unref (texture); } g_clear_error (&local_error); return url->loaded_image; }
void cb_compose_images_load_image (CbComposeImages *self, const char *image_path) { GFile *file; GError *error = NULL; GdkTexture *texture; Image *image; #if DEBUG g_assert (!cb_compose_images_is_full (self)); #endif file = g_file_new_for_path (image_path); texture = gdk_texture_new_from_file (file, &error); if (error != NULL) { g_warning (G_STRLOC ": Couldn't load image %s: %s", image_path, error->message); g_object_unref (file); return; } g_array_set_size (self->images, self->images->len + 1); image = &g_array_index (self->images, Image, self->images->len - 1); image->path = g_strdup (image_path); image->fraction = 0.0; image->deleted = FALSE; image->image = gtk_image_new_from_paintable (GDK_PAINTABLE (g_steal_pointer (&texture))); gtk_image_set_can_shrink (GTK_IMAGE (image->image), TRUE); gtk_widget_set_size_request (image->image, -1, MIN_IMAGE_HEIGHT); gtk_widget_set_parent (image->image, GTK_WIDGET (self)); image->delete_button = gtk_button_new_from_icon_name ("window-close-symbolic"); gtk_style_context_add_class (gtk_widget_get_style_context (image->delete_button), "close-button"); g_signal_connect (image->delete_button, "clicked", G_CALLBACK (delete_button_clicked_cb), self); gtk_widget_set_parent (image->delete_button, GTK_WIDGET (self)); image->progressbar = gtk_progress_bar_new (); gtk_widget_hide (image->progressbar); gtk_widget_set_parent (image->progressbar, GTK_WIDGET (self)); g_object_unref (file); }