From d0f91a8ed17fbb1a7b56511c4e53a29e576f01af Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 8 Nov 2012 18:07:19 +0100
Subject: Fix GLAutoDrawable.dispose(): Dispose drawable even w/o context;
 JAWTWindow.lockSurface(): Check AWT component's native peer

- Fix GLAutoDrawable.dispose(): Dispose drawable even w/o context
  - It is possible to have the GLContext not being created (not made current),
    so drawable shall be disposed independent.

  - Merge Runnable 'postDisposeOnEDTAction' to dispose Runnable for clarity

  - GLDrawableHelper: Split disposeGL from invokeGLImpl for clarity

- JAWTWindow.lockSurface(): Check AWT component's native peer
  - W/o a native peer (!isDisplayable()), JAWT locking cannot succeed.

  - On OSX OpenJDK 1.7, attempting to JAWT lock a peer-less component crashes the VM

  - MacOSXJAWTWindow.lockSurfaceImpl(): Remove redundant null checks
---
 .../classes/jogamp/opengl/GLAutoDrawableBase.java  | 33 +++++++++++-----------
 1 file changed, 16 insertions(+), 17 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java')

diff --git a/src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java b/src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java
index 7bcd37ecd..68fbe3dd5 100644
--- a/src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java
+++ b/src/jogl/classes/jogamp/opengl/GLAutoDrawableBase.java
@@ -223,27 +223,26 @@ public abstract class GLAutoDrawableBase implements GLAutoDrawable, FPSCounter {
      * In such case call <code>super.destroyImplInLock</code> first.</p>
      */
     protected void destroyImplInLock() {
-        final GLContext _context = context;
-        final GLDrawable _drawable = drawable;
-        if( null != _drawable ) {
-            if( _drawable.isRealized() ) {
-                if( null != _context && _context.isCreated() ) {
-                    // Catch dispose GLExceptions by GLEventListener, just 'print' them
-                    // so we can continue with the destruction.
-                    try {
-                        helper.disposeGL(this, _drawable, _context, null);
-                    } catch (GLException gle) {
-                        gle.printStackTrace();
-                    }
+        if( null != context ) {
+            if( context.isCreated() ) {        
+                // Catch dispose GLExceptions by GLEventListener, just 'print' them
+                // so we can continue with the destruction.
+                try {
+                    helper.disposeGL(this, context);
+                } catch (GLException gle) {
+                    gle.printStackTrace();
                 }
-                _drawable.setRealized(false);
             }
+            context = null;
+        }
+        if( null != drawable ) {
+            final AbstractGraphicsDevice device = drawable.getNativeSurface().getGraphicsConfiguration().getScreen().getDevice();
+            drawable.setRealized(false);
+            drawable = null;
             if( ownsDevice ) {
-                _drawable.getNativeSurface().getGraphicsConfiguration().getScreen().getDevice().close();
+                device.close();
             }
-        }
-        context = null;
-        drawable = null;        
+        }        
     }
     
     public final void defaultSwapBuffers() throws GLException {
-- 
cgit v1.2.3