< prev index next >
src/java.desktop/share/classes/java/awt/SequencedEvent.java
Print this page
@@ -23,10 +23,12 @@
* questions.
*/
package java.awt;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.LinkedList;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
@@ -53,10 +55,12 @@
private final AWTEvent nested;
private AppContext appContext;
private boolean disposed;
+ private static boolean fxAppThreadIsDispatchThread;
+ private Thread fxCheckSequenceThread;
static {
AWTAccessor.setSequencedEventAccessor(new AWTAccessor.SequencedEventAccessor() {
public AWTEvent getNested(AWTEvent sequencedEvent) {
return ((SequencedEvent)sequencedEvent).nested;
}
@@ -66,10 +70,17 @@
public AWTEvent create(AWTEvent event) {
return new SequencedEvent(event);
}
});
+ AccessController.doPrivileged(new PrivilegedAction<Object>() {
+ public Object run() {
+ fxAppThreadIsDispatchThread =
+ "true".equals(System.getProperty("javafx.embed.singleThread"));
+ return null;
+ }
+ });
}
/**
* Constructs a new SequencedEvent which will dispatch the specified
* nested event.
@@ -81,10 +92,25 @@
super(nested.getSource(), ID);
this.nested = nested;
// All AWTEvents that are wrapped in SequencedEvents are (at
// least currently) implicitly generated by the system
SunToolkit.setSystemGenerated(nested);
+
+ if (fxAppThreadIsDispatchThread) {
+ fxCheckSequenceThread = new Thread() {
+ @Override
+ public void run() {
+ while(!isFirstOrDisposed()) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ }
+ };
+ }
synchronized (SequencedEvent.class) {
list.add(this);
}
}
@@ -104,18 +130,24 @@
try {
appContext = AppContext.getAppContext();
if (getFirst() != this) {
if (EventQueue.isDispatchThread()) {
+ if (Thread.currentThread() instanceof EventDispatchThread) {
EventDispatchThread edt = (EventDispatchThread)
Thread.currentThread();
edt.pumpEvents(SentEvent.ID, new Conditional() {
public boolean evaluate() {
return !SequencedEvent.this.isFirstOrDisposed();
}
});
} else {
+ if (fxAppThreadIsDispatchThread) {
+ fxCheckSequenceThread.start();
+ }
+ }
+ } else {
while(!isFirstOrDisposed()) {
synchronized (SequencedEvent.class) {
try {
SequencedEvent.class.wait(1000);
} catch (InterruptedException e) {
< prev index next >