From 5949d57bb1850f1f7d4092617819fe2ba7bb42b6 Mon Sep 17 00:00:00 2001 From: kappa1 Date: Wed, 13 Jul 2011 22:15:35 +0000 Subject: [PATCH] Implement Resizing Display API for OS X --- src/java/org/lwjgl/opengl/Display.java | 51 +++++++++++++++++-- .../lwjgl/opengl/DisplayImplementation.java | 7 +-- src/java/org/lwjgl/opengl/LinuxDisplay.java | 4 -- .../lwjgl/opengl/MacOSXCanvasListener.java | 11 ++++ src/java/org/lwjgl/opengl/MacOSXDisplay.java | 12 ++--- src/java/org/lwjgl/opengl/MacOSXFrame.java | 2 +- src/java/org/lwjgl/opengl/WindowsDisplay.java | 4 -- 7 files changed, 63 insertions(+), 28 deletions(-) diff --git a/src/java/org/lwjgl/opengl/Display.java b/src/java/org/lwjgl/opengl/Display.java index 319a2dd4..cd6a2507 100644 --- a/src/java/org/lwjgl/opengl/Display.java +++ b/src/java/org/lwjgl/opengl/Display.java @@ -93,6 +93,12 @@ public final class Display { * unlike GL, where it is typically at the bottom of the display. */ private static int y = -1; + + /** the width of the Display window */ + private static int width = 0; + + /** the height of the Display window */ + private static int height = 0; /** Title of the window (never null) */ private static String title = "Game"; @@ -109,6 +115,10 @@ public final class Display { private static boolean window_created; private static boolean parent_resized; + + private static boolean window_resized; + + private static boolean window_resizable; /** Initial Background Color of Display */ private static float r, g, b; @@ -295,6 +305,9 @@ public final class Display { DisplayMode mode = getEffectiveMode(); display_impl.createWindow(drawable, mode, tmp_parent, getWindowX(), getWindowY()); window_created = true; + + width = Display.getDisplayMode().getWidth(); + height = Display.getDisplayMode().getHeight(); setTitle(title); initControls(); @@ -661,6 +674,13 @@ public final class Display { throw new RuntimeException(e); } } + + window_resized = !isFullscreen() && parent == null && display_impl.wasResized(); + + if ( window_resized ) { + width = display_impl.getWidth(); + height = display_impl.getHeight(); + } if ( parent_resized ) { reshape(); @@ -1257,14 +1277,17 @@ public final class Display { * false to disable resizing on the Display window. */ public static void setResizable(boolean resizable) { - + window_resizable = resizable; + if ( isCreated() ) { + display_impl.setResizable(resizable); + } } /** * @return true if the Display window is resizable. */ public static boolean isResizable() { - return false; + return window_resizable; } /** @@ -1274,7 +1297,7 @@ public final class Display { * This will return false if running in fullscreen or with Display.setParent(Canvas parent) */ public static boolean wasResized() { - return false; + return window_resized; } /** @@ -1287,7 +1310,16 @@ public final class Display { * This value will be updated after a call to Display.update(). */ public static int getWidth() { - return 0; + + if (Display.isFullscreen()) { + return Display.getDisplayMode().getWidth(); + } + + if (parent != null) { + return parent.getWidth(); + } + + return width; } /** @@ -1300,6 +1332,15 @@ public final class Display { * This value will be updated after a call to Display.update(). */ public static int getHeight() { - return 0; + + if (Display.isFullscreen()) { + return Display.getDisplayMode().getHeight(); + } + + if (parent != null) { + return parent.getHeight(); + } + + return height; } } diff --git a/src/java/org/lwjgl/opengl/DisplayImplementation.java b/src/java/org/lwjgl/opengl/DisplayImplementation.java index 84360dea..51fc066e 100644 --- a/src/java/org/lwjgl/opengl/DisplayImplementation.java +++ b/src/java/org/lwjgl/opengl/DisplayImplementation.java @@ -169,12 +169,7 @@ interface DisplayImplementation extends InputImplementation { void setResizable(boolean resizable); /** - * @return true if the Display window is resizable. - */ - boolean isResizable(); - - /** - * @return true if the Display window has been resized. + * @return true if the Display window has been resized since this method was last called. */ boolean wasResized(); diff --git a/src/java/org/lwjgl/opengl/LinuxDisplay.java b/src/java/org/lwjgl/opengl/LinuxDisplay.java index 6f40d257..5165beb6 100644 --- a/src/java/org/lwjgl/opengl/LinuxDisplay.java +++ b/src/java/org/lwjgl/opengl/LinuxDisplay.java @@ -1361,10 +1361,6 @@ final class LinuxDisplay implements DisplayImplementation { } - public boolean isResizable() { - return false; - } - public boolean wasResized() { return false; } diff --git a/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java b/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java index c0111bf6..405aa972 100644 --- a/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java +++ b/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java @@ -47,6 +47,7 @@ final class MacOSXCanvasListener implements ComponentListener, HierarchyListener private int width; private int height; private boolean context_update; + private boolean resized; MacOSXCanvasListener(Canvas canvas) { this.canvas = canvas; @@ -102,6 +103,7 @@ final class MacOSXCanvasListener implements ComponentListener, HierarchyListener public void componentResized(ComponentEvent e) { setUpdate(); + resized = true; } public void componentMoved(ComponentEvent e) { @@ -111,4 +113,13 @@ final class MacOSXCanvasListener implements ComponentListener, HierarchyListener public void hierarchyChanged(HierarchyEvent e) { setUpdate(); } + + public boolean wasResized() { + if (resized) { + resized = false; + return true; + } + + return false; + } } diff --git a/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/src/java/org/lwjgl/opengl/MacOSXDisplay.java index 6c59c0e0..3a3f5f80 100644 --- a/src/java/org/lwjgl/opengl/MacOSXDisplay.java +++ b/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -497,11 +497,11 @@ final class MacOSXDisplay implements DisplayImplementation { } public int getWidth() { - return Display.getDisplayMode().getWidth(); + return frame.getWidth(); } public int getHeight() { - return Display.getDisplayMode().getHeight(); + return frame.getHeight(); } public boolean isInsideWindow() { @@ -509,15 +509,11 @@ final class MacOSXDisplay implements DisplayImplementation { } public void setResizable(boolean resizable) { - - } - - public boolean isResizable() { - return false; + frame.setResizable(resizable); } public boolean wasResized() { - return false; + return canvas_listener.wasResized(); } } diff --git a/src/java/org/lwjgl/opengl/MacOSXFrame.java b/src/java/org/lwjgl/opengl/MacOSXFrame.java index 502b16c9..fea96962 100644 --- a/src/java/org/lwjgl/opengl/MacOSXFrame.java +++ b/src/java/org/lwjgl/opengl/MacOSXFrame.java @@ -68,7 +68,7 @@ final class MacOSXFrame extends Frame implements WindowListener, ComponentListen private boolean should_release_cursor; MacOSXFrame(DisplayMode mode, final java.awt.DisplayMode requested_mode, boolean fullscreen, int x, int y) throws LWJGLException { - setResizable(false); + setResizable(Display.isResizable()); addWindowListener(this); addComponentListener(this); canvas = new MacOSXGLCanvas(); diff --git a/src/java/org/lwjgl/opengl/WindowsDisplay.java b/src/java/org/lwjgl/opengl/WindowsDisplay.java index 1c554a2a..043b76b9 100644 --- a/src/java/org/lwjgl/opengl/WindowsDisplay.java +++ b/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -945,10 +945,6 @@ final class WindowsDisplay implements DisplayImplementation { } - public boolean isResizable() { - return false; - } - public boolean wasResized() { return false; }