diff --git a/README.md b/README.md index 0988fa72..cf8bf655 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ information on what to include when reporting a bug. - Added `GLFW_BUILD_X11` CMake option for enabling X11 support (#1958) - Added `GLFW_LIBRARY_TYPE` CMake variable for overriding the library type (#279,#1307,#1497,#1574,#1928) + - Added support for `XDG_SESSION_TYPE` environment variable - Added `GLFW_PKG_CONFIG_REQUIRES_PRIVATE` and `GLFW_PKG_CONFIG_LIBS_PRIVATE` CMake variables exposing pkg-config dependencies (#1307) - Made joystick subsystem initialize at first use (#1284,#1646) diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h index 6423d61f..c8ca3ffe 100644 --- a/include/GLFW/glfw3.h +++ b/include/GLFW/glfw3.h @@ -2199,6 +2199,13 @@ typedef struct GLFWallocator * application locale according to the current environment if that category is * still "C". This is because the "C" locale breaks Unicode text input. * + * @remark __Wayland, X11:__ If the library was compiled with support for both + * Wayland and X11, and the @ref GLFW_PLATFORM init hint is set to + * `GLFW_ANY_PLATFORM`, the `XDG_SESSION_TYPE` environment variable affects + * which platform is picked. If the environment variable is not set, or is set + * to something other than `wayland` or `x11`, the regular detection mechanism + * will be used instead. + * * @thread_safety This function must only be called from the main thread. * * @sa @ref intro_init diff --git a/src/platform.c b/src/platform.c index e666ccd8..aea47bfb 100644 --- a/src/platform.c +++ b/src/platform.c @@ -27,6 +27,9 @@ #include "internal.h" +#include +#include + // These construct a string literal from individual numeric constants #define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r #define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r) @@ -80,6 +83,22 @@ GLFWbool _glfwSelectPlatform(int desiredID, _GLFWplatform* platform) return GLFW_FALSE; } +#if defined(_GLFW_WAYLAND) && defined(_GLFW_X11) + if (desiredID == GLFW_ANY_PLATFORM) + { + const char* const session = getenv("XDG_SESSION_TYPE"); + if (session) + { + // Only follow XDG_SESSION_TYPE if it is set correctly and the + // environment looks plausble; otherwise fall back to detection + if (strcmp(session, "wayland") == 0 && getenv("WAYLAND_DISPLAY")) + desiredID = GLFW_PLATFORM_WAYLAND; + else if (strcmp(session, "x11") == 0 && getenv("DISPLAY")) + desiredID = GLFW_PLATFORM_X11; + } + } +#endif + if (desiredID == GLFW_ANY_PLATFORM) { // If there is exactly one platform available for auto-selection, let it emit the