Browse Source

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
pull/168/head
Matthias Melcher 20 years ago
parent
commit
eca40efb6e
  1. 2
      CHANGES
  2. 2
      documentation/functions.html
  3. 46
      src/Fl_File_Browser.cxx
  4. 39
      src/filename_list.cxx

2
CHANGES

@ -3,6 +3,8 @@ CHANGES IN FLTK 1.1.7
- Documentation fixes (STR #571, STR #648, STR #692, STR - Documentation fixes (STR #571, STR #648, STR #692, STR
#730, STR #744, STR #745, STR #931, STR #942, STR #960, #730, STR #744, STR #745, STR #931, STR #942, STR #960,
STR #969) 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 - Multiline Input will update right if a space character is
inserted in word wrap mode (STR #981) inserted in word wrap mode (STR #981)
- FLUID group labels redraw correctly (STR #959) - FLUID group labels redraw correctly (STR #959)

2
documentation/functions.html

@ -718,6 +718,8 @@ reading the directory a number less than zero is returned, and
<tt>errno</tt> has the reason; <tt>errno</tt> does not work <tt>errno</tt> has the reason; <tt>errno</tt> does not work
under WIN32. under WIN32.
<P>The name of directory always ends in a forward slash '/'.
<P>The <tt>sort</tt> argument specifies a sort function to be used <P>The <tt>sort</tt> argument specifies a sort function to be used
when on the array of filenames. The following standard sort functions when on the array of filenames. The following standard sort functions
are provided with FLTK: are provided with FLTK:

46
src/Fl_File_Browser.cxx

@ -67,6 +67,7 @@
// CodeWarrior (__MWERKS__) gets its include paths confused, so we // CodeWarrior (__MWERKS__) gets its include paths confused, so we
// temporarily disable this... // temporarily disable this...
#if defined(__APPLE__) && !defined(__MWERKS__) #if defined(__APPLE__) && !defined(__MWERKS__)
# include <Carbon/Carbon.h>
# include <sys/param.h> # include <sys/param.h>
# include <sys/ucred.h> # include <sys/ucred.h>
# include <sys/mount.h> # include <sys/mount.h>
@ -495,30 +496,20 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
num_files ++; num_files ++;
} }
#elif defined(__APPLE__) && !defined(__MWERKS__) #elif defined(__APPLE__) && !defined(__MWERKS__)
// MacOS X and Darwin use getfsstat() system call... // All mounted volumes are in a directory called '/Volumes/'
int numfs; // Number of file systems // This seems to be the case on international installations, too.
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); add("/", icon);
dirent **dir;
int n = fl_filename_list("/Volumes/", &dir, 0);
if (n>=0) {
int i;
for (i=0; i<n; i++) {
if (dir[i]->d_name[0]=='.') continue;
sprintf(filename, "/Volumes/%s", dir[i]->d_name);
add(filename, icon);
free(dir[i]);
} }
num_files ++; free(dir);
}
// Free the memory used for the file system info array...
delete[] fs;
} }
#else #else
// //
@ -596,18 +587,7 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) || if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) ||
fl_filename_isdir(filename)) { fl_filename_isdir(filename)) {
num_dirs ++; num_dirs ++;
#if defined(WIN32) && !defined(__CYGWIN__)
// WIN32 already has the trailing slash... :)
insert(num_dirs, files[i]->d_name, icon); 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 && } else if (filetype_ == FILES &&
fl_filename_match(files[i]->d_name, pattern_)) { fl_filename_match(files[i]->d_name, pattern_)) {
add(files[i]->d_name, icon); add(files[i]->d_name, icon);

39
src/filename_list.cxx

@ -29,6 +29,7 @@
#include <FL/filename.H> #include <FL/filename.H>
#include "flstring.h" #include "flstring.h"
#include <stdlib.h>
extern "C" { extern "C" {
@ -52,26 +53,52 @@ int fl_casealphasort(struct dirent **a, struct dirent **b) {
int fl_filename_list(const char *d, dirent ***list, int fl_filename_list(const char *d, dirent ***list,
Fl_File_Sort_F *sort) { Fl_File_Sort_F *sort) {
#ifndef HAVE_SCANDIR #ifndef HAVE_SCANDIR
return scandir(d, list, 0, sort); int n = scandir(d, list, 0, sort);
#elif defined(__hpux) || defined(__CYGWIN__) #elif defined(__hpux) || defined(__CYGWIN__)
// HP-UX, Cygwin define the comparison function like this: // 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__) #elif defined(__osf__)
// OSF, DU 4.0x // 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) #elif defined(_AIX)
// AIX is almost standard... // 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) #elif !defined(__sgi)
// The vast majority of UNIX systems want the sort function to have this // 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 // prototype, most likely so that it can be passed to qsort without any
// changes: // 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 #else
// This version is when we define our own scandir (WIN32 and perhaps // This version is when we define our own scandir (WIN32 and perhaps
// some Unix systems) and apparently on IRIX: // some Unix systems) and apparently on IRIX:
return scandir(d, list, 0, sort); int n = scandir(d, list, 0, sort);
#endif #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; i<n; i++) {
dirent *de = (*list)[i];
int len = strlen(de->d_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 (len<FL_PATH_MAX) {
char *dst = de->d_name + len;
*dst++ = '/';
*dst = 0;
}
}
}
free(fullname);
#endif
return n;
} }
// //

Loading…
Cancel
Save