mirror of
https://github.com/fltk/fltk.git
synced 2026-06-01 23:06:54 +08:00
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
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
+13
-33
@@ -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);
|
||||||
|
|||||||
+33
-6
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user