示例#1
0
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);
}