diff --git a/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java b/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java new file mode 100644 index 00000000..00628ca5 --- /dev/null +++ b/src/java/org/lwjgl/opengl/MacOSXCanvasListener.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2002-2004 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.lwjgl.opengl; + +/** + * The AWT compatible Canvas for Mac OS X. + * @author elias_naur + */ + +import java.awt.Canvas; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; + +final class MacOSXCanvasListener implements ComponentListener, HierarchyListener { + private final Canvas canvas; + private int width; + private int height; + private boolean context_update; + + public MacOSXCanvasListener(Canvas canvas) { + this.canvas = canvas; +// ((MacOSXDisplay)Display.getImplementation()).setView(this); + } + + public void enableListeners() { + canvas.addComponentListener(this); + canvas.addHierarchyListener(this); + setUpdate(); + } + + public void disableListeners() { + canvas.removeComponentListener(this); + canvas.removeHierarchyListener(this); + } + + public boolean syncShouldUpdateContext() { + boolean should_update; + synchronized ( this ) { + should_update = context_update; + context_update = false; + } + return should_update; + } + + private synchronized void setUpdate() { + synchronized ( this ) { + width = canvas.getWidth(); + height = canvas.getHeight(); + context_update = true; + } + } + + public int syncGetWidth() { + synchronized ( this ) { + return width; + } + } + + public int syncGetHeight() { + synchronized ( this ) { + return height; + } + } + + public void componentShown(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + setUpdate(); + } + + public void componentMoved(ComponentEvent e) { + setUpdate(); + } + + public void hierarchyChanged(HierarchyEvent e) { + setUpdate(); + } +} diff --git a/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/src/java/org/lwjgl/opengl/MacOSXDisplay.java index 9bac3f6c..494e348f 100644 --- a/src/java/org/lwjgl/opengl/MacOSXDisplay.java +++ b/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -61,6 +61,7 @@ final class MacOSXDisplay implements DisplayImplementation { private static final int PBUFFER_HANDLE_SIZE = 24; private static final int GAMMA_LENGTH = 256; + private MacOSXCanvasListener canvas_listener; private MacOSXFrame frame; private Robot robot; private MacOSXMouseEventQueue mouse_queue; @@ -79,6 +80,8 @@ final class MacOSXDisplay implements DisplayImplementation { close_requested = false; try { frame = new MacOSXFrame(mode, requested_mode, fullscreen, x, y); + canvas_listener = new MacOSXCanvasListener(frame.getCanvas()); + canvas_listener.enableListeners(); robot = AWTUtil.createRobot(frame); } catch (LWJGLException e) { destroyWindow(); @@ -93,6 +96,10 @@ final class MacOSXDisplay implements DisplayImplementation { } public void destroyWindow() { + if (canvas_listener != null) { + canvas_listener.disableListeners(); + canvas_listener = null; + } if (frame != null) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { @@ -216,7 +223,7 @@ final class MacOSXDisplay implements DisplayImplementation { private final static IntBuffer current_viewport = BufferUtils.createIntBuffer(16); public void update() { - boolean should_update = frame.getCanvas().syncShouldUpdateContext(); + boolean should_update = canvas_listener.syncShouldUpdateContext(); /* * Workaround for the "white screen in fullscreen mode" problem * diff --git a/src/java/org/lwjgl/opengl/MacOSXFrame.java b/src/java/org/lwjgl/opengl/MacOSXFrame.java index 21ea781b..3109d53f 100644 --- a/src/java/org/lwjgl/opengl/MacOSXFrame.java +++ b/src/java/org/lwjgl/opengl/MacOSXFrame.java @@ -101,7 +101,6 @@ final class MacOSXFrame extends Frame implements WindowListener, ComponentListen setVisible(true); requestFocus(); canvas.requestFocus(); - canvas.initializeCanvas(); updateBounds(); } diff --git a/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java b/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java index 1fc6765b..6a0fcfb2 100644 --- a/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java +++ b/src/java/org/lwjgl/opengl/MacOSXGLCanvas.java @@ -45,13 +45,10 @@ import java.awt.event.ComponentListener; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; -final class MacOSXGLCanvas extends Canvas implements ComponentListener, HierarchyListener { +final class MacOSXGLCanvas extends Canvas { private static final long serialVersionUID = 6916664741667434870L; - private int width; - private int height; - private boolean context_update; private boolean canvas_painted; private boolean dirty; @@ -71,12 +68,6 @@ final class MacOSXGLCanvas extends Canvas implements ComponentListener, Hierarch */ public void initializeCanvas() { setFocusTraversalKeysEnabled(false); - /* Input methods are not enabled in fullscreen anyway, so disable always */ - enableInputMethods(false); - addComponentListener(this); - addHierarchyListener(this); -// ((MacOSXDisplay)Display.getImplementation()).setView(this); - setUpdate(); } public boolean syncCanvasPainted() { @@ -96,76 +87,4 @@ final class MacOSXGLCanvas extends Canvas implements ComponentListener, Hierarch } return result; } - - public boolean syncShouldUpdateContext() { - boolean should_update; - synchronized ( this ) { - should_update = context_update; - context_update = false; - } - return should_update; - } - - private synchronized void setUpdate() { - synchronized ( this ) { - width = getWidth(); - height = getHeight(); - context_update = true; - } - } - - public int syncGetWidth() { - synchronized ( this ) { - return width; - } - } - - public int syncGetHeight() { - synchronized ( this ) { - return height; - } - } - - public void componentShown(ComponentEvent e) { - } - - public void componentHidden(ComponentEvent e) { - } - - public void componentResized(ComponentEvent e) { - setUpdate(); - } - - public void componentMoved(ComponentEvent e) { - setUpdate(); - } - - public void setLocation(int x, int y) { - super.setLocation(x, y); - setUpdate(); - } - - public void setLocation(Point p) { - super.setLocation(p); - setUpdate(); - } - - public void setSize(Dimension d) { - super.setSize(d); - setUpdate(); - } - - public void setSize(int width, int height) { - super.setSize(width, height); - setUpdate(); - } - - public void setBounds(int x, int y, int width, int height) { - super.setBounds(x, y, width, height); - setUpdate(); - } - - public void hierarchyChanged(HierarchyEvent e) { - setUpdate(); - } }