diff --git a/src/plugins/Makefile b/src/plugins/Makefile index 9aa4a81..881418e 100644 --- a/src/plugins/Makefile +++ b/src/plugins/Makefile @@ -35,7 +35,7 @@ cvs.so: $(cvs_OBJS) dirtree_OBJS = dirtree.o dirtree_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) -dirtree_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) +dirtree_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) -L .. -Wl,-rpath,$(LIBDIR) -lBrowser dirtree.so: $(dirtree_OBJS) $(CCSHARED) -o dirtree.so $(dirtree_OBJS) $(dirtree_LDFLAGS) diff --git a/src/plugins/dirtree.c b/src/plugins/dirtree.c index c8130ca..6d4b86f 100644 --- a/src/plugins/dirtree.c +++ b/src/plugins/dirtree.c @@ -15,11 +15,10 @@ -#include -#include #include #include #include +#include #include "Browser.h" #define _(string) gettext(string) #define N_(string) (string) @@ -31,6 +30,7 @@ typedef struct _BrowserPlugin { BrowserPluginHelper * helper; + Mime * mime; GtkWidget * widget; guint source; gboolean expanding; @@ -99,6 +99,7 @@ static Dirtree * _dirtree_init(BrowserPluginHelper * helper) if((dirtree = object_new(sizeof(*dirtree))) == NULL) return NULL; dirtree->helper = helper; + dirtree->mime = helper->get_mime(helper->browser); dirtree->source = 0; dirtree->expanding = FALSE; icontheme = gtk_icon_theme_get_default(); @@ -232,6 +233,7 @@ static gboolean _dirtree_refresh_folder(Dirtree * dirtree, GtkTreeIter * parent, gboolean ret = FALSE; DIR * dir; struct dirent * de; + struct stat st; GtkTreeModel * model = GTK_TREE_MODEL(dirtree->store); GtkTreeIter iter; GtkTreePath * s; @@ -240,6 +242,7 @@ static gboolean _dirtree_refresh_folder(Dirtree * dirtree, GtkTreeIter * parent, String * q; gchar * r; gboolean b; + GdkPixbuf * pixbuf; #ifdef DEBUG fprintf(stderr, "DEBUG: %s(parent, \"%s\", \"%s\", %s)\n", __func__, @@ -250,29 +253,34 @@ static gboolean _dirtree_refresh_folder(Dirtree * dirtree, GtkTreeIter * parent, valid == TRUE; valid = gtk_tree_model_iter_next(model, &iter)) gtk_tree_store_set(dirtree->store, &iter, 3, FALSE, -1); - if((dir = opendir(path)) == NULL) + if((dir = browser_vfs_opendir(path, NULL)) == NULL) return FALSE; if(strcmp(path, "/") == 0) /* XXX hack */ path = ""; - while((de = readdir(dir)) != NULL) + while((de = browser_vfs_readdir(dir)) != NULL) { /* skip hidden folders except if we traverse it */ if(basename != NULL && strcmp(de->d_name, basename) == 0) ret = TRUE; else if(de->d_name[0] == '.') continue; - /* XXX d_type is not portable */ - else if(de->d_type != DT_DIR) - continue; - q = string_new_append(path, "/", de->d_name, NULL); + if((q = string_new_append(path, "/", de->d_name, NULL)) != NULL + && browser_vfs_lstat(q, &st) == 0) + { + if(!S_ISDIR(st.st_mode)) + continue; + pixbuf = browser_vfs_mime_icon(dirtree->mime, q, NULL, + &st, NULL, 24); + } + else + pixbuf = dirtree->folder; /* FIXME check if the node already exists */ r = (q != NULL) ? g_filename_display_basename(q) : NULL; gtk_tree_store_insert(dirtree->store, &iter, parent, -1); - gtk_tree_store_set(dirtree->store, &iter, - DC_ICON, dirtree->folder, + gtk_tree_store_set(dirtree->store, &iter, DC_ICON, pixbuf, DC_NAME, (r != NULL) ? r : de->d_name, DC_PATH, q, DC_UPDATED, TRUE, -1); - if(recurse) + if(recurse && q != NULL) _dirtree_refresh_folder(dirtree, &iter, q, NULL, (basename != NULL) ? TRUE : FALSE); g_free(r); @@ -284,7 +292,7 @@ static gboolean _dirtree_refresh_folder(Dirtree * dirtree, GtkTreeIter * parent, gtk_tree_path_free(s); } } - closedir(dir); + browser_vfs_closedir(dir); /* remove all the obsolete nodes */ for(valid = gtk_tree_model_iter_children(model, &iter, parent); valid == TRUE; valid = (b == TRUE) diff --git a/src/plugins/project.conf b/src/plugins/project.conf index 94c83e1..9c82127 100644 --- a/src/plugins/project.conf +++ b/src/plugins/project.conf @@ -24,6 +24,7 @@ depends=common.c,../../include/Browser.h [dirtree] type=plugin sources=dirtree.c +ldflags=-L .. -Wl,-rpath,$(LIBDIR) -lBrowser install=$(LIBDIR)/Browser/plugins [dirtree.c]