4747import java .awt .*;
4848import java .awt .image .BufferedImage ;
4949import java .nio .ByteBuffer ;
50+ import java .nio .IntBuffer ;
5051import java .util .EnumSet ;
5152import java .util .HashMap ;
5253import java .util .Map ;
@@ -121,6 +122,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
121122
122123 private GLFWErrorCallback errorCallback ;
123124 private GLFWWindowSizeCallback windowSizeCallback ;
125+ private GLFWFramebufferSizeCallback framebufferSizeCallback ;
124126 private GLFWWindowFocusCallback windowFocusCallback ;
125127
126128 private Thread mainThread ;
@@ -250,16 +252,8 @@ public void invoke(int error, long description) {
250252 throw new RuntimeException ("Failed to create the GLFW window" );
251253 }
252254
253- // Add a resize callback which delegates to the listener
254- glfwSetWindowSizeCallback (window , windowSizeCallback = new GLFWWindowSizeCallback () {
255- @ Override
256- public void invoke (final long window , final int width , final int height ) {
257- settings .setResolution (width , height );
258- listener .reshape (width , height );
259- }
260- });
261-
262255 glfwSetWindowFocusCallback (window , windowFocusCallback = new GLFWWindowFocusCallback () {
256+
263257 @ Override
264258 public void invoke (final long window , final boolean focus ) {
265259 if (wasActive != focus ) {
@@ -294,6 +288,36 @@ public void invoke(final long window, final boolean focus) {
294288 setWindowIcon (settings );
295289 showWindow ();
296290
291+ // Windows resize callback
292+ glfwSetWindowSizeCallback (window , windowSizeCallback = new GLFWWindowSizeCallback () {
293+
294+ @ Override
295+ public void invoke (final long window , final int width , final int height ) {
296+
297+ // This is the window size, never to passed to any pixel based stuff!
298+ // https://www.glfw.org/docs/latest/window_guide.html#window_size
299+ onWindowSizeChanged (width , height );
300+ }
301+ });
302+
303+ // Add a framebuffer resize callback which delegates to the listener
304+ glfwSetFramebufferSizeCallback (window , framebufferSizeCallback = new GLFWFramebufferSizeCallback () {
305+
306+ @ Override
307+ public void invoke (final long window , final int width , final int height ) {
308+
309+ // The window size might be also changed, but the window size callback might not trigger
310+ // Maybe a bug in graphics drivers or LWJGL 3...? So make sure we emulate the original JME behavior here
311+ IntBuffer windowWidth = BufferUtils .createIntBuffer (1 );
312+ IntBuffer windowHeight = BufferUtils .createIntBuffer (1 );
313+ glfwGetWindowSize (window , windowWidth , windowHeight );
314+ onWindowSizeChanged (windowWidth .get (), windowHeight .get ());
315+
316+ // https://www.glfw.org/docs/latest/window_guide.html#window_fbsize
317+ listener .reshape (width , height );
318+ }
319+ });
320+
297321 allowSwapBuffers = settings .isSwapBuffers ();
298322
299323 // Create OpenCL
@@ -302,6 +326,10 @@ public void invoke(final long window, final boolean focus) {
302326 }
303327 }
304328
329+ private void onWindowSizeChanged (final int width , final int height ) {
330+ settings .setResolution (width , height );
331+ }
332+
305333 protected void showWindow () {
306334 glfwShowWindow (window );
307335 }
@@ -406,6 +434,11 @@ protected void destroyContext() {
406434 windowSizeCallback = null ;
407435 }
408436
437+ if (framebufferSizeCallback != null ) {
438+ framebufferSizeCallback .close ();
439+ framebufferSizeCallback = null ;
440+ }
441+
409442 if (windowFocusCallback != null ) {
410443 windowFocusCallback .close ();
411444 windowFocusCallback = null ;
0 commit comments