diff options
author | Sven Gothel <[email protected]> | 2010-10-27 16:39:20 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-10-27 16:39:20 +0200 |
commit | e6225fce71daa90a2a2b631550ba048c2a84ff25 (patch) | |
tree | 863985817e72b5b9fc855de3be4f2154fa86dedf /src/jogl/classes/com | |
parent | e6131c6b2cbf8d1e5a05f0343612f5083b55aaa9 (diff) |
WindowImpl/GLWindow LifecycleHook:
- 'destroyAction' -> 'destroyActionPreLock' 'destroyActionInLock',
to be able to stop animation before locking.
GLDrawableHelper.invokeGL() dispose case (initAction == null):
- pause animator if animating before makeCurrent (locking)
GLCanvas/GLJPanel dispose: recreate case
- resume animator if was animating
Diffstat (limited to 'src/jogl/classes/com')
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/impl/GLDrawableHelper.java | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableHelper.java b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableHelper.java index c8cfd9a01..e8df40b13 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableHelper.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/GLDrawableHelper.java @@ -131,6 +131,11 @@ public class GLDrawableHelper { } } + /** + * Issues {@link javax.media.opengl.GLEventListener#dispose(javax.media.opengl.GLAutoDrawable)} + * to all listeners. + * @param drawable + */ public final void dispose(GLAutoDrawable drawable) { synchronized(listenersLock) { listenersIter = true; @@ -283,12 +288,24 @@ public class GLDrawableHelper { } private static final ThreadLocal perThreadInitAction = new ThreadLocal(); + /** Principal helper method which runs a Runnable with the context made current. This could have been made part of GLContext, but a - desired goal is to be able to implement the GLCanvas in terms of + desired goal is to be able to implement GLAutoDrawable's in terms of the GLContext's public APIs, and putting it into a separate class helps ensure that we don't inadvertently use private - methods of the GLContext or its implementing classes. */ + methods of the GLContext or its implementing classes.<br> + * <br> + * Remark: In case this method is called to dispose the GLDrawable/GLAutoDrawable, + * <code>initAction</code> shall be <code>null</code> to mark this cause.<br> + * In this case, the locally delegated {@link javax.media.opengl.GLAnimatorControl} via {@link #setAnimator(javax.media.opengl.GLAnimatorControl) setAnimator(animatorControl)} + * is paused first, if {@link javax.media.opengl.GLAnimatorControl#isAnimating()}. + * + * @param drawable + * @param context + * @param runnable + * @param initAction + */ public final void invokeGL(GLDrawable drawable, GLContext context, Runnable runnable, @@ -300,6 +317,20 @@ public class GLDrawableHelper { } return; } + + if(null==initAction) { + // disposal case + + if(!context.isCreated()) { + throw new GLException("Dispose case (no init action given): Native context must be created: "+context); + } + + GLAnimatorControl animCtrl = getAnimator(); + if(null!=animCtrl && animCtrl.isAnimating()) { + animCtrl.pause(); + } + } + // Support for recursive makeCurrent() calls as well as calling // other drawables' display() methods from within another one's GLContext lastContext = GLContext.getCurrent(); @@ -308,9 +339,6 @@ public class GLDrawableHelper { lastContext.release(); } - if(!context.isCreated() && null == initAction) { - throw new GLException("Context has to be created, but no initAction is given: "+context); - } int res = 0; try { res = context.makeCurrent(); |