diff options
| -rw-r--r-- | CMake/resources.cmake | 2 | ||||
| -rw-r--r-- | configh.cmake.in | 8 | ||||
| -rw-r--r-- | configh.in | 8 | ||||
| -rw-r--r-- | configure.ac | 3 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Screen_Driver.cxx | 23 |
5 files changed, 41 insertions, 3 deletions
diff --git a/CMake/resources.cmake b/CMake/resources.cmake index 50d630d41..4cc2d3b64 100644 --- a/CMake/resources.cmake +++ b/CMake/resources.cmake @@ -204,6 +204,8 @@ CHECK_FUNCTION_EXISTS (strlcat HAVE_STRLCAT) CHECK_FUNCTION_EXISTS (strlcpy HAVE_STRLCPY) CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) +check_function_exists(setenv HAVE_SETENV) + if(HAVE_SCANDIR AND NOT HAVE_SCANDIR_POSIX) set(MSG "POSIX compatible scandir") message(STATUS "Looking for ${MSG}") diff --git a/configh.cmake.in b/configh.cmake.in index 0dc1b9f6c..982e9f868 100644 --- a/configh.cmake.in +++ b/configh.cmake.in @@ -241,6 +241,14 @@ #cmakedefine01 USE_POLL /* + * HAVE_SETENV: + * + * Whether or not POSIX setenv() is available from stdlib.h. + */ + +#cmakedefine01 HAVE_SETENV + +/* * Do we have various image libraries? */ diff --git a/configh.in b/configh.in index 54ade6c6a..54ddf96ac 100644 --- a/configh.in +++ b/configh.in @@ -240,6 +240,14 @@ #define USE_POLL 0 /* + * HAVE_SETENV: + * + * Whether or not POSIX setenv() is available from stdlib.h. + */ + +#define HAVE_SETENV 0 + +/* * Do we have various image libraries? */ diff --git a/configure.ac b/configure.ac index 6b64110b0..e519f843d 100644 --- a/configure.ac +++ b/configure.ac @@ -620,6 +620,9 @@ AC_CHECK_FUNCS([strcasecmp strlcat strlcpy]) AC_CHECK_HEADERS([locale.h]) AC_CHECK_FUNCS([localeconv]) +dnl HP-UX 11.11 does not provide setenv() +AC_CHECK_FUNCS([setenv]) + dnl FLTK library uses math library functions... AC_SEARCH_LIBS([pow], [m]) diff --git a/src/drivers/X11/Fl_X11_Screen_Driver.cxx b/src/drivers/X11/Fl_X11_Screen_Driver.cxx index 79875366e..8dc79fc68 100644 --- a/src/drivers/X11/Fl_X11_Screen_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Screen_Driver.cxx @@ -75,9 +75,26 @@ Fl_X11_Screen_Driver::Fl_X11_Screen_Driver() : Fl_Unix_Screen_Driver() { key_table_size = 0; } -void Fl_X11_Screen_Driver::display(const char *d) -{ - if (d) setenv("DISPLAY", d, 1); +void Fl_X11_Screen_Driver::display(const char *d) { + if (!d) return; + // Issue #937: + // setenv() is available since POSIX.1-2001 + // https://pubs.opengroup.org/onlinepubs/009604499/functions/setenv.html +#if HAVE_SETENV + setenv("DISPLAY", d, 1); +#else // HAVE_SETENV + // Use putenv() for old systems (similar to FLTK 1.3) + static char e[1024]; + strcpy(e, "DISPLAY="); + strlcat(e, d, sizeof(e)); + for (char *c = e + 8; *c != ':'; c++) { + if (!*c) { + strlcat(e,":0.0",sizeof(e)); + break; + } + } + putenv(e); +#endif // HAVE_SETENV } void fl_x11_use_display(Display *d) { |
