/** * e_icon_factory_create_thumbnail * @filename: the file name to create the thumbnail for * * Creates system thumbnail for @filename. * * Returns: Path to system thumbnail of the file; %NULL if couldn't * create it. Free it with g_free(). **/ gchar * e_icon_factory_create_thumbnail (const gchar *filename) { #ifdef HAVE_GNOME_DESKTOP static GnomeDesktopThumbnailFactory *thumbnail_factory = NULL; struct stat file_stat; gchar *thumbnail = NULL; g_return_val_if_fail (filename != NULL, NULL); if (thumbnail_factory == NULL) { thumbnail_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL); } if (g_stat (filename, &file_stat) != -1 && S_ISREG (file_stat.st_mode)) { gchar *content_type, *mime = NULL; gboolean uncertain = FALSE; content_type = g_content_type_guess (filename, NULL, 0, &uncertain); if (content_type) mime = g_content_type_get_mime_type (content_type); if (mime) { gchar *uri = g_filename_to_uri (filename, NULL, NULL); g_return_val_if_fail (uri != NULL, NULL); thumbnail = gnome_desktop_thumbnail_factory_lookup (thumbnail_factory, uri, file_stat.st_mtime); if (!thumbnail && gnome_desktop_thumbnail_factory_can_thumbnail (thumbnail_factory, uri, mime, file_stat.st_mtime)) { GdkPixbuf *pixbuf; pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumbnail_factory, uri, mime); if (pixbuf) { gnome_desktop_thumbnail_factory_save_thumbnail (thumbnail_factory, pixbuf, uri, file_stat.st_mtime); g_object_unref (pixbuf); thumbnail = gnome_desktop_thumbnail_factory_lookup (thumbnail_factory, uri, file_stat.st_mtime); } } g_free (uri); } g_free (content_type); g_free (mime); } return thumbnail; #else return NULL; #endif /* HAVE_GNOME_DESKTOP */ }
static GdkPixbuf * impl_load_thumbnail (StTextureCache *cache, const char *uri, const char *mime_type, guint size, GError **error) { GnomeDesktopThumbnailFactory *thumbnail_factory; GdkPixbuf *pixbuf = NULL; GFile *file; GFileInfo *file_info; GTimeVal mtime_g; time_t mtime = 0; char *existing_thumbnail; file = g_file_new_for_uri (uri); file_info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, G_FILE_QUERY_INFO_NONE, NULL, NULL); g_object_unref (file); if (file_info) { g_file_info_get_modification_time (file_info, &mtime_g); g_object_unref (file_info); mtime = (time_t) mtime_g.tv_sec; } thumbnail_factory = cache->priv->thumbnails; existing_thumbnail = gnome_desktop_thumbnail_factory_lookup (thumbnail_factory, uri, mtime); if (existing_thumbnail != NULL) { pixbuf = gdk_pixbuf_new_from_file_at_size (existing_thumbnail, size, size, error); g_free (existing_thumbnail); } else if (gnome_desktop_thumbnail_factory_has_valid_failed_thumbnail (thumbnail_factory, uri, mtime)) g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Has failed thumbnail"); else if (gnome_desktop_thumbnail_factory_can_thumbnail (thumbnail_factory, uri, mime_type, mtime)) { pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumbnail_factory, uri, mime_type); if (pixbuf) { // we need to save the thumbnail so that we don't need to generate it again in the future gnome_desktop_thumbnail_factory_save_thumbnail (thumbnail_factory, pixbuf, uri, mtime); } else { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to generate thumbnail"); gnome_desktop_thumbnail_factory_create_failed_thumbnail (thumbnail_factory, uri, mtime); } } return pixbuf; }
static gboolean cheese_thumb_view_idle_append_item (gpointer data) { CheeseThumbViewIdleData *item = g_queue_peek_head (data); CheeseThumbView *thumb_view; CheeseThumbViewPrivate *priv; /* Disconnect the idle handler when the queue is empty. */ if (item == NULL) return FALSE; thumb_view = item->thumb_view; priv = cheese_thumb_view_get_instance_private (thumb_view); GnomeDesktopThumbnailFactory *factory = priv->factory; GFile *file = item->file; GtkTreeIter iter = item->iter; GdkPixbuf *pixbuf = NULL; GFileInfo *info; char *thumb_loc; GTimeVal mtime; char *mime_type; char *uri; char *filename; info = g_file_query_info (file, "standard::content-type,time::modified", 0, NULL, NULL); if (!info) { g_warning ("Invalid filename\n"); return TRUE; } g_file_info_get_modification_time (info, &mtime); mime_type = g_strdup (g_file_info_get_content_type (info)); uri = g_file_get_uri (file); filename = g_file_get_path (file); thumb_loc = gnome_desktop_thumbnail_factory_lookup (factory, uri, mtime.tv_sec); if (!thumb_loc) { pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (factory, uri, mime_type); if (!pixbuf) { g_warning ("could not generate thumbnail for %s (%s)\n", filename, mime_type); } else { gnome_desktop_thumbnail_factory_save_thumbnail (factory, pixbuf, uri, mtime.tv_sec); } } else { pixbuf = gdk_pixbuf_new_from_file (thumb_loc, NULL); if (!pixbuf) { g_warning ("could not load thumbnail %s (%s)\n", filename, mime_type); } } g_object_unref (info); g_free (thumb_loc); g_free (uri); if (!pixbuf) { gchar *escape = NULL; GError *error = NULL; escape = g_strrstr (mime_type, "/"); if (escape != NULL) *escape = '-'; pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), mime_type, 96, GTK_ICON_LOOKUP_GENERIC_FALLBACK, &error); if (error) { g_warning ("%s", error->message); return TRUE; } } else { cheese_thumbnail_add_frame (&pixbuf); } gtk_list_store_set (priv->store, &iter, THUMBNAIL_PIXBUF_COLUMN, pixbuf, -1); g_free (mime_type); g_free (filename); g_object_unref (pixbuf); g_object_unref (file); g_slice_free (CheeseThumbViewIdleData, item); g_queue_pop_head (data); return TRUE; }