diff options
author | Sven Gothel <[email protected]> | 2013-04-13 08:15:21 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-04-13 08:15:21 +0200 |
commit | 9d78ea65a6bf1064887bc7524c01a689a1fc2a5c (patch) | |
tree | fdd85fcce8cc5d55898b93ee13a25779b4cda215 /src/newt | |
parent | 5606dd12f8086b506f33030072af5095a5871f9c (diff) |
NEWT/AWT: Fix 'AWT driver' to work w/ OSX CALayer ; WindowImpl: 'Object getWrappedWindow()' -> 'NativeSurface getWrappedSurface()'
WindowImpl: 'Object getWrappedWindow()' -> 'NativeSurface getWrappedSurface()'
- AWT driver itself instantiates the JAWTWindow for eager initialization at createNative().
Fix 'AWT driver' to work w/ OSX CALayer
- See above
- size reconfig changed to ease OSX CALayer,
i.e. set frame's size if already visible reducing CALayer artefacts.
Diffstat (limited to 'src/newt')
-rw-r--r-- | src/newt/classes/com/jogamp/newt/opengl/GLWindow.java | 14 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/WindowImpl.java | 10 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java | 42 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/awt/WindowDriver.java | 101 |
4 files changed, 111 insertions, 56 deletions
diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java index a6c655915..de62747be 100644 --- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java +++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java @@ -40,7 +40,6 @@ import javax.media.nativewindow.CapabilitiesImmutable; import javax.media.nativewindow.NativeSurface; import javax.media.nativewindow.NativeWindow; import javax.media.nativewindow.NativeWindowException; -import javax.media.nativewindow.NativeWindowFactory; import javax.media.nativewindow.SurfaceUpdatedListener; import javax.media.nativewindow.util.InsetsImmutable; import javax.media.nativewindow.util.Point; @@ -472,17 +471,16 @@ public class GLWindow extends GLAutoDrawableBase implements GLAutoDrawable, Wind if( ( null != context ) ) { throw new InternalError("GLWindow.LifecycleHook.setVisiblePost: "+WindowImpl.getThreadName()+" - Null drawable, but valid context - "+GLWindow.this); } - final NativeWindow nw; - if (window.getWrappedWindow() != null) { - nw = NativeWindowFactory.getNativeWindow(window.getWrappedWindow(), window.getPrivateGraphicsConfiguration()); - } else { - nw = window; + final NativeSurface ns; + { + final NativeSurface wrapped_ns = window.getWrappedSurface(); + ns = null != wrapped_ns ? wrapped_ns : window; } - final GLCapabilitiesImmutable glCaps = (GLCapabilitiesImmutable) nw.getGraphicsConfiguration().getChosenCapabilities(); + final GLCapabilitiesImmutable glCaps = (GLCapabilitiesImmutable) ns.getGraphicsConfiguration().getChosenCapabilities(); if(null==factory) { factory = GLDrawableFactory.getFactory(glCaps.getGLProfile()); } - drawable = (GLDrawableImpl) factory.createGLDrawable(nw); + drawable = (GLDrawableImpl) factory.createGLDrawable(ns); drawable.setRealized(true); if( !GLWindow.this.pushGLEventListenerState() ) { diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java index 01a58a305..bfb450f68 100644 --- a/src/newt/classes/jogamp/newt/WindowImpl.java +++ b/src/newt/classes/jogamp/newt/WindowImpl.java @@ -1562,9 +1562,11 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer return old; } - /** If this Window actually wraps one from another toolkit such as - the AWT, this will return a non-null value. */ - public Object getWrappedWindow() { + /** + * If this Window actually wraps a {@link NativeSurface} from another instance or toolkit, + * it will return such reference. Otherwise returns null. + */ + public NativeSurface getWrappedSurface() { return null; } @@ -1598,7 +1600,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer "\n, Visible "+isVisible()+", focus "+hasFocus()+ "\n, Undecorated "+undecorated+" ("+isUndecorated()+")"+ "\n, AlwaysOnTop "+alwaysOnTop+", Fullscreen "+fullscreen+ - "\n, WrappedWindow "+getWrappedWindow()+ + "\n, WrappedSurface "+getWrappedSurface()+ "\n, ChildWindows "+childWindows.size()); sb.append(", SurfaceUpdatedListeners num "+surfaceUpdatedHelper.size()+" ["); diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java b/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java index 17eb6a2fb..85cb655d7 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java +++ b/src/newt/classes/jogamp/newt/driver/awt/AWTCanvas.java @@ -47,13 +47,15 @@ import javax.media.nativewindow.AbstractGraphicsScreen; import javax.media.nativewindow.CapabilitiesChooser; import javax.media.nativewindow.CapabilitiesImmutable; import javax.media.nativewindow.GraphicsConfigurationFactory; +import javax.media.nativewindow.NativeSurface; import javax.media.nativewindow.NativeWindowException; +import javax.media.nativewindow.NativeWindowFactory; import javax.media.nativewindow.VisualIDHolder; - import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration; import com.jogamp.nativewindow.awt.AWTGraphicsDevice; import com.jogamp.nativewindow.awt.AWTGraphicsScreen; +import com.jogamp.nativewindow.awt.JAWTWindow; import com.jogamp.newt.Window; @SuppressWarnings("serial") @@ -61,17 +63,15 @@ public class AWTCanvas extends Canvas { private GraphicsDevice device; private GraphicsConfiguration chosen; private AWTGraphicsConfiguration awtConfig; - - private WindowDriver newtWindowImpl; + private volatile JAWTWindow jawtWindow=null; // the JAWTWindow presentation of this AWT Canvas, bound to the 'drawable' lifecycle private CapabilitiesChooser chooser=null; private CapabilitiesImmutable capabilities; private boolean displayConfigChanged=false; - public AWTCanvas(WindowDriver newtWindowImpl, CapabilitiesImmutable capabilities, CapabilitiesChooser chooser) { + public AWTCanvas(CapabilitiesImmutable capabilities, CapabilitiesChooser chooser) { super(); - this.newtWindowImpl = newtWindowImpl; if(null==capabilities) { throw new NativeWindowException("Capabilities null"); } @@ -89,7 +89,7 @@ public class AWTCanvas extends Canvas { */ @Override public void update(Graphics g) { - paint(g); + // paint(g); } /** Overridden to cause OpenGL rendering to be performed during @@ -99,7 +99,6 @@ public class AWTCanvas extends Canvas { */ @Override public void paint(Graphics g) { - newtWindowImpl.windowRepaint(0, 0, getWidth(), getHeight()); } public boolean hasDeviceChanged() { @@ -120,8 +119,7 @@ public class AWTCanvas extends Canvas { */ awtConfig = chooseGraphicsConfiguration(capabilities, capabilities, chooser, device); if(Window.DEBUG_IMPLEMENTATION) { - Exception e = new Exception("Info: Created Config: "+awtConfig); - e.printStackTrace(); + System.err.println(getThreadName()+": AWTCanvas.addNotify.0: Created Config: "+awtConfig); } if(null==awtConfig) { throw new NativeWindowException("Error: NULL AWTGraphicsConfiguration"); @@ -137,12 +135,27 @@ public class AWTCanvas extends Canvas { // after native peer is valid: Windows disableBackgroundErase(); + { + jawtWindow = (JAWTWindow) NativeWindowFactory.getNativeWindow(this, awtConfig); + // trigger initialization cycle + jawtWindow.lockSurface(); + jawtWindow.unlockSurface(); + } + GraphicsConfiguration gc = super.getGraphicsConfiguration(); if(null!=gc) { device = gc.getDevice(); } + if(Window.DEBUG_IMPLEMENTATION) { + System.err.println(getThreadName()+": AWTCanvas.addNotify.X"); + } } + public NativeSurface getNativeSurface() { + final JAWTWindow _jawtWindow = jawtWindow; + return (null != _jawtWindow) ? _jawtWindow : null; + } + public void removeNotify() { try { dispose(); @@ -152,6 +165,13 @@ public class AWTCanvas extends Canvas { } private void dispose() { + if( null != jawtWindow ) { + jawtWindow.destroy(); + if(Window.DEBUG_IMPLEMENTATION) { + System.err.println(getThreadName()+": AWTCanvas.disposeJAWTWindowAndAWTDeviceOnEDT(): post JAWTWindow: "+jawtWindow); + } + jawtWindow=null; + } if(null != awtConfig) { AbstractGraphicsDevice adevice = awtConfig.getNativeGraphicsConfiguration().getScreen().getDevice(); String adeviceMsg=null; @@ -160,10 +180,12 @@ public class AWTCanvas extends Canvas { } boolean closed = adevice.close(); if(Window.DEBUG_IMPLEMENTATION) { - System.err.println("AWTCanvas.dispose(): closed GraphicsDevice: "+adeviceMsg+", result: "+closed); + System.err.println(getThreadName()+": AWTCanvas.dispose(): closed GraphicsDevice: "+adeviceMsg+", result: "+closed); } } } + + private String getThreadName() { return Thread.currentThread().getName(); } /** * Overridden to choose a GraphicsConfiguration on a parent container's diff --git a/src/newt/classes/jogamp/newt/driver/awt/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/awt/WindowDriver.java index 0172309fb..cc678e4ef 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/WindowDriver.java +++ b/src/newt/classes/jogamp/newt/driver/awt/WindowDriver.java @@ -40,6 +40,7 @@ import java.awt.Dimension; import java.awt.Frame; import java.awt.Insets; +import javax.media.nativewindow.NativeSurface; import javax.media.nativewindow.NativeWindowException; import javax.media.nativewindow.util.Point; @@ -111,31 +112,38 @@ public class WindowDriver extends WindowImpl { } container.setLayout(new BorderLayout()); - canvas = new AWTCanvas(this, capsRequested, WindowDriver.this.capabilitiesChooser); + if( null == canvas ) { + canvas = new AWTCanvas(capsRequested, WindowDriver.this.capabilitiesChooser); - // canvas.addComponentListener(listener); - container.add(canvas, BorderLayout.CENTER); + // canvas.addComponentListener(listener); + container.add(canvas, BorderLayout.CENTER); - // via EDT .. - new AWTMouseAdapter(this).addTo(canvas); // fwd all AWT Mouse events to here - new AWTKeyAdapter(this).addTo(canvas); // fwd all AWT Key events to here + // via EDT .. + new AWTMouseAdapter(this).addTo(canvas); // fwd all AWT Mouse events to here + new AWTKeyAdapter(this).addTo(canvas); // fwd all AWT Key events to here - // direct w/o EDT - new AWTWindowAdapter(new LocalWindowListener(), this).addTo(canvas); // fwd all AWT Window events to here + // direct w/o EDT + new AWTWindowAdapter(new LocalWindowListener(), this).addTo(canvas); // fwd all AWT Window events to here + } reconfigureWindowImpl(getX(), getY(), getWidth(), getHeight(), getReconfigureFlags(FLAG_CHANGE_VISIBILITY | FLAG_CHANGE_DECORATION, true)); // throws exception if failed .. - setWindowHandle(1); // just a marker .. + final NativeSurface ns = canvas.getNativeSurface(); + if( null != ns ) { + setGraphicsConfiguration( canvas.getAWTGraphicsConfiguration() ); + setWindowHandle( ns.getSurfaceHandle() ); + } } protected void closeNativeImpl() { - setWindowHandle(0); // just a marker .. + setWindowHandle(0); if(null!=container) { container.setVisible(false); container.remove(canvas); container.setEnabled(false); canvas.setEnabled(false); + canvas = null; } if(owningFrame && null!=frame) { frame.dispose(); @@ -172,6 +180,10 @@ public class WindowDriver extends WindowImpl { } protected boolean reconfigureWindowImpl(int x, int y, int width, int height, int flags) { + if(DEBUG_IMPLEMENTATION) { + System.err.println("AWTWindow reconfig: "+x+"/"+y+" "+width+"x"+height+", "+ + getReconfigureFlagsAsString(null, flags)); + } if(0 != ( FLAG_CHANGE_DECORATION & flags) && null!=frame) { if(!container.isDisplayable()) { frame.setUndecorated(isUndecorated()); @@ -182,26 +194,44 @@ public class WindowDriver extends WindowImpl { } } - final Dimension szClient = new Dimension(width, height); - canvas.setMinimumSize(szClient); - canvas.setPreferredSize(szClient); - canvas.setSize(szClient); - if(DEBUG_IMPLEMENTATION) { + if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) ) { + if( 0 != ( FLAG_IS_VISIBLE & flags) ) { + final Dimension szClient = new Dimension(width, height); + canvas.setMinimumSize(szClient); + canvas.setPreferredSize(szClient); + if(DEBUG_IMPLEMENTATION) { + final Insets insets = container.getInsets(); + final Dimension szContainer = new Dimension(width + insets.left + insets.right, + height + insets.top + insets.bottom); + System.err.println(getThreadName()+": AWTWindow initial size: szClient "+szClient+", szCont "+szContainer+", insets "+insets); + } + canvas.setSize(szClient); + if(null != frame) { + frame.pack(); + } else { + container.validate(); + } + container.setVisible( true ); + defineSize(width, height); // we are on AWT-EDT .. change values immediately + } else { + container.setVisible( false ); + } + } else if( canvas.getWidth() != width || canvas.getHeight() != height ) { final Insets insets = container.getInsets(); final Dimension szContainer = new Dimension(width + insets.left + insets.right, height + insets.top + insets.bottom); - System.err.println(getThreadName()+": AWTWindow new size: szClient "+szClient+", szCont "+szContainer+", insets "+insets); - } - - if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) ) { - if(null != frame) { - frame.pack(); + if(DEBUG_IMPLEMENTATION) { + final Dimension szClient = new Dimension(width, height); + System.err.println(getThreadName()+": AWTWindow new size: szClient "+szClient+", szCont "+szContainer+", insets "+insets); } - container.validate(); - container.setVisible(0 != ( FLAG_IS_VISIBLE & flags)); + container.setSize(szContainer); + container.validate(); + defineSize(width, height); // we are on AWT-EDT .. change values immediately } - container.setLocation(x, y); + if( container.getX() != x || container.getY() != y ) { + container.setLocation(x, y); + } if( 0 != ( FLAG_CHANGE_VISIBILITY & flags) ) { if( 0 != ( FLAG_IS_VISIBLE & flags ) ) { @@ -215,12 +245,6 @@ public class WindowDriver extends WindowImpl { } } visibleChanged(false, 0 != ( FLAG_IS_VISIBLE & flags)); - } else { - container.invalidate(); - if(null != frame) { - frame.pack(); - } - container.validate(); } return true; @@ -233,8 +257,8 @@ public class WindowDriver extends WindowImpl { } @Override - public Object getWrappedWindow() { - return canvas; + public NativeSurface getWrappedSurface() { + return ( null != canvas ) ? canvas.getNativeSurface() : null; } class LocalWindowListener implements com.jogamp.newt.event.WindowListener { @@ -247,7 +271,11 @@ public class WindowDriver extends WindowImpl { @Override public void windowResized(com.jogamp.newt.event.WindowEvent e) { if(null!=canvas) { - WindowDriver.this.sizeChanged(false, canvas.getWidth(), canvas.getHeight(), false); + if(DEBUG_IMPLEMENTATION) { + System.err.println("Window Resized: "+canvas); + } + WindowDriver.this.sizeChanged(false, canvas.getWidth(), canvas.getHeight(), true); + WindowDriver.this.windowRepaint(false, 0, 0, getWidth(), getHeight()); } } @Override @@ -268,7 +296,12 @@ public class WindowDriver extends WindowImpl { } @Override public void windowRepaint(WindowUpdateEvent e) { - WindowDriver.this.windowRepaint(false, 0, 0, getWidth(), getHeight()); + if(null!=canvas) { + if(DEBUG_IMPLEMENTATION) { + System.err.println("Window Repaint: "+canvas); + } + WindowDriver.this.windowRepaint(false, 0, 0, getWidth(), getHeight()); + } } } } |