/* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, see . * * * Authors: * Jeffrey Stedfast * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #ifdef HAVE_GNOME_DESKTOP #define GNOME_DESKTOP_USE_UNSTABLE_API #include #undef GNOME_DESKTOP_USE_UNSTABLE_API #endif #include #include #include "e-icon-factory.h" #include "e-util-private.h" #define d(x) /** * e_icon_factory_get_icon_filename: * @icon_name: name of the icon * @icon_size: size of the icon * * Returns the filename of the requested icon in the default icon theme. * * Returns: the filename of the requested icon **/ gchar * e_icon_factory_get_icon_filename (const gchar *icon_name, GtkIconSize icon_size) { GtkIconTheme *icon_theme; GtkIconInfo *icon_info; gchar *filename = NULL; gint width, height; g_return_val_if_fail (icon_name != NULL, NULL); icon_theme = gtk_icon_theme_get_default (); if (!gtk_icon_size_lookup (icon_size, &width, &height)) return NULL; icon_info = gtk_icon_theme_lookup_icon ( icon_theme, icon_name, height, 0); if (icon_info != NULL) { filename = g_strdup ( gtk_icon_info_get_filename (icon_info)); gtk_icon_info_free (icon_info); } return filename; } /** * e_icon_factory_get_icon: * @icon_name: name of the icon * @icon_size: size of the icon * * Loads the requested icon from the default icon theme and renders it * to a pixbuf. * * Returns: the rendered icon **/ GdkPixbuf * e_icon_factory_get_icon (const gchar *icon_name, GtkIconSize icon_size) { GtkIconTheme *icon_theme; GdkPixbuf *pixbuf; gint width, height; GError *error = NULL; g_return_val_if_fail (icon_name != NULL, NULL); icon_theme = gtk_icon_theme_get_default (); if (!gtk_icon_size_lookup (icon_size, &width, &height)) width = height = 16; pixbuf = gtk_icon_theme_load_icon ( icon_theme, icon_name, height, 0, &error); if (error != NULL) { g_warning ("%s", error->message); g_clear_error (&error); /* Fallback to missing image */ pixbuf = gtk_icon_theme_load_icon ( icon_theme, "image-missing", height, 0, &error); if (error != NULL) { g_error ("%s", error->message); g_clear_error (&error); } } return pixbuf; } /** * e_icon_factory_pixbuf_scale * @pixbuf: a #GdkPixbuf * @width: desired width, if less or equal to 0, then changed to 1 * @height: desired height, if less or equal to 0, then changed to 1 * * Scales @pixbuf to desired size. * * Returns: a scaled #GdkPixbuf **/ GdkPixbuf * e_icon_factory_pixbuf_scale (GdkPixbuf *pixbuf, gint width, gint height) { g_return_val_if_fail (pixbuf != NULL, NULL); if (width <= 0) width = 1; if (height <= 0) height = 1; #ifdef HAVE_GNOME_DESKTOP /* because this can only scale down, not up */ if (gdk_pixbuf_get_width (pixbuf) > width && gdk_pixbuf_get_height (pixbuf) > height) return gnome_desktop_thumbnail_scale_down_pixbuf (pixbuf, width, height); #endif return gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR); } /** * 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 */ }