From e6225fce71daa90a2a2b631550ba048c2a84ff25 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 27 Oct 2010 16:39:20 +0200 Subject: 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 --- .../com/jogamp/opengl/impl/GLDrawableHelper.java | 38 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'src/jogl/classes/com') 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.
+ *
+ * Remark: In case this method is called to dispose the GLDrawable/GLAutoDrawable, + * initAction shall be null to mark this cause.
+ * 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(); -- cgit v1.2.3