diff options
| author | Greg Ercolano <erco@seriss.com> | 2020-07-14 11:34:18 -0700 |
|---|---|---|
| committer | Greg Ercolano <erco@seriss.com> | 2020-07-14 11:34:18 -0700 |
| commit | 54425030774eb04b29c749ffa85d224c8bbfcc34 (patch) | |
| tree | f6e8b0c9fd46f5bcf160de82d613e7799288e277 /src/Fl_File_Browser.cxx | |
| parent | 58296c373a79ac404e86f8a4b20a5309db2f00de (diff) | |
| parent | da76085fe71d2271847f95f5aa0694a9373fbba0 (diff) | |
Merge branch 'issue-99a': add OS error messages to Fl_File_Chooser
Pulling in Greg & Albrecht's work on PR #99 and PR #103.
This includes supporting operating system error messages
in the user's local language, which took some extra effort.
Diffstat (limited to 'src/Fl_File_Browser.cxx')
| -rw-r--r-- | src/Fl_File_Browser.cxx | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/src/Fl_File_Browser.cxx b/src/Fl_File_Browser.cxx index e7a7ea8d4..cb92428dd 100644 --- a/src/Fl_File_Browser.cxx +++ b/src/Fl_File_Browser.cxx @@ -354,10 +354,10 @@ Fl_File_Browser::item_draw(void *p, // I - List item data } -// -// 'Fl_File_Browser::Fl_File_Browser()' - Create a Fl_File_Browser widget. -// - +/** + The constructor creates the Fl_File_Browser widget at the specified position and size. + The destructor destroys the widget and frees all memory that has been allocated. +*/ Fl_File_Browser::Fl_File_Browser(int X, // I - Upper-lefthand X coordinate int Y, // I - Upper-lefthand Y coordinate int W, // I - Width in pixels @@ -370,13 +370,40 @@ Fl_File_Browser::Fl_File_Browser(int X, // I - Upper-lefthand X coordina directory_ = ""; iconsize_ = (uchar)(3 * textsize() / 2); filetype_ = FILES; + errmsg_ = NULL; } -// -// 'Fl_File_Browser::load()' - Load a directory into the browser. -// +// DTOR +Fl_File_Browser::~Fl_File_Browser() { + errmsg(NULL); // free()s prev errmsg, if any +} + + +/** + Sets OS error message to a string, which can be NULL. + Frees previous if any. + void errmsg(const char *emsg); + */ +void Fl_File_Browser::errmsg(const char* emsg) { + if ( errmsg_ ) { free((void*)errmsg_); errmsg_ = NULL; } + errmsg_ = emsg ? strdup(emsg) : NULL; +} + + +/** + Loads the specified directory into the browser. If icons have been + loaded then the correct icon is associated with each file in the list. + If directory is "", all mount points (unix) or drive letters (Windows) + are listed. + + The sort argument specifies a sort function to be used with + fl_filename_list(). + + Return value is the number of filename entries, or 0 if none. + On error, 0 is returned, and errmsg() has OS error string if non-NULL. +*/ int // O - Number of files loaded Fl_File_Browser::load(const char *directory,// I - Directory to load Fl_File_Sort_F *sort) // I - Sort function to use @@ -387,6 +414,7 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load char filename[4096]; // Current file Fl_File_Icon *icon; // Icon to use + errmsg(NULL); // clear errors first // printf("Fl_File_Browser::load(\"%s\")\n", directory); @@ -394,11 +422,12 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load directory_ = directory; - if (!directory) - return (0); + if (!directory) { + errmsg("NULL directory specified"); + return 0; + } - if (directory_[0] == '\0') - { + if (directory_[0] == '\0') { // // No directory specified; for UNIX list all mount points. For DOS // list all valid drive letters... @@ -406,21 +435,25 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load if ((icon = Fl_File_Icon::find("any", Fl_File_Icon::DEVICE)) == NULL) icon = Fl_File_Icon::find("any", Fl_File_Icon::DIRECTORY); num_files = Fl::system_driver()->file_browser_load_filesystem(this, filename, (int)sizeof(filename), icon); - } - else - { - dirent **files; // Files in in directory - // - // Build the file list... - // - num_files = Fl::system_driver()->file_browser_load_directory(directory_, filename, sizeof(filename), &files, sort); - if (num_files <= 0) - return (0); + } else { + dirent **files; // Files in in directory + char emsg[1024] = ""; + + // Build the file list, check for errors + num_files = Fl::system_driver()->file_browser_load_directory(directory_, + filename, sizeof(filename), + &files, sort, + emsg, sizeof(emsg)); + // printf("Fl_File_Browser::load(dir='%s',filename='%s'): failed, emsg='%s'\n", directory_, filename, emsg); + + if (num_files <= 0) { + errmsg(emsg); + return 0; + } for (i = 0, num_dirs = 0; i < num_files; i ++) { if (strcmp(files[i]->d_name, "./")) { - snprintf(filename, sizeof(filename), "%s/%s", directory_, - files[i]->d_name); + fl_snprintf(filename, sizeof(filename), "%s/%s", directory_, files[i]->d_name); icon = Fl_File_Icon::find(filename); if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) || |
