From a47df744310de9fb8cc5d12c9685a3d4fa564110 Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Wed, 22 Jan 2020 18:44:49 +0100 Subject: 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. --- src/drivers/X11/Fl_X11_System_Driver.cxx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/drivers') 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); -- cgit v1.2.3