Răsfoiți Sursa

Fix: Properly enable native EGL support for GLEW on Wayland (#517)

- Added target-scoped GLEW_EGL definition in CMakeLists.txt when Wayland is found and X11 is disabled.
- Refined WaylandOpenGLDriver.cpp error handling to use GLEW_ERROR_NO_GLX_DISPLAY enum instead of fragile string matching.
- Added null safety checks for GLEW error strings.

This resolves the 'Failed to initialize GLEW: No GLX display' error for native Wayland compositors like Hyprland while maintaining build stability for other platforms.
José Miguel 5 luni în urmă
părinte
comite
c0ebf74aaa

+ 5 - 0
CMakeLists.txt

@@ -27,6 +27,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing")
 find_package(X11)
 find_package(OpenGL REQUIRED)
 find_package(GLEW REQUIRED)
+
 find_package(GLUT REQUIRED)
 find_package(ZLIB REQUIRED)
 find_package(SDL2 REQUIRED)
@@ -570,6 +571,10 @@ if(WAYLAND_SUPPORT_FOUND)
     target_compile_definitions(linux-wallpaperengine-lib PUBLIC ENABLE_WAYLAND)
 endif()
 
+if(WAYLAND_SUPPORT_FOUND AND NOT X11_SUPPORT_FOUND)
+    target_compile_definitions(linux-wallpaperengine-lib PUBLIC GLEW_EGL)
+endif()
+
 target_include_directories(linux-wallpaperengine-lib PUBLIC
     src
     src/External/glslang-WallpaperEngine

+ 8 - 1
src/WallpaperEngine/Render/Drivers/WaylandOpenGLDriver.cpp

@@ -304,8 +304,15 @@ WaylandOpenGLDriver::WaylandOpenGLDriver (ApplicationContext& context, Wallpaper
 	sLog.exception ("Cannot continue...");
     }
 
+    glewExperimental = GL_TRUE;
     if (const GLenum result = glewInit (); result != GLEW_OK) {
-	sLog.error ("Failed to initialize GLEW: ", glewGetErrorString (result));
+	if (result == GLEW_ERROR_NO_GLX_DISPLAY) {
+	    sLog.out ("Failed to initialize GLEW, but continuing with EGL context: No GLX display");
+	} else {
+	    const char* error = reinterpret_cast<const char*>(glewGetErrorString (result));
+	    sLog.error ("Failed to initialize GLEW: ", error ? error : "Unknown error");
+	    sLog.exception ("Cannot continue...");
+	}
     }
 }