56 lines
2.1 KiB
Java
56 lines
2.1 KiB
Java
--- java/src/charva/awt/Window.java.orig Mon Aug 14 17:38:56 2006
|
|
+++ java/src/charva/awt/Window.java Mon Jan 29 09:39:30 2007
|
|
@@ -156,13 +156,21 @@ public class Window
|
|
*/
|
|
SyncQueue.getInstance().postEvent(new SyncEvent(this));
|
|
|
|
- if (_dispatchThreadRunning)
|
|
- run();
|
|
- else {
|
|
- _dispatchThreadRunning = true;
|
|
- Thread dispatchThread = new Thread(this);
|
|
- dispatchThread.setName("event dispatcher");
|
|
- dispatchThread.start();
|
|
+ if (_dispatchThread != null) {
|
|
+ if (Thread.currentThread() == _dispatchThread) {
|
|
+ // we are in the EDT, we must manage events
|
|
+ run();
|
|
+ } else {
|
|
+ // we are not the EDT, let's wait for him to ask us to close
|
|
+ synchronized (this) {
|
|
+ while (!_windowClosed)
|
|
+ try { wait(); } catch (InterruptedException e) { }
|
|
+ }
|
|
+ }
|
|
+ } else {
|
|
+ _dispatchThread = new Thread(this);
|
|
+ _dispatchThread.setName("event dispatcher");
|
|
+ _dispatchThread.start();
|
|
|
|
/* If "charva.script.playback" is defined, we start up
|
|
* a thread for playing back the script. Keys from both the
|
|
@@ -270,7 +278,10 @@ public class Window
|
|
*/
|
|
if (we.getID() == AWTEvent.WINDOW_CLOSING) {
|
|
|
|
- we.getWindow()._windowClosed = true;
|
|
+ synchronized (we.getWindow()) {
|
|
+ we.getWindow()._windowClosed = true;
|
|
+ we.getWindow().notify();
|
|
+ }
|
|
|
|
/* Remove this window from the list of those displayed,
|
|
* and blank out the screen area where the window was
|
|
@@ -407,10 +418,10 @@ public class Window
|
|
|
|
private Window _owner;
|
|
protected Toolkit _term;
|
|
- private boolean _windowClosed = false;
|
|
+ private volatile boolean _windowClosed = false;
|
|
|
|
private Vector _windowListeners = null;
|
|
|
|
- private static boolean _dispatchThreadRunning = false;
|
|
+ private static Thread _dispatchThread = null;
|
|
|
|
}
|