summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_Native_File_Chooser_GTK.cxx28
-rw-r--r--src/drivers/X11/Fl_X11_System_Driver.cxx15
2 files changed, 15 insertions, 28 deletions
diff --git a/src/Fl_Native_File_Chooser_GTK.cxx b/src/Fl_Native_File_Chooser_GTK.cxx
index 575ab4c70..1bbdf003a 100644
--- a/src/Fl_Native_File_Chooser_GTK.cxx
+++ b/src/Fl_Native_File_Chooser_GTK.cxx
@@ -432,33 +432,7 @@ static void hidden_files_cb(GtkToggleButton *togglebutton, gpointer user_data)
int Fl_GTK_Native_File_Chooser_Driver::show()
{
- // The point here is that after running a GTK dialog, the calling program's current locale is modified.
- // To avoid that, we memorize the calling program's current locale, and the locale as modified
- // by GTK after the first dialog use. We restore the calling program's current locale
- // before returning, and we set the locale as modified by GTK before subsequent GTK dialog uses.
- static bool first = true;
- char *p;
- char *before = NULL;
- static char *gtk_wants = NULL;
- fl_open_display();
- // record in before the calling program's current locale
- p = setlocale(LC_ALL, NULL);
- if (p) before = strdup(p);
- if (gtk_wants) { // set the locale as GTK 'wants it'
- setlocale(LC_ALL, gtk_wants);
- }
- int retval = fl_gtk_chooser_wrapper(); // may change the locale
- if (first) {
- first = false;
- // record in gtk_wants the locale as modified by the GTK dialog
- p = setlocale(LC_ALL, NULL);
- if (p) gtk_wants = strdup(p);
- }
- if (before) {
- setlocale(LC_ALL, before); // restore calling program's current locale
- free(before);
- }
- return retval;
+ return fl_gtk_chooser_wrapper();
}
static char *extract_dir_from_path(const char *path)
diff --git a/src/drivers/X11/Fl_X11_System_Driver.cxx b/src/drivers/X11/Fl_X11_System_Driver.cxx
index 3c4cc043d..79193a04d 100644
--- a/src/drivers/X11/Fl_X11_System_Driver.cxx
+++ b/src/drivers/X11/Fl_X11_System_Driver.cxx
@@ -569,8 +569,21 @@ bool Fl_X11_System_Driver::probe_for_GTK(int major, int minor, void **ptr_gtk) {
init_f = (init_t)dlsym(*ptr_gtk, "gtk_init_check");
if (!init_f) return false;
}
+
+ // The point here is that after running gtk_init_check, the calling program's current locale can be modified.
+ // To avoid that, we memorize the calling program's current locale and restore the locale
+ // before returning.
+ char *before = NULL;
+ // record in "before" the calling program's current locale
+ char *p = setlocale(LC_ALL, NULL);
+ if (p) before = strdup(p);
int ac = 0;
- init_f(&ac, NULL);
+ init_f(&ac, NULL); // may change the locale
+ if (before) {
+ setlocale(LC_ALL, before); // restore calling program's current locale
+ free(before);
+ }
+
// now check if running version is high enough
if (dlsym(*ptr_gtk, "gtk_get_major_version") == NULL) { // YES indicates V 3
typedef const char* (*check_t)(int, int, int);