< 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 >