From d04c2cb5502ce6b51fc51e0e26ed1507db99741c Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Wed, 5 Dec 2012 15:53:35 +0100 Subject: [PATCH] Moved more icon handling code to the VFS pseudo-class --- src/browser.c | 49 +++------------------------------------- src/vfs.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/vfs.h | 2 ++ 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/src/browser.c b/src/browser.c index 2897b90..7c0d510 100644 --- a/src/browser.c +++ b/src/browser.c @@ -1334,55 +1334,12 @@ static void _insert_dir(Browser * browser, char const * name, GdkPixbuf ** icon_24, GdkPixbuf ** icon_48, GdkPixbuf ** icon_96, struct stat * st) { - char const * type = "inode/directory"; - char const * icon = NULL; - int flags = GTK_ICON_LOOKUP_FORCE_SIZE; - - if(browser->refresh_dev != st->st_dev) - type = "inode/mountpoint"; - /* special folder icons */ - else if(strcasecmp(name, "Desktop") == 0) - icon = "gnome-fs-desktop"; - else if(strcasecmp(name, "Documents") == 0) - icon = "folder-documents"; - else if(strcasecmp(name, "Download") == 0 - || strcasecmp(name, "Downloads") == 0) - icon = "folder-download"; - else if(strcasecmp(name, "Music") == 0) - icon = "folder-music"; - else if(strcasecmp(name, "Pictures") == 0) - icon = "folder-pictures"; - else if(strcmp(name, "public_html") == 0 - || strcasecmp(name, "Shared") == 0) - icon = "folder-publicshared"; - else if(strcasecmp(name, "Templates") == 0) - icon = "folder-templates"; - else if(strcasecmp(name, "Video") == 0 - || strcasecmp(name, "Videos") == 0) - icon = "folder-videos"; - if(icon != NULL) - { - /* try to load the special icons */ - if(icon_24 != NULL && (*icon_24 = gtk_icon_theme_load_icon( - browser->theme, icon, 24, flags, - NULL)) != NULL) - icon_24 = NULL; - if(icon_48 != NULL && (*icon_48 = gtk_icon_theme_load_icon( - browser->theme, icon, 48, flags, - NULL)) != NULL) - icon_48 = NULL; - if(icon_96 != NULL && (*icon_96 = gtk_icon_theme_load_icon( - browser->theme, icon, 96, flags, - NULL)) != NULL) - icon_96 = NULL; - } - /* generic fallback */ if(icon_24 != NULL) - mime_icons(browser->mime, type, 24, icon_24, -1); + *icon_24 = vfs_mime_folder_icon(browser->mime, name, st, 24); if(icon_48 != NULL) - mime_icons(browser->mime, type, 48, icon_48, -1); + *icon_48 = vfs_mime_folder_icon(browser->mime, name, st, 48); if(icon_96 != NULL) - mime_icons(browser->mime, type, 96, icon_96, -1); + *icon_96 = vfs_mime_folder_icon(browser->mime, name, st, 96); } static gboolean _refresh_new_idle(gpointer data) diff --git a/src/vfs.c b/src/vfs.c index ef25302..62dd6e9 100644 --- a/src/vfs.c +++ b/src/vfs.c @@ -15,6 +15,9 @@ +#include +#include +#include #include "vfs.h" @@ -34,6 +37,65 @@ int vfs_closedir(DIR * dir) } +/* vfs_folder_icon */ +GdkPixbuf * vfs_mime_folder_icon(Mime * mime, char const * filename, + struct stat * st, int size) +{ + GdkPixbuf * ret = NULL; + char const * icon = NULL; + struct stat s; + char * p; + struct stat lst; + size_t i; + struct + { + char const * name; + char const * icon; + } name_icon[] = + { + { "Desktop", "gnome-fs-desktop" }, + { "Documents", "folder-documents" }, + { "Download", "folder-download" }, + { "Downloads", "folder-download" }, + { "Music", "folder-music" }, + { "Pictures", "folder-pictures" }, + { "public_html","folder-publicshared" }, + { "Templates", "folder-templates" }, + { "Video", "folder-videos" }, + { "Videos", "folder-videos" }, + }; + GtkIconTheme * icontheme; + int flags = GTK_ICON_LOOKUP_FORCE_SIZE; + + if(st == NULL && lstat(filename, &s) == 0) + st = &s; + /* check if the folder is a mountpoint */ + if((p = strdup(filename)) != NULL + && st != NULL + && lstat(dirname(p), &lst) == 0 + && st->st_dev != lst.st_dev) + icon = "mount-point"; + if(p != NULL && icon == NULL) + for(i = 0; i < sizeof(name_icon) / sizeof(*name_icon); i++) + if(strcasecmp(basename(p), name_icon[i].name) == 0) + { + icon = name_icon[i].icon; + break; + } + free(p); + if(icon != NULL) + { + icontheme = gtk_icon_theme_get_default(); + ret = gtk_icon_theme_load_icon(icontheme, icon, size, flags, + NULL); + } + /* generic fallback */ + if(ret == NULL) + mime_icons(mime, "inode/directory", size, &ret, -1); + return ret; +} + + /* vfs_mime_icon */ GdkPixbuf * vfs_mime_icon(Mime * mime, char const * type, struct stat * st, int size) diff --git a/src/vfs.h b/src/vfs.h index 1042db5..c6e969d 100644 --- a/src/vfs.h +++ b/src/vfs.h @@ -27,6 +27,8 @@ /* public */ /* functions */ int vfs_closedir(DIR * dir); +GdkPixbuf * vfs_mime_folder_icon(Mime * mime, char const * name, + struct stat * st, int size); int vfs_lstat(char const * filename, struct stat * st); GdkPixbuf * vfs_mime_icon(Mime * mime, char const * type, struct stat * st, int size);