aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/nativewindow/classes/com/jogamp/nativewindow/swt/SWTAccessor.java17
-rw-r--r--src/test/com/jogamp/opengl/test/junit/newt/event/BaseNewtEventModifiers.java65
-rw-r--r--src/test/com/jogamp/opengl/test/junit/newt/event/TestNewtEventModifiersNewtCanvasSWT.java53
3 files changed, 73 insertions, 62 deletions
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/swt/SWTAccessor.java b/src/nativewindow/classes/com/jogamp/nativewindow/swt/SWTAccessor.java
index 5479f2495..5c4fd82d2 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/swt/SWTAccessor.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/swt/SWTAccessor.java
@@ -482,6 +482,23 @@ public class SWTAccessor {
}
}
+ /**
+ * Runs the specified action on the SWT UI thread.
+ * <p>
+ * If <code>display</code> is disposed or the current thread is the SWT UI thread
+ * {@link #invoke(boolean, Runnable)} is being used.
+ * @see #invoke(boolean, Runnable)
+ */
+ public static void invoke(org.eclipse.swt.widgets.Display display, boolean wait, Runnable runnable) {
+ if( display.isDisposed() || Thread.currentThread() == display.getThread() ) {
+ invoke(wait, runnable);
+ } else if( wait ) {
+ display.syncExec(runnable);
+ } else {
+ display.asyncExec(runnable);
+ }
+ }
+
//
// Specific X11 GTK ChildWindow - Using plain X11 native parenting (works well)
//
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/event/BaseNewtEventModifiers.java b/src/test/com/jogamp/opengl/test/junit/newt/event/BaseNewtEventModifiers.java
index 138d30823..4dd3bb98a 100644
--- a/src/test/com/jogamp/opengl/test/junit/newt/event/BaseNewtEventModifiers.java
+++ b/src/test/com/jogamp/opengl/test/junit/newt/event/BaseNewtEventModifiers.java
@@ -318,11 +318,6 @@ public abstract class BaseNewtEventModifiers extends UITestCase {
_testMouseListener = new TestMouseListener() ;
}
- @After
- public void afterTest() throws Exception {
- clearKeyboadAndMouse();
- }
-
////////////////////////////////////////////////////////////////////////////
// Following both methods are mandatory to deal with SWT's requirement
// to run the SWT event dispatch on the TK thread - which must be the main thread on OSX.
@@ -341,34 +336,32 @@ public abstract class BaseNewtEventModifiers extends UITestCase {
_robot.setAutoDelay( MS_ROBOT_AUTO_DELAY ) ;
{
// Make sure all the buttons and modifier keys are released.
- _releaseModifiers() ;
- _escape() ;
- eventDispatch(); eventDispatch(); eventDispatch();
- Thread.sleep( MS_ROBOT_POST_TEST_DELAY ) ;
- eventDispatch(); eventDispatch(); eventDispatch();
- _testMouseListener.clear();
+ clearKeyboadAndMouse();
}
_testMouseListener.setModifierCheckEnabled( true ) ;
Throwable throwable = null;
- final Object sync = new Object();
- final RunnableTask rt = new RunnableTask( testAction, sync, true );
+ // final Object sync = new Object();
+ final RunnableTask rt = new RunnableTask( testAction, null, true );
try {
- new Thread(rt, "Test-Thread").start();
- while( !rt.isExecuted() && null == throwable ) {
- eventDispatch();
- }
- if(null==throwable) {
- throwable = rt.getThrowable();
- }
- if(null!=throwable) {
- throw new RuntimeException(throwable);
- }
+ // synchronized(sync) {
+ new Thread(rt, "Test-Thread").start();
+ int i=0;
+ while( !rt.isExecuted() && null == throwable ) {
+ System.err.println("WAIT-till-done: eventDispatch() #"+i++);
+ eventDispatch();
+ }
+ if(null==throwable) {
+ throwable = rt.getThrowable();
+ }
+ if(null!=throwable) {
+ throw new RuntimeException(throwable);
+ }
+ // }
} finally {
- _testMouseListener.setModifierCheckEnabled( false ) ;
- eventDispatch(); eventDispatch(); eventDispatch();
- Thread.sleep( MS_ROBOT_POST_TEST_DELAY ) ;
- eventDispatch(); eventDispatch(); eventDispatch();
+ System.err.println("WAIT-till-done: DONE");
+ _testMouseListener.setModifierCheckEnabled( false ) ;
+ clearKeyboadAndMouse();
}
}
@@ -684,20 +677,24 @@ public abstract class BaseNewtEventModifiers extends UITestCase {
////////////////////////////////////////////////////////////////////////////
- public static void clearKeyboadAndMouse() throws Exception {
-
+ public void eventDispatchedPostTestDelay() throws Exception {
+ eventDispatch(); eventDispatch(); eventDispatch();
+ Thread.sleep( MS_ROBOT_POST_TEST_DELAY ) ;
+ eventDispatch(); eventDispatch(); eventDispatch();
+ _testMouseListener.clear();
+ }
+
+ public void clearKeyboadAndMouse() throws Exception {
// Make sure all modifiers are released, otherwise the user's
// desktop can get locked up (ask me how I know this).
-
_releaseModifiers() ;
_escape() ;
- Thread.sleep( MS_ROBOT_POST_TEST_DELAY ) ;
- _testMouseListener.clear();
+ eventDispatchedPostTestDelay();
}
////////////////////////////////////////////////////////////////////////////
- private static void _releaseModifiers() {
+ private void _releaseModifiers() {
if (_robot != null) {
@@ -722,7 +719,7 @@ public abstract class BaseNewtEventModifiers extends UITestCase {
}
}
- private static void _escape() {
+ private void _escape() {
if (_robot != null) {
_robot.keyPress( java.awt.event.KeyEvent.VK_ESCAPE ) ;
_robot.keyRelease( java.awt.event.KeyEvent.VK_ESCAPE ) ;
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/event/TestNewtEventModifiersNewtCanvasSWT.java b/src/test/com/jogamp/opengl/test/junit/newt/event/TestNewtEventModifiersNewtCanvasSWT.java
index 002134216..6279b70dc 100644
--- a/src/test/com/jogamp/opengl/test/junit/newt/event/TestNewtEventModifiersNewtCanvasSWT.java
+++ b/src/test/com/jogamp/opengl/test/junit/newt/event/TestNewtEventModifiersNewtCanvasSWT.java
@@ -62,22 +62,23 @@ public class TestNewtEventModifiersNewtCanvasSWT extends BaseNewtEventModifiers
////////////////////////////////////////////////////////////////////////////
- protected static void eventDispatch2xImpl() {
- eventDispatchImpl();
+ protected static void eventDispatchImpl() {
+ final int maxEvents = 10;
try {
Thread.sleep(100);
} catch (InterruptedException e) { }
- eventDispatchImpl();
- }
-
- protected static void eventDispatchImpl() {
- if( !_display.isDisposed() ) {
- if( !_display.readAndDispatch() ) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) { }
- }
- }
+ final boolean[] res = { false };
+ int i=0;
+ do {
+ SWTAccessor.invoke(_display, true, new Runnable() {
+ public void run() {
+ if( !_display.isDisposed() ) {
+ res[0] = _display.readAndDispatch();
+ } else {
+ res[0] = false;
+ }
+ } } );
+ } while( i<maxEvents && res[0] );
}
@Override
@@ -96,7 +97,7 @@ public class TestNewtEventModifiersNewtCanvasSWT extends BaseNewtEventModifiers
}});
Assert.assertNotNull( _display );
- _display.syncExec(new Runnable() {
+ SWTAccessor.invoke(_display, true, new Runnable() {
public void run() {
_shell = new Shell( _display );
Assert.assertNotNull( _shell );
@@ -115,7 +116,7 @@ public class TestNewtEventModifiersNewtCanvasSWT extends BaseNewtEventModifiers
NewtCanvasSWT.create( _composite, SWT.NO_BACKGROUND, _glWindow ) ;
}
- _display.syncExec( new Runnable() {
+ SWTAccessor.invoke(_display, true, new Runnable() {
public void run() {
_shell.setBounds( TEST_FRAME_X, TEST_FRAME_Y, TEST_FRAME_WIDTH, TEST_FRAME_HEIGHT ) ;
_shell.open();
@@ -128,9 +129,9 @@ public class TestNewtEventModifiersNewtCanvasSWT extends BaseNewtEventModifiers
// no waiting for results ..
AWTRobotUtil.requestFocus(null, _glWindow, false); // programmatic
- eventDispatch2xImpl();
+ eventDispatchImpl();
AWTRobotUtil.requestFocus(_robot, _glWindow, INITIAL_MOUSE_X, INITIAL_MOUSE_Y);
- eventDispatch2xImpl();
+ eventDispatchImpl();
_glWindow.addMouseListener( _testMouseListener ) ;
}
@@ -142,18 +143,14 @@ public class TestNewtEventModifiersNewtCanvasSWT extends BaseNewtEventModifiers
_glWindow.destroy() ;
try {
- _display.syncExec(new Runnable() {
- public void run() {
- _composite.dispose();
- _shell.dispose();
- }});
-
- if(!_display.isDisposed()) {
- SWTAccessor.invoke(true, new Runnable() {
- public void run() {
+ SWTAccessor.invoke(_display, true, new Runnable() {
+ public void run() {
+ _composite.dispose();
+ _shell.dispose();
+ if(!_display.isDisposed()) {
_display.dispose();
- }});
- }
+ }
+ }});
}
catch( Throwable throwable ) {
throwable.printStackTrace();