aboutsummaryrefslogblamecommitdiffstats
path: root/e-util/e-icon-factory.c
blob: afb879a4c2cd90b7a914ac6aa98c04fa37d5d259 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
  



                                                                
  



                                                                    
  
                                                                   
                                                                             
  
  



                                                        
  

   
                    
                   
      
 

                   
                   

                      
 
                                      
                                                     
                                     
 
                        
                    
 

                           
 
            
 


                                    
                               
  
                                                                        
  
                                              
    


                                                         
 
                                 
                               
                               
                           
 
                                                       
 
                                                   
 

                                                               
 
                                                
                                                  



                                                                
         
 


                        


                               
                               
  



                                                                      
    
           

                                                
 
                                 
                          

                             
 
                                                       
 

                                                   
                                                               
                                    
 

                                                          
 

                                                 


                                               

                                                            

                                           
                                    

                                                       
                 
         
 
                      

 

                              






                                                                    

           
                                                                        








                                                    

                                                                                             

                                                                                         

                                                                                    


                                  





                                                                   




                                                                      

                                










































                                                                                                                                             
/*
 * 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; either
 * version 2 of the License, or (at your option) version 3.
 *
 * 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>
 *
 *
 * Authors:
 *      Jeffrey Stedfast <fejj@novell.com>
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libgnome-desktop/gnome-desktop-thumbnail.h>
#undef GNOME_DESKTOP_USE_UNSTABLE_API

#include <glib/gstdio.h>
#include <gtk/gtk.h>

#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, GTK_STOCK_MISSING_IMAGE,
            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;

    /* 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);

    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)
{
    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;
}