diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c index 9c0921c47..49cb6fff4 100644 --- a/src/platforms/rcore_desktop_glfw.c +++ b/src/platforms/rcore_desktop_glfw.c @@ -74,14 +74,27 @@ #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include // Required for: timespec, nanosleep(), select() - POSIX - //#define GLFW_EXPOSE_NATIVE_WAYLAND - #define GLFW_EXPOSE_NATIVE_X11 - #define Font X11Font // Hack to fix 'Font' name collision +#if defined(_GLFW_X11) || defined(_GLFW_WAYLAND) + // Set appropriate expose macros based on available backends + #if defined(_GLFW_X11) + #define GLFW_EXPOSE_NATIVE_X11 + #define Font X11Font // Hack to fix 'Font' name collision // The definition and references to the X11 Font type will be replaced by 'X11Font' // Works as long as the current file consistently references any X11 Font as X11Font // Since it is never referenced (as of writting), this does not pose an issue - #include "GLFW/glfw3native.h" // Required for: glfwGetX11Window() - #undef Font // Revert hack and allow normal raylib Font usage + #endif + + #if defined(_GLFW_WAYLAND) + #define GLFW_EXPOSE_NATIVE_WAYLAND + #endif + + #include "GLFW/glfw3native.h" // Include native header only once, regardless of how many backends are defined + // Required for: glfwGetX11Window() and glfwGetWaylandWindow() + + #if defined(_GLFW_X11) // Clean up X11-specific hacks + #undef Font // Revert hack and allow normal raylib Font usage + #endif +#endif #endif #if defined(__APPLE__) #include // Required for: usleep() @@ -710,7 +723,7 @@ void SetWindowFocused(void) glfwFocusWindow(platform.handle); } -#if defined(__linux__) +#if defined(__linux__) && defined(_GLFW_X11) // Local storage for the window handle returned by glfwGetX11Window // This is needed as X11 handles are integers and may not fit inside a pointer depending on platform // Storing the handle locally and returning a pointer in GetWindowHandle allows the code to work regardless of pointer width @@ -724,10 +737,27 @@ void *GetWindowHandle(void) return glfwGetWin32Window(platform.handle); #endif #if defined(__linux__) - // Store the window handle localy and return a pointer to the variable instead - // Reasoning detailed in the declaration of X11WindowHandle - X11WindowHandle = glfwGetX11Window(platform.handle); - return &X11WindowHandle; + #if defined(_GLFW_WAYLAND) + #if defined(_GLFW_X11) + int platformID = glfwGetPlatform(); + if (platformID == GLFW_PLATFORM_WAYLAND) + { + return glfwGetWaylandWindow(platform.handle); + } + else + { + X11WindowHandle = glfwGetX11Window(platform.handle); + return &X11WindowHandle; + } + #else + return glfwGetWaylandWindow(platform.handle); + #endif + #elif defined(_GLFW_X11) + // Store the window handle localy and return a pointer to the variable instead + // Reasoning detailed in the declaration of X11WindowHandle + X11WindowHandle = glfwGetX11Window(platform.handle); + return &X11WindowHandle; + #endif #endif #if defined(__APPLE__) // NOTE: Returned handle is: (objc_object *)