From 302f183c4a659be9cedb5b6993ff78e7379d9cad Mon Sep 17 00:00:00 2001
From: Sven Gothel
+ * Warning: We cannot verify if the caller runs in the same thread
+ * as the display caller, hence we cannot avoid a deadlock
+ * in such case. You have to know what you are doing,
+ * ie call this only in a I/O event listener, or such. Causes OpenGL rendering to be performed for this GLAutoDrawable
+ in the following order:
+
+
+ * @param index Position where the listener will be inserted.
+ * Should be within (0 <= index && index <= size()).
+ * An index value of -1 is interpreted as the end of the list, size().
+ * @param l The listener object to be inserted
+ * @throws IndexOutOfBoundsException If the index is not within (0 <= index && index <= size()), or -1
+ */
+ public void addMouseListener(int index, MouseListener l) {
if(l == null) {
return;
}
synchronized(mouseListeners) {
+ if(0>index) {
+ index = mouseListeners.size();
+ }
ArrayList newMouseListeners = (ArrayList) mouseListeners.clone();
- newMouseListeners.add(l);
+ newMouseListeners.add(index, l);
mouseListeners = newMouseListeners;
}
}
@@ -1110,6 +1164,15 @@ public abstract class Window implements NativeWindow
}
}
+ public MouseListener getWindowListener(int index) {
+ synchronized(mouseListeners) {
+ if(0>index) {
+ index = mouseListeners.size()-1;
+ }
+ return (MouseListener) mouseListeners.get(index);
+ }
+ }
+
public MouseListener[] getMouseListeners() {
synchronized(mouseListeners) {
return (MouseListener[]) mouseListeners.toArray();
@@ -1168,13 +1231,34 @@ public abstract class Window implements NativeWindow
modifiers, keyCode, keyChar) );
}
+ /**
+ * Appends the given {@link com.jogamp.newt.event.KeyListener} to the end of
+ * the list.
+ */
public void addKeyListener(KeyListener l) {
+ getInnerWindow().addKeyListener(-1, l);
+ }
+
+ /**
+ * Inserts the given {@link com.jogamp.newt.event.KeyListener} at the
+ * specified position in the list.
+
+ * @param index Position where the listener will be inserted.
+ * Should be within (0 <= index && index <= size()).
+ * An index value of -1 is interpreted as the end of the list, size().
+ * @param l The listener object to be inserted
+ * @throws IndexOutOfBoundsException If the index is not within (0 <= index && index <= size()), or -1
+ */
+ public void addKeyListener(int index, KeyListener l) {
if(l == null) {
return;
}
synchronized(keyListeners) {
+ if(0>index) {
+ index = keyListeners.size();
+ }
ArrayList newKeyListeners = (ArrayList) keyListeners.clone();
- newKeyListeners.add(l);
+ newKeyListeners.add(index, l);
keyListeners = newKeyListeners;
}
}
@@ -1190,6 +1274,15 @@ public abstract class Window implements NativeWindow
}
}
+ public KeyListener getKeyListener(int index) {
+ synchronized(keyListeners) {
+ if(0>index) {
+ index = keyListeners.size()-1;
+ }
+ return (KeyListener) keyListeners.get(index);
+ }
+ }
+
public KeyListener[] getKeyListeners() {
synchronized(keyListeners) {
return (KeyListener[]) keyListeners.toArray();
@@ -1235,13 +1328,36 @@ public abstract class Window implements NativeWindow
private ArrayList windowListeners = new ArrayList();
+ /**
+ * Appends the given {@link com.jogamp.newt.event.WindowListener} to the end of
+ * the list.
+ */
public void addWindowListener(WindowListener l) {
+ getInnerWindow().addWindowListener(-1, l);
+ }
+
+ /**
+ * Inserts the given {@link com.jogamp.newt.event.WindowListener} at the
+ * specified position in the list.
+
+ * @param index Position where the listener will be inserted.
+ * Should be within (0 <= index && index <= size()).
+ * An index value of -1 is interpreted as the end of the list, size().
+ * @param l The listener object to be inserted
+ * @throws IndexOutOfBoundsException If the index is not within (0 <= index && index <= size()), or -1
+ */
+ public void addWindowListener(int index, WindowListener l)
+ throws IndexOutOfBoundsException
+ {
if(l == null) {
return;
}
synchronized(windowListeners) {
+ if(0>index) {
+ index = windowListeners.size();
+ }
ArrayList newWindowListeners = (ArrayList) windowListeners.clone();
- newWindowListeners.add(l);
+ newWindowListeners.add(index, l);
windowListeners = newWindowListeners;
}
}
@@ -1257,6 +1373,15 @@ public abstract class Window implements NativeWindow
}
}
+ public WindowListener getWindowListener(int index) {
+ synchronized(windowListeners) {
+ if(0>index) {
+ index = windowListeners.size()-1;
+ }
+ return (WindowListener) windowListeners.get(index);
+ }
+ }
+
public WindowListener[] getWindowListeners() {
synchronized(windowListeners) {
return (WindowListener[]) windowListeners.toArray();
@@ -1304,13 +1429,34 @@ public abstract class Window implements NativeWindow
private ArrayList paintListeners = new ArrayList();
+ /**
+ * Appends the given {@link com.jogamp.newt.event.PaintListener} to the end of
+ * the list.
+ */
public void addPaintListener(PaintListener l) {
+ getInnerWindow().addPaintListener(-1, l);
+ }
+
+ /**
+ * Inserts the given {@link com.jogamp.newt.event.PaintListener} at the
+ * specified position in the list.
+
+ * @param index Position where the listener will be inserted.
+ * Should be within (0 <= index && index <= size()).
+ * An index value of -1 is interpreted as the end of the list, size().
+ * @param l The listener object to be inserted
+ * @throws IndexOutOfBoundsException If the index is not within (0 <= index && index <= size()), or -1
+ */
+ public void addPaintListener(int index, PaintListener l) {
if(l == null) {
return;
}
synchronized(paintListeners) {
+ if(0>index) {
+ index = paintListeners.size();
+ }
ArrayList newPaintListeners = (ArrayList) paintListeners.clone();
- newPaintListeners.add(l);
+ newPaintListeners.add(index, l);
paintListeners = newPaintListeners;
}
}
@@ -1326,6 +1472,15 @@ public abstract class Window implements NativeWindow
}
}
+ public PaintListener getPaintListener(int index) {
+ synchronized(paintListeners) {
+ if(0>index) {
+ index = paintListeners.size()-1;
+ }
+ return (PaintListener) paintListeners.get(index);
+ }
+ }
+
protected void sendPaintEvent(int eventType, int x, int y, int w, int h) {
sendPaintEvent( new PaintEvent(eventType, this, System.currentTimeMillis(), x, y, w, h) );
}
diff --git a/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java b/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
index 1be3dcb3f..2cb2c5177 100644
--- a/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
+++ b/src/newt/classes/com/jogamp/newt/event/NEWTEvent.java
@@ -45,6 +45,7 @@ public class NEWTEvent extends java.util.EventObject {
private boolean isSystemEvent;
private int eventType;
private long when;
+ private Object attachment;
static final boolean DEBUG = false;
@@ -105,6 +106,7 @@ public class NEWTEvent extends java.util.EventObject {
this.isSystemEvent = evaluateIsSystemEvent(this, new Throwable());
this.eventType = eventType;
this.when = when;
+ this.attachment=null;
}
/** Indicates whether this event was produced by the system or
@@ -123,6 +125,25 @@ public class NEWTEvent extends java.util.EventObject {
return when;
}
+ /**
+ * Attach the passed object to this event.
+ * If an object was previously attached, it will replaced.
+ * Attachments to NEWT events allow users to pass on information
+ * from one custom listener to another, ie custom listener to listener
+ * communication.
+ * @param attachment User application specific object
+ */
+ public final void setAttachment(Object attachment) {
+ this.attachment=attachment;
+ }
+
+ /**
+ * @return The user application specific attachment, or null
+ */
+ public final Object getAttachment() {
+ return attachment;
+ }
+
public String toString() {
return "NEWTEvent[sys:"+isSystemEvent()+", source:"+getSource().getClass().getName()+", when:"+getWhen()+" d "+(System.currentTimeMillis()-getWhen())+"ms]";
}
diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
index 7a223026e..1807201a4 100644
--- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
+++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
@@ -373,8 +373,8 @@ public class GLWindow extends Window implements GLAutoDrawable {
window.sendEvent(e);
}
- public void addSurfaceUpdatedListener(SurfaceUpdatedListener l) {
- window.addSurfaceUpdatedListener(l);
+ public void addSurfaceUpdatedListener(int index, SurfaceUpdatedListener l) {
+ window.addSurfaceUpdatedListener(index, l);
}
public void removeSurfaceUpdatedListener(SurfaceUpdatedListener l) {
window.removeSurfaceUpdatedListener(l);
@@ -382,45 +382,51 @@ public class GLWindow extends Window implements GLAutoDrawable {
public void removeAllSurfaceUpdatedListener() {
window.removeAllSurfaceUpdatedListener();
}
- public SurfaceUpdatedListener[] getSurfaceUpdatedListener() {
- return window.getSurfaceUpdatedListener();
+ public SurfaceUpdatedListener getSurfaceUpdatedListener(int index) {
+ return window.getSurfaceUpdatedListener(index);
+ }
+ public SurfaceUpdatedListener[] getSurfaceUpdatedListeners() {
+ return window.getSurfaceUpdatedListeners();
}
public void surfaceUpdated(Object updater, NativeWindow window0, long when) {
window.surfaceUpdated(updater, window, when);
}
- public void addMouseListener(MouseListener l) {
- window.addMouseListener(l);
+ public void addMouseListener(int index, MouseListener l) {
+ window.addMouseListener(index, l);
}
-
public void removeMouseListener(MouseListener l) {
window.removeMouseListener(l);
}
-
+ public MouseListener getMouseListener(int index) {
+ return window.getMouseListener(index);
+ }
public MouseListener[] getMouseListeners() {
return window.getMouseListeners();
}
- public void addKeyListener(KeyListener l) {
- window.addKeyListener(l);
+ public void addKeyListener(int index, KeyListener l) {
+ window.addKeyListener(index, l);
}
-
public void removeKeyListener(KeyListener l) {
window.removeKeyListener(l);
}
-
+ public KeyListener getKeyListener(int index) {
+ return window.getKeyListener(index);
+ }
public KeyListener[] getKeyListeners() {
return window.getKeyListeners();
}
- public void addWindowListener(WindowListener l) {
- window.addWindowListener(l);
+ public void addWindowListener(int index, WindowListener l) {
+ window.addWindowListener(index, l);
}
-
public void removeWindowListener(WindowListener l) {
window.removeWindowListener(l);
}
-
+ public WindowListener getWindowListener(int index) {
+ return window.getWindowListener(index);
+ }
public WindowListener[] getWindowListeners() {
return window.getWindowListeners();
}
@@ -473,6 +479,10 @@ public class GLWindow extends Window implements GLAutoDrawable {
helper.addGLEventListener(listener);
}
+ public void addGLEventListener(int index, GLEventListener listener) {
+ helper.addGLEventListener(index, listener);
+ }
+
public void removeGLEventListener(GLEventListener listener) {
helper.removeGLEventListener(listener);
}
--
cgit v1.2.3
From c0ece5ebd634662f99f3217bb749e2c4795f9de6 Mon Sep 17 00:00:00 2001
From: Sven Gothel invokeAndWait()
semantics.
+ */
+public class GLRunnableTask implements GLRunnable {
+ GLRunnable runnable;
+ Object notifyObject;
+
+ Throwable runnableException;
+
+ public GLRunnableTask(GLRunnable runnable, Object notifyObject) {
+ this.runnable = runnable ;
+ this.notifyObject = notifyObject ;
+ }
+
+ public void run(GLAutoDrawable drawable) {
+ try {
+ runnable.run(drawable);
+ } catch (Throwable t) {
+ runnableException = t;
+ }
+ if(null != notifyObject) {
+ synchronized (notifyObject) {
+ notifyObject.notifyAll();
+ }
+ }
+ }
+
+ public Throwable getThrowable() { return runnableException; }
+}
+
diff --git a/src/jogl/classes/javax/media/opengl/GLAutoDrawable.java b/src/jogl/classes/javax/media/opengl/GLAutoDrawable.java
index 7342369d9..7236aa533 100644
--- a/src/jogl/classes/javax/media/opengl/GLAutoDrawable.java
+++ b/src/jogl/classes/javax/media/opengl/GLAutoDrawable.java
@@ -138,11 +138,22 @@ public interface GLAutoDrawable extends GLDrawable {
*/
public void setContext(GLContext context);
- /** Adds a {@link GLEventListener} to this drawable. If multiple
- listeners are added to a given drawable, they are notified of
- events in an arbitrary order. */
+ /** Adds a {@link GLEventListener} to the end of this drawable queue.
+ The listeners are notified of events in the order of the queue. */
public void addGLEventListener(GLEventListener listener);
+ /**
+ * Adds a {@link GLEventListener} at the given index of this drawable queue.
+ * The listeners are notified of events in the order of the queue.
+ * @param index Position where the listener will be inserted.
+ * Should be within (0 <= index && index <= size()).
+ * An index value of -1 is interpreted as the end of the list, size().
+ * @param listener The GLEventListener object to be inserted
+ * @throws IndexOutOfBoundsException If the index is not within (0 <= index && index <= size()), or -1
+ */
+ public void addGLEventListener(int index, GLEventListener listener)
+ throws IndexOutOfBoundsException;
+
/** Removes a {@link GLEventListener} from this drawable. Note that
if this is done from within a particular drawable's {@link
GLEventListener} handler (reshape, display, etc.) that it is not
@@ -150,6 +161,19 @@ public interface GLAutoDrawable extends GLDrawable {
during this update cycle. */
public void removeGLEventListener(GLEventListener listener);
+ /**
+ * Enqueues the one-shot {@link javax.media.opengl.GLRunnable} into the queue,
+ * which will be executed at the next {@link #display()} call.
+ *
+
+ Called automatically by the + window system toolkit upon receiving a repaint() request.
++ This routine may be called manually for better control over the rendering process. It is legal to call another GLAutoDrawable's display method from within the {@link GLEventListener#display - display(..)} callback.
+ display(..)} callback.
+In case of a new generated OpenGL context, the implementation shall call {@link GLEventListener#init init(..)} for all registered {@link GLEventListener}s before making the actual {@link GLEventListener#display display(..)} calls, - in case this has not been done yet.*/ + in case this has not been done yet.
*/ public void display(); /** Enables or disables automatic buffer swapping for this drawable. @@ -211,4 +244,5 @@ public interface GLAutoDrawable extends GLDrawable { demos for examples. @return the set GL pipeline or null if not successful */ public GL setGL(GL gl); + } diff --git a/src/jogl/classes/javax/media/opengl/GLRunnable.java b/src/jogl/classes/javax/media/opengl/GLRunnable.java new file mode 100644 index 000000000..8d619273f --- /dev/null +++ b/src/jogl/classes/javax/media/opengl/GLRunnable.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2010, Sven Gothel + * 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 Sven Gothel 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 Sven Gothel 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 javax.media.opengl; + +/** Declares one-shot OpenGL commands, which client code can use to manage OpenGL
+ commands into a {@link GLAutoDrawable}. At the time any of these
+ methods is called, the drawable has made its associated OpenGL
+ context current, so it is valid to make OpenGL calls.
A GLRunnable maybe used to inject OpenGL commands via I/O event listener, + via {@link GLAutoDrawable#invoke(boolean, GLRunnable)}.
+ */ +public interface GLRunnable { + /** Called by the drawable to initiate one-shot OpenGL commands by the + client, like {@link GLEventListener#display(GLAutoDrawable)}. */ + public void run(GLAutoDrawable drawable); +} + diff --git a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java index 77b8e45d3..2dafd691a 100644 --- a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java +++ b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java @@ -484,10 +484,18 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable { drawableHelper.addGLEventListener(listener); } + public void addGLEventListener(int index, GLEventListener listener) { + drawableHelper.addGLEventListener(index, listener); + } + public void removeGLEventListener(GLEventListener listener) { drawableHelper.removeGLEventListener(listener); } + public void invoke(boolean wait, GLRunnable glRunnable) { + drawableHelper.invoke(wait, glRunnable); + } + public void setContext(GLContext ctx) { context=(GLContextImpl)ctx; } diff --git a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java index 955949415..73962e979 100644 --- a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java +++ b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java @@ -372,10 +372,18 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable { drawableHelper.addGLEventListener(listener); } + public void addGLEventListener(int index, GLEventListener listener) { + drawableHelper.addGLEventListener(index, listener); + } + public void removeGLEventListener(GLEventListener listener) { drawableHelper.removeGLEventListener(listener); } + public void invoke(boolean wait, GLRunnable glRunnable) { + drawableHelper.invoke(wait, glRunnable); + } + public GLContext createContext(GLContext shareWith) { return backend.createContext(shareWith); } diff --git a/src/junit/com/jogamp/test/junit/newt/GLRunnableDummy.java b/src/junit/com/jogamp/test/junit/newt/GLRunnableDummy.java new file mode 100644 index 000000000..990a0c37d --- /dev/null +++ b/src/junit/com/jogamp/test/junit/newt/GLRunnableDummy.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010 Sven Gothel. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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 Sven Gothel or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +package com.jogamp.test.junit.newt; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.AfterClass; +import org.junit.Test; + +import javax.media.opengl.*; + +public class GLRunnableDummy implements GLRunnable { + float r=0.0f; + float g=0.0f; + float b=0.0f; + float d=0.001f; + + public void run(GLAutoDrawable drawable) { + // nop .. + GL2ES1 gl = drawable.getGL().getGL2ES1(); + gl.glClearColor(r, g, b, 1f); + r+=d; + if(r>1f) { + r=1f; + d*=-1f; + } else if(r<0f) { + r=0f; + d*=-1f; + } + } + +} diff --git a/src/junit/com/jogamp/test/junit/newt/TestListenerCom01AWT.java b/src/junit/com/jogamp/test/junit/newt/TestListenerCom01AWT.java index b661d02f3..495b8bb3e 100755 --- a/src/junit/com/jogamp/test/junit/newt/TestListenerCom01AWT.java +++ b/src/junit/com/jogamp/test/junit/newt/TestListenerCom01AWT.java @@ -142,7 +142,7 @@ public class TestListenerCom01AWT { static int atoi(String a) { int i=0; try { - durationPerTest = Integer.parseInt(a); + i = Integer.parseInt(a); } catch (Exception ex) { ex.printStackTrace(); } return i; } diff --git a/src/junit/com/jogamp/test/junit/newt/TestParenting01AWT.java b/src/junit/com/jogamp/test/junit/newt/TestParenting01AWT.java deleted file mode 100755 index 39659d763..000000000 --- a/src/junit/com/jogamp/test/junit/newt/TestParenting01AWT.java +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright (c) 2010 Sven Gothel. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution 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 Sven Gothel or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ - -package com.jogamp.test.junit.newt; - -import java.lang.reflect.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Test; - -import java.awt.Button; -import java.awt.BorderLayout; -import java.awt.Canvas; -import java.awt.Frame; -import java.awt.Dimension; - -import javax.media.opengl.*; -import javax.media.nativewindow.*; - -import com.jogamp.opengl.util.Animator; -import com.jogamp.newt.*; -import com.jogamp.newt.event.*; -import com.jogamp.newt.opengl.*; -import com.jogamp.newt.awt.NewtCanvasAWT; - -import java.io.IOException; - -import com.jogamp.test.junit.util.*; -import com.jogamp.test.junit.jogl.demos.es1.RedSquare; -import com.jogamp.test.junit.jogl.demos.gl2.gears.Gears; - -public class TestParenting01AWT { - static int width, height; - static long durationPerTest = 800; - static long waitReparent = 0; - static GLCapabilities glCaps; - - @BeforeClass - public static void initClass() { - width = 640; - height = 480; - glCaps = new GLCapabilities(null); - } - - @Test - public void testWindowParenting01CreateVisibleDestroy1() throws InterruptedException { - int x = 0; - int y = 0; - - NEWTEventFiFo eventFifo = new NEWTEventFiFo(); - - GLWindow glWindow1 = GLWindow.create(glCaps); - Assert.assertNotNull(glWindow1); - Assert.assertEquals(false, glWindow1.isVisible()); - Assert.assertEquals(false, glWindow1.isNativeWindowValid()); - Assert.assertNull(glWindow1.getParentNativeWindow()); - glWindow1.setTitle("testWindowParenting01CreateVisibleDestroy"); - GLEventListener demo1 = new RedSquare(); - setDemoFields(demo1, glWindow1, false); - glWindow1.addGLEventListener(demo1); - - NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow1); - Assert.assertNotNull(newtCanvasAWT); - Assert.assertEquals(false, glWindow1.isVisible()); - Assert.assertEquals(false, glWindow1.isNativeWindowValid()); - Assert.assertNull(glWindow1.getParentNativeWindow()); - - Frame frame = new Frame("AWT Parent Frame"); - Assert.assertNotNull(frame); - frame.add(newtCanvasAWT); - frame.setSize(width, height); - - // visible test - frame.setVisible(true); - Assert.assertEquals(newtCanvasAWT.getNativeWindow(),glWindow1.getParentNativeWindow()); - - Animator animator1 = new Animator(glWindow1); - animator1.start(); - while(animator1.isAnimating() && animator1.getDuration()invokeAndWait()
semantics.
+ */
+public class NEWTEventTask {
+ NEWTEvent event;
+ Object notifyObject;
+
+ public NEWTEventTask(NEWTEvent event, Object notifyObject) {
+ this.event = event ;
+ this.notifyObject = notifyObject ;
+ }
+
+ public NEWTEvent get() { return event; }
+
+ public void notifyIssuer() {
+ if(null != notifyObject) {
+ synchronized (notifyObject) {
+ notifyObject.notifyAll();
+ }
+ }
+ }
+}
+
diff --git a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
index 1807201a4..0e93fc0bd 100644
--- a/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
+++ b/src/newt/classes/com/jogamp/newt/opengl/GLWindow.java
@@ -487,6 +487,10 @@ public class GLWindow extends Window implements GLAutoDrawable {
helper.removeGLEventListener(listener);
}
+ public void invoke(boolean wait, GLRunnable glRunnable) {
+ helper.invoke(wait, glRunnable);
+ }
+
public void display() {
display(false);
}
diff --git a/src/newt/classes/com/jogamp/newt/util/EDTUtil.java b/src/newt/classes/com/jogamp/newt/util/EDTUtil.java
index 235132460..2e339fd45 100644
--- a/src/newt/classes/com/jogamp/newt/util/EDTUtil.java
+++ b/src/newt/classes/com/jogamp/newt/util/EDTUtil.java
@@ -36,6 +36,7 @@
package com.jogamp.newt.util;
+import com.jogamp.common.util.RunnableTask;
import com.jogamp.newt.Display;
import com.jogamp.newt.impl.Debug;
import java.util.*;
@@ -107,10 +108,7 @@ public class EDTUtil {
return null!=edt && edt.isRunning() ;
}
- public void invokeLater(Runnable task) {
- if(task == null) {
- return;
- }
+ private void invokeLater(Runnable task) {
synchronized(edtLock) {
if(null!=edt && edt.isRunning() && edt != Thread.currentThread() ) {
tasks.add(task);
@@ -122,21 +120,33 @@ public class EDTUtil {
}
}
- public void invokeAndWait(Runnable task) {
- invoke(true, task);
- }
-
public void invoke(boolean wait, Runnable task) {
if(task == null) {
return;
}
- invokeLater(task);
- if(wait) {
- waitOnWorker();
+ boolean doWait = wait && null!=edt && edt.isRunning() && edt != Thread.currentThread();
+ Object lock = new Object();
+ RunnableTask rTask = new RunnableTask(task, doWait?lock:null, true);
+ Throwable throwable = null;
+ synchronized(lock) {
+ invokeLater(rTask);
+ if( doWait ) {
+ try {
+ lock.wait();
+ } catch (InterruptedException ie) {
+ throwable = ie;
+ }
+ }
+ }
+ if(null==throwable) {
+ throwable = rTask.getThrowable();
+ }
+ if(null!=throwable) {
+ throw new RuntimeException(throwable);
}
}
- public void waitOnWorker() {
+ public void waitUntilIdle() {
synchronized(edtLock) {
if(null!=edt && edt.isRunning() && tasks.size()>0 && edt != Thread.currentThread() ) {
try {
--
cgit v1.2.3