From eca40efb6e42b352ca77d1d290b4149037b70efd Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Wed, 17 Aug 2005 21:56:22 +0000 Subject: [PATCH] This change is controversial. It changes the behavior of fl_filename_list slightly by adding a forward slash after every directory name on every supported OS. Included in this patch is a change in the code that lists mounted volumes on OS X Mac. Apple users, please check. Open FLUID, open the file dialog and clear the current path. You shoudl see a list of mounted volumes. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4525 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- CHANGES | 2 ++ documentation/functions.html | 2 ++ src/Fl_File_Browser.cxx | 48 +++++++++++------------------------- src/filename_list.cxx | 39 ++++++++++++++++++++++++----- 4 files changed, 51 insertions(+), 40 deletions(-) diff --git a/CHANGES b/CHANGES index b30e3a962..a9feda9da 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,8 @@ CHANGES IN FLTK 1.1.7 - Documentation fixes (STR #571, STR #648, STR #692, STR #730, STR #744, STR #745, STR #931, STR #942, STR #960, STR #969) + - fl_filename_list now always appends a forward slash to + directory names (STR #874) - Multiline Input will update right if a space character is inserted in word wrap mode (STR #981) - FLUID group labels redraw correctly (STR #959) diff --git a/documentation/functions.html b/documentation/functions.html index 5bcd54d4e..a6205774b 100644 --- a/documentation/functions.html +++ b/documentation/functions.html @@ -718,6 +718,8 @@ reading the directory a number less than zero is returned, and errno has the reason; errno does not work under WIN32. +

The name of directory always ends in a forward slash '/'. +

The sort argument specifies a sort function to be used when on the array of filenames. The following standard sort functions are provided with FLTK: diff --git a/src/Fl_File_Browser.cxx b/src/Fl_File_Browser.cxx index 94e69e8b0..22ae7eada 100644 --- a/src/Fl_File_Browser.cxx +++ b/src/Fl_File_Browser.cxx @@ -67,6 +67,7 @@ // CodeWarrior (__MWERKS__) gets its include paths confused, so we // temporarily disable this... #if defined(__APPLE__) && !defined(__MWERKS__) +# include # include # include # include @@ -495,30 +496,20 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load num_files ++; } #elif defined(__APPLE__) && !defined(__MWERKS__) - // MacOS X and Darwin use getfsstat() system call... - int numfs; // Number of file systems - struct statfs *fs; // Buffer for file system info - - - numfs = getfsstat(NULL, 0, MNT_NOWAIT); - if (numfs > 0) { - // We have file systems, get them... - fs = new struct statfs[numfs]; - getfsstat(fs, sizeof(struct statfs) * numfs, MNT_NOWAIT); - - // Add filesystems to the list... - for (i = 0; i < numfs; i ++) { - if (fs[i].f_mntonname[1]) { - snprintf(filename, sizeof(filename), "%s/", fs[i].f_mntonname); - add(filename, icon); - } else { - add("/", icon); - } - num_files ++; + // All mounted volumes are in a directory called '/Volumes/' + // This seems to be the case on international installations, too. + add("/", icon); + dirent **dir; + int n = fl_filename_list("/Volumes/", &dir, 0); + if (n>=0) { + int i; + for (i=0; id_name[0]=='.') continue; + sprintf(filename, "/Volumes/%s", dir[i]->d_name); + add(filename, icon); + free(dir[i]); } - - // Free the memory used for the file system info array... - delete[] fs; + free(dir); } #else // @@ -596,18 +587,7 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) || fl_filename_isdir(filename)) { num_dirs ++; - -#if defined(WIN32) && !defined(__CYGWIN__) - // WIN32 already has the trailing slash... :) insert(num_dirs, files[i]->d_name, icon); -#else - // Add a trailing slash to directory names... - char name[1024]; // Temporary directory name - - snprintf(name, sizeof(name), "%s/", files[i]->d_name); - - insert(num_dirs, name, icon); -#endif // WIN32 && !__CYGWIN__ } else if (filetype_ == FILES && fl_filename_match(files[i]->d_name, pattern_)) { add(files[i]->d_name, icon); diff --git a/src/filename_list.cxx b/src/filename_list.cxx index e8fc37c9a..71335757b 100644 --- a/src/filename_list.cxx +++ b/src/filename_list.cxx @@ -29,6 +29,7 @@ #include #include "flstring.h" +#include extern "C" { @@ -52,26 +53,52 @@ int fl_casealphasort(struct dirent **a, struct dirent **b) { int fl_filename_list(const char *d, dirent ***list, Fl_File_Sort_F *sort) { #ifndef HAVE_SCANDIR - return scandir(d, list, 0, sort); + int n = scandir(d, list, 0, sort); #elif defined(__hpux) || defined(__CYGWIN__) // HP-UX, Cygwin define the comparison function like this: - return scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); + int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); #elif defined(__osf__) // OSF, DU 4.0x - return scandir(d, list, 0, (int(*)(dirent **, dirent **))sort); + int n = scandir(d, list, 0, (int(*)(dirent **, dirent **))sort); #elif defined(_AIX) // AIX is almost standard... - return scandir(d, list, 0, (int(*)(void*, void*))sort); + int n = scandir(d, list, 0, (int(*)(void*, void*))sort); #elif !defined(__sgi) // The vast majority of UNIX systems want the sort function to have this // prototype, most likely so that it can be passed to qsort without any // changes: - return scandir(d, list, 0, (int(*)(const void*,const void*))sort); + int n = scandir(d, list, 0, (int(*)(const void*,const void*))sort); #else // This version is when we define our own scandir (WIN32 and perhaps // some Unix systems) and apparently on IRIX: - return scandir(d, list, 0, sort); + int n = scandir(d, list, 0, sort); #endif + +#if defined(WIN32) && !defined(__CYGWIN__) + // we did this already during fl_scandir/win32 +#else + // append a '/' to all filenames that are directories + int i, dirlen = strlen(d); + char *fullname = (char*)malloc(dirlen+FL_PATH_MAX+2); + memcpy(fullname, d, dirlen+1); + char *name = fullname + dirlen; + if (name!=fullname && name[-1]!='/') *name++ = '/'; + for (i=0; id_name); + if (de->d_name[len-1]=='/' || len>FL_PATH_MAX) continue; + memcpy(name, de->d_name, len+1); + if (fl_filename_isdir(fullname)) { + if (lend_name + len; + *dst++ = '/'; + *dst = 0; + } + } + } + free(fullname); +#endif + return n; } //