GdkPixbuf* vfs_app_desktop_get_icon( VFSAppDesktop* app, int size, gboolean use_fallback ) { GtkIconTheme* theme; char *icon_name = NULL, *suffix; GdkPixbuf* icon = NULL; if( app->icon_name ) { if( g_path_is_absolute( app->icon_name) ) { icon = gdk_pixbuf_new_from_file_at_scale( app->icon_name, size, size, TRUE, NULL ); } else { theme = gtk_icon_theme_get_default(); suffix = strchr( app->icon_name, '.' ); if( suffix ) /* has file extension, it's a basename of icon file */ { /* try to find it in pixmaps dirs */ icon = load_icon_file( app->icon_name, size ); if( G_UNLIKELY( ! icon ) ) /* unfortunately, not found */ { /* Let's remove the suffix, and see if this name can match an icon in current icon theme */ icon_name = g_strndup( app->icon_name, (suffix - app->icon_name) ); icon = vfs_load_icon( theme, icon_name, size ); g_free( icon_name ); } } else /* no file extension, it could be an icon name in the icon theme */ { icon = vfs_load_icon( theme, app->icon_name, size ); } } } if( G_UNLIKELY( ! icon ) && use_fallback ) /* fallback to generic icon */ { theme = gtk_icon_theme_get_default(); icon = vfs_load_icon( theme, "application-x-executable", size ); if( G_UNLIKELY( ! icon ) ) /* fallback to generic icon */ { icon = vfs_load_icon( theme, "gnome-mime-application-x-executable", size ); } } return icon; }
GdkPixbuf* vfs_file_info_get_big_icon( VFSFileInfo* fi ) { /* get special icons for special files, especially for some desktop icons */ if ( G_UNLIKELY( fi->flags != VFS_FILE_INFO_NONE ) ) { int w, h; int icon_size; vfs_mime_type_get_icon_size( &icon_size, NULL ); if ( fi->big_thumbnail ) { w = gdk_pixbuf_get_width( fi->big_thumbnail ); h = gdk_pixbuf_get_height( fi->big_thumbnail ); } else w = h = 0; if ( ABS( MAX( w, h ) - icon_size ) > 2 ) { char * icon_name = NULL; if ( fi->big_thumbnail ) { icon_name = ( char* ) g_object_steal_data( G_OBJECT(fi->big_thumbnail), "name" ); g_object_unref( fi->big_thumbnail ); fi->big_thumbnail = NULL; } if ( G_LIKELY( icon_name ) ) { if ( G_UNLIKELY( icon_name[ 0 ] == '/' ) ) fi->big_thumbnail = gdk_pixbuf_new_from_file( icon_name, NULL ); else fi->big_thumbnail = vfs_load_icon( gtk_icon_theme_get_default(), icon_name, icon_size ); } if ( fi->big_thumbnail ) g_object_set_data_full( G_OBJECT(fi->big_thumbnail), "name", icon_name, g_free ); else g_free( icon_name ); } return fi->big_thumbnail ? g_object_ref( fi->big_thumbnail ) : NULL; } if( G_UNLIKELY(!fi->mime_type) ) return NULL; return vfs_mime_type_get_icon( fi->mime_type, TRUE ); }
GdkPixbuf* vfs_mime_type_get_icon( VFSMimeType* mime_type, gboolean big ) { GdkPixbuf * icon = NULL; const char* sep; char icon_name[ 100 ]; GtkIconTheme *icon_theme; int size; if ( big ) { if ( G_LIKELY( mime_type->big_icon ) ) /* big icon */ return g_object_ref( mime_type->big_icon ); size = big_icon_size; } else /* small icon */ { if ( G_LIKELY( mime_type->small_icon ) ) return g_object_ref( mime_type->small_icon ); size = small_icon_size; } icon_theme = gtk_icon_theme_get_default (); if ( G_UNLIKELY( 0 == strcmp( mime_type->type, XDG_MIME_TYPE_DIRECTORY ) ) ) { icon = vfs_load_icon ( icon_theme, "folder", size ); if( G_UNLIKELY( !icon) ) icon = vfs_load_icon ( icon_theme, "gnome-fs-directory", size ); if( G_UNLIKELY( !icon) ) icon = vfs_load_icon ( icon_theme, "gtk-directory", size ); if ( big ) mime_type->big_icon = icon; else mime_type->small_icon = icon; return icon ? g_object_ref( icon ) : NULL; } sep = strchr( mime_type->type, '/' ); if ( sep ) { /* convert mime-type foo/bar to foo-bar */ strcpy( icon_name, mime_type->type ); icon_name[ (sep - mime_type->type) ] = '-'; /* is there an icon named foo-bar? */ icon = vfs_load_icon ( icon_theme, icon_name, size ); if ( ! icon ) { /* maybe we can find a legacy icon named gnome-mime-foo-bar */ strcpy( icon_name, "gnome-mime-" ); strncat( icon_name, mime_type->type, ( sep - mime_type->type ) ); strcat( icon_name, "-" ); strcat( icon_name, sep + 1 ); icon = vfs_load_icon ( icon_theme, icon_name, size ); } // hack for x-xz-compressed-tar missing icon if ( !icon && strstr( mime_type->type, "compressed" ) ) { icon = vfs_load_icon ( icon_theme, "application-x-archive", size ); if ( !icon ) icon = vfs_load_icon ( icon_theme, "gnome-mime-application-x-archive", size ); } /* try gnome-mime-foo */ if ( G_UNLIKELY( ! icon ) ) { icon_name[ 11 ] = '\0'; /* strlen("gnome-mime-") = 11 */ strncat( icon_name, mime_type->type, ( sep - mime_type->type ) ); icon = vfs_load_icon ( icon_theme, icon_name, size ); } /* try foo-x-generic */ if ( G_UNLIKELY( ! icon ) ) { strncpy( icon_name, mime_type->type, ( sep - mime_type->type ) ); icon_name[ (sep - mime_type->type) ] = '\0'; strcat( icon_name, "-x-generic" ); icon = vfs_load_icon ( icon_theme, icon_name, size ); } } if( G_UNLIKELY( !icon ) ) { /* prevent endless recursion of XDG_MIME_TYPE_UNKNOWN */ if( G_LIKELY( strcmp(mime_type->type, XDG_MIME_TYPE_UNKNOWN) ) ) { /* FIXME: fallback to icon of parent mime-type */ VFSMimeType* unknown; unknown = vfs_mime_type_get_from_type( XDG_MIME_TYPE_UNKNOWN ); icon = vfs_mime_type_get_icon( unknown, big ); vfs_mime_type_unref( unknown ); } else /* unknown */ { icon = vfs_load_icon ( icon_theme, "unknown", size ); } } if ( big ) mime_type->big_icon = icon; else mime_type->small_icon = icon; return icon ? g_object_ref( icon ) : NULL; }