summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMake/resources.cmake2
-rw-r--r--configh.cmake.in8
-rw-r--r--configh.in8
-rw-r--r--configure.ac3
-rw-r--r--src/drivers/X11/Fl_X11_Screen_Driver.cxx23
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) {