diff options
| author | Manolo Gouy <Manolo> | 2016-04-10 06:33:19 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2016-04-10 06:33:19 +0000 |
| commit | 927774af85b115b2affa35252a46cc6f3235fe97 (patch) | |
| tree | fe59b0041ae84c9a8b52b67dfb63e732f8c57415 /src/drivers/WinAPI | |
| parent | 9ca66c6f3d3c94192e105012fc8226109530143a (diff) | |
Rewrite Fl_File_Browser.cxx under the driver model.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11570 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/WinAPI')
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_System_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx | 59 |
2 files changed, 61 insertions, 0 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H index 7d99c4548..0e6078faf 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H @@ -77,6 +77,8 @@ public: virtual const char *filename_ext(const char *buf); virtual int open_uri(const char *uri, char *msg, int msglen); virtual int use_recent_tooltip_fix() {return 1;} + virtual int file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon); + virtual int file_browser_load_directory(const char *directory, char *filename, dirent ***pfiles, Fl_File_Sort_F *sort); }; #endif // FL_WINAPI_SYSTEM_DRIVER_H diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx index 95d94dfca..89c62dbf7 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx @@ -22,6 +22,8 @@ #include <FL/Fl.H> #include <FL/fl_utf8.h> #include <FL/filename.H> +#include <FL/Fl_File_Browser.H> +#include <FL/Fl_File_Icon.H> #include <stdio.h> #include <stdarg.h> #include <windows.h> @@ -30,6 +32,15 @@ #include <process.h> #include <locale.h> #include "../../flstring.h" +#include <direct.h> +// Apparently Borland C++ defines DIRECTORY in <direct.h>, which +// interfers with the Fl_File_Icon enumeration of the same name. +# ifdef DIRECTORY +# undef DIRECTORY +# endif // DIRECTORY +#ifdef __CYGWIN__ +# include <mntent.h> +#endif inline int isdirsep(char c) { return c == '/' || c == '\\'; } @@ -665,6 +676,54 @@ int Fl_WinAPI_System_Driver::open_uri(const char *uri, char *msg, int msglen) return (int)(ShellExecute(HWND_DESKTOP, "open", uri, NULL, NULL, SW_SHOW) > (void *)32); } +int Fl_WinAPI_System_Driver::file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon) +{ + int num_files = 0; +# ifdef __CYGWIN__ + // + // Cygwin provides an implementation of setmntent() to get the list + // of available drives... + // + FILE *m = setmntent("/-not-used-", "r"); + struct mntent *p; + while ((p = getmntent (m)) != NULL) { + browser->add(p->mnt_dir, icon); + num_files ++; + } + endmntent(m); +# else + // + // Normal WIN32 code uses drive bits... + // + DWORD drives; // Drive available bits + drives = GetLogicalDrives(); + for (int i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:/", i); + if (i < 'C') // see also: GetDriveType and GetVolumeInformation in WIN32 + browser->add(filename, icon); + else + browser->add(filename, icon); + num_files ++; + } +# endif // __CYGWIN__ + return num_files; +} + +int Fl_WinAPI_System_Driver::file_browser_load_directory(const char *directory, char *filename, dirent ***pfiles, + Fl_File_Sort_F *sort) +{ + strlcpy(filename, directory, sizeof(filename)); + int i = (int) (strlen(filename) - 1); + if (i == 2 && filename[1] == ':' && + (filename[2] == '/' || filename[2] == '\\')) + filename[2] = '/'; + else if (filename[i] != '/' && filename[i] != '\\') + strlcat(filename, "/", sizeof(filename)); + return filename_list(filename, pfiles, sort); +} + // // End of "$Id$". // |
