diff --git a/jme3-core/src/main/java/com/jme3/system/AppSettings.java b/jme3-core/src/main/java/com/jme3/system/AppSettings.java index d5653a5d71..2db7f8d702 100644 --- a/jme3-core/src/main/java/com/jme3/system/AppSettings.java +++ b/jme3-core/src/main/java/com/jme3/system/AppSettings.java @@ -295,6 +295,7 @@ public final class AppSettings extends HashMap { defaults.put("UseRetinaFrameBuffer", false); defaults.put("WindowYPosition", 0); defaults.put("WindowXPosition", 0); + defaults.put("X11PlatformPreferred", false); // defaults.put("Icons", null); } @@ -1507,4 +1508,28 @@ public int getDisplay() { public void setDisplay(int mon) { putInteger("Display", mon); } + + /** + * Sets the preferred native platform for creating the GL context on Linux distributions. + *

+ * This setting is relevant for Linux distributions or derivatives that utilize a Wayland session alongside an X11 via the XWayland bridge. + * Enabling this option allows the use of GLX for window positioning and/or icon configuration. + * + * @param preferred true to prefer GLX (native X11) for the GL context, false to prefer EGL (native Wayland). + */ + public void setX11PlatformPreferred(boolean preferred) { + putBoolean("X11PlatformPreferred", preferred); + } + + /** + * Determines which native platform is preferred for GL context creation on Linux distributions. + *

+ * This setting is only valid on Linux distributions or derivatives that support Wayland, + * and it indicates whether GLX (native X11) or EGL (native Wayland) is enabled for the GL context. + * + * @return true if GLX is preferred, otherwise false if EGL is preferred (native Wayland). + */ + public boolean isX11PlatformPreferred() { + return getBoolean("X11PlatformPreferred"); + } } diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java index 03085401a7..db4160cafe 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java @@ -275,12 +275,20 @@ public void invoke(int error, long description) { ); if (glfwPlatformSupported(GLFW_PLATFORM_WAYLAND)) { - + + /* + * Change the platform GLFW uses to enable GLX on Wayland as long as you + * have XWayland (X11 compatibility) + */ + if (settings.isX11PlatformPreferred() && glfwPlatformSupported(GLFW_PLATFORM_X11)) { + glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); + } + // Disables the libdecor bar when creating a fullscreen context // https://www.glfw.org/docs/latest/intro_guide.html#init_hints_wayland glfwInitHint(GLFW_WAYLAND_LIBDECOR, settings.isFullscreen() ? GLFW_WAYLAND_DISABLE_LIBDECOR : GLFW_WAYLAND_PREFER_LIBDECOR); } - + if (!glfwInit()) { throw new IllegalStateException("Unable to initialize GLFW"); }