Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2015-04-08 22:54:52 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2015-04-08 22:59:05 +0300
commit114d1b23d298a9a5ddb6201046ec8b9e74661b7e (patch)
tree5112370010d624cb859d620c019727c4364d76f0 /source/blender/blenlib
parent5d212fb8121912cd583eadb55ea19c9bbab7b5e9 (diff)
Fix T44113: Some System Folders do not contain go back arrow.
On windows empty dirs are completely empty - no par or current entries are listed either, in those cases artificially add those. Furthermore, stat on UNC paths do not support current/parent 'shortcuts' (i.e. things like '\\SERVER\foo\bar\..' do not work), so we have to hack around that mess... This should ensure us we always do have valid parrent entry...
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/intern/BLI_filelist.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/BLI_filelist.c b/source/blender/blenlib/intern/BLI_filelist.c
index 81813ce1f62..b934b51375b 100644
--- a/source/blender/blenlib/intern/BLI_filelist.c
+++ b/source/blender/blenlib/intern/BLI_filelist.c
@@ -112,10 +112,40 @@ static void bli_builddir(struct BuildDirCtx *dir_ctx, const char *dirname)
if ((dir = opendir(dirname)) != NULL) {
const struct dirent *fname;
+ bool has_current = false, has_parent = false;
+
while ((fname = readdir(dir)) != NULL) {
struct dirlink * const dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
if (dlink != NULL) {
dlink->name = BLI_strdup(fname->d_name);
+ if (FILENAME_IS_PARENT(dlink->name)) {
+ has_parent = true;
+ }
+ else if (FILENAME_IS_CURRENT(dlink->name)) {
+ has_current = true;
+ }
+ BLI_addhead(&dirbase, dlink);
+ newnum++;
+ }
+ }
+
+ if (!has_parent) {
+ char pardir[FILE_MAXDIR];
+
+ BLI_strncpy(pardir, dirname, sizeof(pardir));
+ if (BLI_parent_dir(pardir) && (BLI_access(pardir, R_OK) == 0)) {
+ struct dirlink * const dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
+ if (dlink != NULL) {
+ dlink->name = BLI_strdup(FILENAME_PARENT);
+ BLI_addhead(&dirbase, dlink);
+ newnum++;
+ }
+ }
+ }
+ if (!has_current) {
+ struct dirlink * const dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
+ if (dlink != NULL) {
+ dlink->name = BLI_strdup(FILENAME_CURRENT);
BLI_addhead(&dirbase, dlink);
newnum++;
}
@@ -148,6 +178,10 @@ static void bli_builddir(struct BuildDirCtx *dir_ctx, const char *dirname)
if (BLI_stat(fullname, &file->s) != -1) {
file->type = file->s.st_mode;
}
+ else if (FILENAME_IS_CURRPAR(file->relname)) {
+ /* Hack around for UNC paths on windows - does not support stat on '\\SERVER\foo\..', sigh... */
+ file->type |= S_IFDIR;
+ }
file->flags = 0;
dir_ctx->nrfiles++;
file++;