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