|
@@ -45,19 +45,25 @@ import com.jme3.system.JmeContext;
|
|
import com.jme3.system.JmeSystem;
|
|
import com.jme3.system.JmeSystem;
|
|
import com.jme3.system.NanoTimer;
|
|
import com.jme3.system.NanoTimer;
|
|
import com.jme3.util.BufferUtils;
|
|
import com.jme3.util.BufferUtils;
|
|
-import java.awt.*;
|
|
|
|
|
|
+import com.jme3.util.SafeArrayList;
|
|
|
|
+import org.lwjgl.Version;
|
|
|
|
+import org.lwjgl.glfw.GLFWErrorCallback;
|
|
|
|
+import org.lwjgl.glfw.GLFWFramebufferSizeCallback;
|
|
|
|
+import org.lwjgl.glfw.GLFWImage;
|
|
|
|
+import org.lwjgl.glfw.GLFWVidMode;
|
|
|
|
+import org.lwjgl.glfw.GLFWWindowFocusCallback;
|
|
|
|
+import org.lwjgl.glfw.GLFWWindowSizeCallback;
|
|
|
|
+import org.lwjgl.system.Platform;
|
|
|
|
+
|
|
|
|
+import java.awt.Graphics2D;
|
|
import java.awt.image.BufferedImage;
|
|
import java.awt.image.BufferedImage;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteBuffer;
|
|
-import java.nio.IntBuffer;
|
|
|
|
import java.util.EnumSet;
|
|
import java.util.EnumSet;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import java.util.logging.Logger;
|
|
-import org.lwjgl.Version;
|
|
|
|
-import org.lwjgl.glfw.*;
|
|
|
|
-import org.lwjgl.system.Platform;
|
|
|
|
|
|
|
|
import static org.lwjgl.glfw.GLFW.*;
|
|
import static org.lwjgl.glfw.GLFW.*;
|
|
import static org.lwjgl.opengl.GL11.GL_FALSE;
|
|
import static org.lwjgl.opengl.GL11.GL_FALSE;
|
|
@@ -126,6 +132,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|
protected final AtomicBoolean needRestart = new AtomicBoolean(false);
|
|
protected final AtomicBoolean needRestart = new AtomicBoolean(false);
|
|
|
|
|
|
private final JmeContext.Type type;
|
|
private final JmeContext.Type type;
|
|
|
|
+ private final SafeArrayList<WindowSizeListener> windowSizeListeners = new SafeArrayList<>(WindowSizeListener.class);
|
|
|
|
|
|
private GLFWErrorCallback errorCallback;
|
|
private GLFWErrorCallback errorCallback;
|
|
private GLFWWindowSizeCallback windowSizeCallback;
|
|
private GLFWWindowSizeCallback windowSizeCallback;
|
|
@@ -150,6 +157,24 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|
this.type = type;
|
|
this.type = type;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Registers the specified listener to get notified when window size changes.
|
|
|
|
+ *
|
|
|
|
+ * @param listener The WindowSizeListener to register.
|
|
|
|
+ */
|
|
|
|
+ public void registerWindowSizeListener(WindowSizeListener listener) {
|
|
|
|
+ windowSizeListeners.add(listener);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Removes the specified listener from the listeners list.
|
|
|
|
+ *
|
|
|
|
+ * @param listener The WindowSizeListener to remove.
|
|
|
|
+ */
|
|
|
|
+ public void removeWindowSizeListener(WindowSizeListener listener) {
|
|
|
|
+ windowSizeListeners.remove(listener);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @return Type.Display or Type.Canvas
|
|
* @return Type.Display or Type.Canvas
|
|
*/
|
|
*/
|
|
@@ -313,6 +338,11 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|
// This is the window size, never to passed to any pixel based stuff!
|
|
// This is the window size, never to passed to any pixel based stuff!
|
|
// https://www.glfw.org/docs/latest/window_guide.html#window_size
|
|
// https://www.glfw.org/docs/latest/window_guide.html#window_size
|
|
onWindowSizeChanged(width, height);
|
|
onWindowSizeChanged(width, height);
|
|
|
|
+
|
|
|
|
+ // Notify listeners
|
|
|
|
+ for (WindowSizeListener listener : windowSizeListeners.getArray()) {
|
|
|
|
+ listener.onWindowSizeChanged(width, height);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
@@ -321,14 +351,6 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void invoke(final long window, final int width, final int height) {
|
|
public void invoke(final long window, final int width, final int height) {
|
|
-
|
|
|
|
- // The window size might be also changed, but the window size callback might not trigger
|
|
|
|
- // Maybe a bug in graphics drivers or LWJGL 3...? So make sure we emulate the original JME behavior here
|
|
|
|
- IntBuffer windowWidth = BufferUtils.createIntBuffer(1);
|
|
|
|
- IntBuffer windowHeight = BufferUtils.createIntBuffer(1);
|
|
|
|
- glfwGetWindowSize(window, windowWidth, windowHeight);
|
|
|
|
- onWindowSizeChanged(windowWidth.get(), windowHeight.get());
|
|
|
|
-
|
|
|
|
// https://www.glfw.org/docs/latest/window_guide.html#window_fbsize
|
|
// https://www.glfw.org/docs/latest/window_guide.html#window_fbsize
|
|
listener.reshape(width, height);
|
|
listener.reshape(width, height);
|
|
}
|
|
}
|