20#if HAVE_DLSYM && HAVE_DLFCN_H
33typedef void* gpointer;
35typedef unsigned int guint;
36typedef unsigned long gulong;
39typedef struct _GSList GSList;
45#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
46typedef struct _GtkWidget GtkWidget;
47typedef struct _GtkFileChooser GtkFileChooser;
48typedef struct _GtkDialog GtkDialog;
49typedef struct _GtkWindow GtkWindow;
50typedef struct _GdkDrawable GdkWindow;
51typedef struct _GtkFileFilter GtkFileFilter;
52typedef struct _GtkToggleButton GtkToggleButton;
54 GTK_FILE_FILTER_FILENAME = 1 << 0,
55 GTK_FILE_FILTER_URI = 1 << 1,
56 GTK_FILE_FILTER_DISPLAY_NAME = 1 << 2,
57 GTK_FILE_FILTER_MIME_TYPE = 1 << 3
59struct _GtkFileFilterInfo
61 GtkFileFilterFlags contains;
63 const gchar *filename;
65 const gchar *display_name;
66 const gchar *mime_type;
68typedef struct _GtkFileFilterInfo GtkFileFilterInfo;
69typedef gboolean (*GtkFileFilterFunc) (
const GtkFileFilterInfo *filter_info, gpointer data);
70typedef void (*GDestroyNotify)(gpointer data);
73 GTK_FILE_CHOOSER_ACTION_OPEN,
74 GTK_FILE_CHOOSER_ACTION_SAVE,
75 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
76 GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
77} GtkFileChooserAction;
78#define GTK_STOCK_CANCEL "gtk-cancel"
79#define GTK_STOCK_SAVE "gtk-save"
80#define GTK_STOCK_OPEN "gtk-open"
81const int GTK_RESPONSE_NONE = -1;
82const int GTK_RESPONSE_ACCEPT = -3;
83const int GTK_RESPONSE_DELETE_EVENT = -4;
84const int GTK_RESPONSE_CANCEL = -6;
85typedef void (*GCallback)(void);
86#define G_CALLBACK(f) ((GCallback) (f))
87typedef int GConnectFlags;
88typedef struct _GClosure GClosure;
89typedef void (*GClosureNotify)(gpointer data, GClosure *closure);
93int Fl_GTK_File_Chooser::did_find_GTK_libs = 0;
98typedef void (*XX_g_free)(gpointer);
99static XX_g_free fl_g_free = NULL;
102typedef gpointer (*XX_g_slist_nth_data) (GSList *, guint);
103static XX_g_slist_nth_data fl_g_slist_nth_data = NULL;
106typedef guint (*XX_g_slist_length) (GSList *);
107static XX_g_slist_length fl_g_slist_length = NULL;
110typedef void (*XX_g_slist_free) (GSList *);
111static XX_g_slist_free fl_g_slist_free = NULL;
114typedef gboolean (*XX_gtk_init_check)(
int *,
char ***);
115static XX_gtk_init_check fl_gtk_init_check = NULL;
118typedef void (*XX_gtk_widget_destroy) (GtkWidget *);
119static XX_gtk_widget_destroy fl_gtk_widget_destroy = NULL;
122typedef void (*XX_gtk_file_chooser_set_select_multiple)(GtkFileChooser *, gboolean);
123static XX_gtk_file_chooser_set_select_multiple fl_gtk_file_chooser_set_select_multiple = NULL;
126typedef void (*XX_gtk_file_chooser_set_do_overwrite_confirmation)(GtkFileChooser *, gboolean);
127static XX_gtk_file_chooser_set_do_overwrite_confirmation fl_gtk_file_chooser_set_do_overwrite_confirmation = NULL;
130typedef void (*XX_gtk_file_chooser_set_current_name)(GtkFileChooser *,
const gchar *);
131static XX_gtk_file_chooser_set_current_name fl_gtk_file_chooser_set_current_name = NULL;
134typedef void (*XX_gtk_file_chooser_set_current_folder)(GtkFileChooser *,
const gchar *);
135static XX_gtk_file_chooser_set_current_folder fl_gtk_file_chooser_set_current_folder = NULL;
138typedef void (*XX_gtk_file_chooser_set_create_folders) (GtkFileChooser *, gboolean);
139static XX_gtk_file_chooser_set_create_folders fl_gtk_file_chooser_set_create_folders = NULL;
142typedef gboolean (*XX_gtk_file_chooser_get_select_multiple)(GtkFileChooser *);
143static XX_gtk_file_chooser_get_select_multiple fl_gtk_file_chooser_get_select_multiple = NULL;
146typedef void (*XX_gtk_widget_hide)(GtkWidget *);
147static XX_gtk_widget_hide fl_gtk_widget_hide = NULL;
150typedef gchar* (*XX_gtk_file_chooser_get_filename)(GtkFileChooser *);
151static XX_gtk_file_chooser_get_filename fl_gtk_file_chooser_get_filename = NULL;
154typedef GSList* (*XX_gtk_file_chooser_get_filenames)(GtkFileChooser *chooser);
155static XX_gtk_file_chooser_get_filenames fl_gtk_file_chooser_get_filenames = NULL;
158typedef gboolean (*XX_gtk_main_iteration)(void);
159static XX_gtk_main_iteration fl_gtk_main_iteration = NULL;
162typedef gboolean (*XX_gtk_events_pending)(void);
163static XX_gtk_events_pending fl_gtk_events_pending = NULL;
166typedef GtkWidget* (*XX_gtk_file_chooser_dialog_new)(
const gchar *, GtkWindow *, GtkFileChooserAction,
const gchar *, ...);
167static XX_gtk_file_chooser_dialog_new fl_gtk_file_chooser_dialog_new = NULL;
170typedef void (*XX_gtk_file_chooser_add_filter)(GtkFileChooser*, GtkFileFilter*);
171static XX_gtk_file_chooser_add_filter fl_gtk_file_chooser_add_filter = NULL;
174typedef GtkFileFilter* (*XX_gtk_file_chooser_get_filter)(GtkFileChooser*);
175static XX_gtk_file_chooser_get_filter fl_gtk_file_chooser_get_filter = NULL;
178typedef void (*XX_gtk_file_chooser_set_filter)(GtkFileChooser*, GtkFileFilter*);
179static XX_gtk_file_chooser_set_filter fl_gtk_file_chooser_set_filter = NULL;
182typedef GtkFileFilter* (*XX_gtk_file_filter_new)(void);
183static XX_gtk_file_filter_new fl_gtk_file_filter_new = NULL;
186typedef void (*XX_gtk_file_filter_add_pattern)(GtkFileFilter*,
const gchar*);
187static XX_gtk_file_filter_add_pattern fl_gtk_file_filter_add_pattern = NULL;
191typedef void (*XX_gtk_file_filter_add_custom)(GtkFileFilter *filter, GtkFileFilterFlags needed,
192 GtkFileFilterFunc func, gpointer data,
193 GDestroyNotify notify);
194static XX_gtk_file_filter_add_custom fl_gtk_file_filter_add_custom = NULL;
197typedef void (*XX_gtk_file_filter_set_name)(GtkFileFilter*,
const gchar*);
198static XX_gtk_file_filter_set_name fl_gtk_file_filter_set_name = NULL;
201typedef const gchar* (*XX_gtk_file_filter_get_name)(GtkFileFilter*);
202static XX_gtk_file_filter_get_name fl_gtk_file_filter_get_name = NULL;
205typedef void (*XX_gtk_file_chooser_set_extra_widget)(GtkFileChooser *, GtkWidget *);
206static XX_gtk_file_chooser_set_extra_widget fl_gtk_file_chooser_set_extra_widget = NULL;
209typedef void (*XX_gtk_widget_show_now)(GtkWidget *);
210static XX_gtk_widget_show_now fl_gtk_widget_show_now = NULL;
213typedef GdkWindow* (*XX_gtk_widget_get_window)(GtkWidget *);
214static XX_gtk_widget_get_window fl_gtk_widget_get_window = NULL;
217typedef Window (*XX_gdk_x11_drawable_get_xid)(GdkWindow *);
218static XX_gdk_x11_drawable_get_xid fl_gdk_x11_drawable_get_xid = NULL;
221typedef GtkWidget* (*XX_gtk_check_button_new_with_label)(
const gchar *);
222static XX_gtk_check_button_new_with_label fl_gtk_check_button_new_with_label = NULL;
225typedef gulong (*XX_g_signal_connect_data)(gpointer,
const gchar *, GCallback, gpointer, GClosureNotify, GConnectFlags);
226static XX_g_signal_connect_data fl_g_signal_connect_data = NULL;
229typedef gboolean (*XX_gtk_toggle_button_get_active)(GtkToggleButton*);
230static XX_gtk_toggle_button_get_active fl_gtk_toggle_button_get_active = NULL;
233typedef void (*XX_gtk_file_chooser_set_show_hidden)(GtkFileChooser *, gboolean);
234static XX_gtk_file_chooser_set_show_hidden fl_gtk_file_chooser_set_show_hidden = NULL;
237typedef gboolean (*XX_gtk_file_chooser_get_show_hidden)(GtkFileChooser *);
238static XX_gtk_file_chooser_get_show_hidden fl_gtk_file_chooser_get_show_hidden = NULL;
241typedef void (*XX_gtk_toggle_button_set_active)(GtkToggleButton *, gboolean);
242static XX_gtk_toggle_button_set_active fl_gtk_toggle_button_set_active = NULL;
250 gtkw_filename = NULL;
253 previous_filter = NULL;
256Fl_GTK_File_Chooser::~Fl_GTK_File_Chooser()
260 fl_gtk_widget_destroy (gtkw_ptr);
264 fl_g_free(gtkw_filename);
265 gtkw_filename = NULL;
268 GSList *iter = (GSList *)gtkw_slist;
270 if(iter->data) fl_g_free(iter->data);
271 iter = g_slist_next(iter);
273 fl_g_slist_free((GSList *)gtkw_slist);
277 gtkw_title = strfree(gtkw_title);
280void Fl_GTK_File_Chooser::type(
int val) {
284int Fl_GTK_File_Chooser::count()
const {
288const char *Fl_GTK_File_Chooser::filename()
const
291 if(fl_gtk_file_chooser_get_select_multiple((GtkFileChooser *)gtkw_ptr) == FALSE) {
292 return gtkw_filename;
295 GSList *iter = (GSList *)gtkw_slist;
296 char *nm = (
char *)iter->data;
303const char *Fl_GTK_File_Chooser::filename(
int i)
const
305 if(fl_gtk_file_chooser_get_select_multiple((GtkFileChooser *)gtkw_ptr) == FALSE) {
306 return gtkw_filename;
309 if ((
unsigned)i < gtkw_count) {
310 GSList *iter = (GSList *)gtkw_slist;
311 char *nm = (
char *)fl_g_slist_nth_data(iter, i);
318void Fl_GTK_File_Chooser::title(
const char *val)
321 gtkw_title = strnew(val);
324const char* Fl_GTK_File_Chooser::title()
const
330void Fl_GTK_File_Chooser::changed_output_type(
const char *filter)
333 if (strchr(filter,
'(') || strchr(filter,
'{') || strchr(filter+1,
'*') || strncmp(filter,
"*.", 2))
return;
334 const char *p = fl_gtk_file_chooser_get_filename((GtkFileChooser*)gtkw_ptr);
337 const char *q = strrchr(p,
'.');
338 if (!q) q = p + strlen(p);
339 char *r =
new char[strlen(p) + strlen(filter)];
341 strcpy(r + (q - p), filter + 1);
342 fl_gtk_file_chooser_set_current_name((GtkFileChooser*)gtkw_ptr, r);
348gboolean Fl_GTK_File_Chooser::custom_gtk_filter_function(
const GtkFileFilterInfo *info, Fl_GTK_File_Chooser::pair* p)
350 if (p->running->previous_filter != p->filter) {
351 p->running->changed_output_type(p->filter);
352 p->running->previous_filter = p->filter;
357void Fl_GTK_File_Chooser::free_pair(Fl_GTK_File_Chooser::pair *p)
362static void hidden_files_cb(GtkToggleButton *togglebutton, gpointer user_data)
364 gboolean state = fl_gtk_toggle_button_get_active(togglebutton);
365 fl_gtk_file_chooser_set_show_hidden((GtkFileChooser*)user_data, state);
368int Fl_GTK_File_Chooser::show()
374 static bool first =
true;
377 static char *gtk_wants = NULL;
380 p = setlocale(LC_ALL, NULL);
381 if (p) before = strdup(p);
383 setlocale(LC_ALL, gtk_wants);
385 int retval = fl_gtk_chooser_wrapper();
389 p = setlocale(LC_ALL, NULL);
390 if (p) gtk_wants = strdup(p);
393 setlocale(LC_ALL, before);
399static char *extract_dir_from_path(
const char *path)
401 static char *dir = NULL;
405 if (*path !=
'/')
return NULL;
409 char *p = strrchr(dir,
'/');
417static void run_response_handler(GtkDialog *dialog, gint response_id, gpointer data)
419 gint *ri = (gint *)data;
424int Fl_GTK_File_Chooser::fl_gtk_chooser_wrapper()
427 static int have_gtk_init = 0;
433 fl_gtk_init_check(&ac, NULL);
437 fl_gtk_widget_destroy (gtkw_ptr);
442 GtkFileChooserAction gtw_action_type;
446 gtw_action_type = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
450 gtw_action_type = GTK_FILE_CHOOSER_ACTION_SAVE;
454 gtw_action_type = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER;
460 gtw_action_type = GTK_FILE_CHOOSER_ACTION_OPEN;
464 gtkw_ptr = fl_gtk_file_chooser_dialog_new (gtkw_title,
467 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
468 gtw_action_type == GTK_FILE_CHOOSER_ACTION_SAVE || gtw_action_type == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER ?
469 GTK_STOCK_SAVE : GTK_STOCK_OPEN,
482 fl_gtk_file_chooser_set_select_multiple((GtkFileChooser *)gtkw_ptr, TRUE);
486 if (_preset_file)fl_gtk_file_chooser_set_current_name ((GtkFileChooser *)gtkw_ptr,
fl_filename_name(_preset_file));
489 fl_gtk_file_chooser_set_create_folders((GtkFileChooser *)gtkw_ptr, TRUE);
499 if (_directory && _directory[0]) {
500 p = extract_dir_from_path(_directory);
501 if (p) fl_gtk_file_chooser_set_current_folder((GtkFileChooser *)gtkw_ptr, p);
503 else if (_preset_file) {
504 p = extract_dir_from_path(_preset_file);
505 if (p) fl_gtk_file_chooser_set_current_folder((GtkFileChooser *)gtkw_ptr, p);
508 GtkFileFilter **filter_tab = NULL;
510 filter_tab =
new GtkFileFilter*[_nfilters];
511 char *filter = strdup(_parsedfilt);
512 p = strtok(filter,
"\t");
515 filter_tab[count] = fl_gtk_file_filter_new();
516 fl_gtk_file_filter_set_name(filter_tab[count], p);
517 p = strchr(p,
'(') + 1;
518 char *q = strchr(p,
')'); *q = 0;
519 fl_gtk_file_filter_add_custom(filter_tab[count],
520 GTK_FILE_FILTER_FILENAME,
521 (GtkFileFilterFunc)Fl_GTK_File_Chooser::custom_gtk_filter_function,
522 new Fl_GTK_File_Chooser::pair(
this, p),
523 (GDestroyNotify)Fl_GTK_File_Chooser::free_pair);
524 fl_gtk_file_chooser_add_filter((GtkFileChooser *)gtkw_ptr, filter_tab[count]);
525 p = strtok(NULL,
"\t");
529 fl_gtk_file_chooser_set_filter((GtkFileChooser *)gtkw_ptr, filter_tab[_filtvalue < _nfilters?_filtvalue:0]);
530 previous_filter = NULL;
531 if (gtw_action_type == GTK_FILE_CHOOSER_ACTION_OPEN) {
532 GtkFileFilter* gfilter = fl_gtk_file_filter_new();
534 fl_gtk_file_filter_add_pattern(gfilter,
"*");
535 fl_gtk_file_chooser_add_filter((GtkFileChooser *)gtkw_ptr, gfilter);
540 fl_gtk_file_chooser_set_extra_widget((GtkFileChooser *)gtkw_ptr, toggle);
541 fl_g_signal_connect_data(toggle,
"toggled", G_CALLBACK(hidden_files_cb), gtkw_ptr, NULL, (GConnectFlags) 0);
543 fl_gtk_widget_show_now(gtkw_ptr);
545 GdkWindow* gdkw = fl_gtk_widget_get_window(gtkw_ptr);
546 Window xw = fl_gdk_x11_drawable_get_xid(gdkw);
547 XSetTransientForHint(fl_display, xw, fl_xid(firstw));
549 gboolean state = fl_gtk_file_chooser_get_show_hidden((GtkFileChooser *)gtkw_ptr);
550 fl_gtk_toggle_button_set_active((GtkToggleButton *)toggle, state);
552 gint response_id = GTK_RESPONSE_NONE;
553 fl_g_signal_connect_data(gtkw_ptr,
"response", G_CALLBACK(run_response_handler), &response_id, NULL, (GConnectFlags) 0);
554 while (response_id == GTK_RESPONSE_NONE) {
555 fl_gtk_main_iteration();
556 while (XEventsQueued(fl_display, QueuedAfterReading)) {
558 XNextEvent(fl_display, &xevent);
559 Window xid = xevent.xany.window;
560 if (xevent.type == ConfigureNotify) xid = xevent.xmaprequest.window;
561 if (!fl_find(xid))
continue;
563 if ( xevent.type == Expose || xevent.type == ConfigureNotify ) fl_handle(xevent);
568 if (response_id == GTK_RESPONSE_ACCEPT) {
570 GtkFileFilter *gfilter = fl_gtk_file_chooser_get_filter((GtkFileChooser *)gtkw_ptr);
571 for (_filtvalue = 0; _filtvalue < _nfilters; _filtvalue++) {
572 if (filter_tab[_filtvalue] == gfilter)
break;
578 fl_g_free(gtkw_filename);
579 gtkw_filename = NULL;
582 GSList *iter = (GSList *)gtkw_slist;
584 if(iter->data) fl_g_free(iter->data);
585 iter = g_slist_next(iter);
587 fl_g_slist_free((GSList *)gtkw_slist);
592 if(fl_gtk_file_chooser_get_select_multiple((GtkFileChooser *)gtkw_ptr) == FALSE) {
593 gtkw_filename = fl_gtk_file_chooser_get_filename ((GtkFileChooser *)gtkw_ptr);
601 gtkw_slist = fl_gtk_file_chooser_get_filenames((GtkFileChooser *)gtkw_ptr);
602 gtkw_count = fl_g_slist_length((GSList *)gtkw_slist);
603 if(gtkw_count) result = 0;
616 if ( response_id == GTK_RESPONSE_DELETE_EVENT) gtkw_ptr = NULL;
617 else fl_gtk_widget_hide (gtkw_ptr);
621 while (fl_gtk_events_pending ()) fl_gtk_main_iteration ();
626#if HAVE_DLSYM && HAVE_DLFCN_H
628# define GET_SYM(SSS, LLL) \
630fl_##SSS = (XX_##SSS)dlsym(LLL, #SSS); \
631if ((pc_dl_error = dlerror()) != NULL) { \
632fprintf(stderr, "%s\n", pc_dl_error); \
633did_find_GTK_libs = 0; \
636static void* fl_dlopen(
const char *filename1,
const char *filename2)
638 void *ptr = dlopen(filename1, RTLD_LAZY | RTLD_GLOBAL);
639 if (!ptr) ptr = dlopen(filename2, RTLD_LAZY | RTLD_GLOBAL);
649void Fl_GTK_File_Chooser::probe_for_GTK_libs(
void) {
650#if HAVE_DLSYM && HAVE_DLFCN_H
651 void *ptr_glib = NULL;
652 void *ptr_gtk = NULL;
655 ptr_glib = dlopen(
"/sw/lib/libglib-2.0.dylib", RTLD_LAZY | RTLD_GLOBAL);
657 ptr_glib = fl_dlopen(
"libglib-2.0.so",
"libglib-2.0.so.0");
661 ptr_gtk = dlopen(
"/sw/lib/libgtk-x11-2.0.dylib", RTLD_LAZY | RTLD_GLOBAL);
663 ptr_gtk = fl_dlopen(
"libgtk-x11-2.0.so",
"libgtk-x11-2.0.so.0");
665 if (ptr_gtk && ptr_glib) {
667 puts(
"selected GTK-2\n");
671 ptr_gtk = fl_dlopen(
"libgtk-3.so",
"libgtk-3.so.0");
673 if (ptr_gtk && ptr_glib) {
674 puts(
"selected GTK-3\n");
679 if((!ptr_glib) || (!ptr_gtk)) {
681 puts(
"Failure to load libglib or libgtk");
683 did_find_GTK_libs = 0;
689 GET_SYM(g_free, ptr_glib);
690 GET_SYM(g_slist_nth_data, ptr_glib);
691 GET_SYM(g_slist_length, ptr_glib);
692 GET_SYM(g_slist_free, ptr_glib);
694 GET_SYM(gtk_init_check, ptr_gtk);
695 GET_SYM(gtk_widget_destroy, ptr_gtk);
696 GET_SYM(gtk_file_chooser_set_select_multiple, ptr_gtk);
697 GET_SYM(gtk_file_chooser_set_do_overwrite_confirmation, ptr_gtk);
698 GET_SYM(gtk_file_chooser_set_current_name, ptr_gtk);
699 GET_SYM(gtk_file_chooser_set_current_folder, ptr_gtk);
700 GET_SYM(gtk_file_chooser_set_create_folders, ptr_gtk);
701 GET_SYM(gtk_file_chooser_get_select_multiple, ptr_gtk);
702 GET_SYM(gtk_widget_hide, ptr_gtk);
703 GET_SYM(gtk_file_chooser_get_filename, ptr_gtk);
704 GET_SYM(gtk_file_chooser_get_filenames, ptr_gtk);
705 GET_SYM(gtk_main_iteration, ptr_gtk);
706 GET_SYM(gtk_events_pending, ptr_gtk);
707 GET_SYM(gtk_file_chooser_dialog_new, ptr_gtk);
708 GET_SYM(gtk_file_chooser_add_filter, ptr_gtk);
709 GET_SYM(gtk_file_chooser_get_filter, ptr_gtk);
710 GET_SYM(gtk_file_chooser_set_filter, ptr_gtk);
711 GET_SYM(gtk_file_filter_new, ptr_gtk);
712 GET_SYM(gtk_file_filter_add_pattern, ptr_gtk);
713 GET_SYM(gtk_file_filter_add_custom, ptr_gtk);
714 GET_SYM(gtk_file_filter_set_name, ptr_gtk);
715 GET_SYM(gtk_file_filter_get_name, ptr_gtk);
716 GET_SYM(gtk_file_chooser_set_extra_widget, ptr_gtk);
717 GET_SYM(gtk_widget_show_now, ptr_gtk);
718 GET_SYM(gtk_widget_get_window, ptr_gtk);
719 GET_SYM(gdk_x11_drawable_get_xid, ptr_gtk);
720 GET_SYM(gtk_check_button_new_with_label, ptr_gtk);
721 GET_SYM(g_signal_connect_data, ptr_gtk);
722 GET_SYM(gtk_toggle_button_get_active, ptr_gtk);
723 GET_SYM(gtk_file_chooser_set_show_hidden, ptr_gtk);
724 GET_SYM(gtk_file_chooser_get_show_hidden, ptr_gtk);
725 GET_SYM(gtk_toggle_button_set_active, ptr_gtk);
727 did_find_GTK_libs = 1;
Definition Fl_Native_File_Chooser.H:259
static const char * hidden_label
[standard text may be customized at run-time]
Definition Fl_File_Chooser.H:226
static const char * all_files_label
[standard text may be customized at run-time]
Definition Fl_File_Chooser.H:178
@ BROWSE_DIRECTORY
browse directories (lets user choose one directory)
Definition Fl_Native_File_Chooser.H:115
@ BROWSE_MULTI_FILE
browse files (lets user choose multiple files)
Definition Fl_Native_File_Chooser.H:116
@ BROWSE_SAVE_FILE
browse to save a file
Definition Fl_Native_File_Chooser.H:118
@ BROWSE_SAVE_DIRECTORY
browse to save a directory
Definition Fl_Native_File_Chooser.H:119
@ BROWSE_MULTI_DIRECTORY
browse directories (lets user choose multiple directories)
Definition Fl_Native_File_Chooser.H:117
@ BROWSE_FILE
browse files (lets user choose one file)
Definition Fl_Native_File_Chooser.H:114
@ USE_FILTER_EXT
Chooser filter pilots the output file extension (if supported)
Definition Fl_Native_File_Chooser.H:126
@ SAVEAS_CONFIRM
Show native 'Save As' overwrite confirm dialog.
Definition Fl_Native_File_Chooser.H:123
This widget produces an actual window.
Definition Fl_Window.H:57
static void flush()
Causes all the windows that need it to be redrawn and graphics forced out through the pipes.
Definition Fl.cxx:801
FL_EXPORT const char * fl_filename_name(const char *filename)
Gets the file name from a path.
FL_EXPORT int fl_filename_match(const char *name, const char *pattern)
Checks if a string s matches a pattern p.
Definition filename_match.cxx:44
FL_EXPORT int fl_filename_isdir(const char *name)
Determines if a file exists and is a directory from its filename.
Definition filename_isdir.cxx:52
static Fl_Window * first_window()
Returns the first top-level window in the list of shown() windows.
Definition Fl.cxx:755