diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-01-22 18:44:49 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-01-22 18:44:49 +0100 |
| commit | a47df744310de9fb8cc5d12c9685a3d4fa564110 (patch) | |
| tree | 6eb66e2b229c810b8be5fc9353ed6a259054a2ee | |
| parent | bcc2f4c575df31561642cf192d33ee69ddfbd5e1 (diff) | |
Fix preservation of the caller's locale when running GTK dialogs.
There are now 2 kinds of GTK libraries (V2 and V3) and two dialogs
the file chooser and the printer chooser.
| -rw-r--r-- | src/Fl_Native_File_Chooser_GTK.cxx | 28 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_System_Driver.cxx | 15 |
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); |
