Skip to content

Commit 1e7e12e

Browse files
tonihelepspeed42
authored andcommitted
Fix for resizing the window (issue 1191) (jMonkeyEngine#1308)
* Listen for framebuffer size callbacks and set the resolution from that * Also check the window size on the framebuffer size callback
1 parent f0e09b2 commit 1e7e12e

File tree

1 file changed

+42
-9
lines changed

1 file changed

+42
-9
lines changed

Diff for: jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java

+42-9
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import java.awt.*;
4848
import java.awt.image.BufferedImage;
4949
import java.nio.ByteBuffer;
50+
import java.nio.IntBuffer;
5051
import java.util.EnumSet;
5152
import java.util.HashMap;
5253
import 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

Comments
 (0)