diff options
| author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2006-10-23 19:12:35 +0000 |
|---|---|---|
| committer | Thomas Fitzsimmons <fitzsim@redhat.com> | 2006-10-23 19:12:35 +0000 |
| commit | 10f83276af6a232bccb8f3f550e5a38c5f68b2e9 (patch) | |
| tree | 50342a9bd03fe717276905ddab5b0d1aa4cbbffa /gnu/java | |
| parent | 4819597067f97c8b8779c64a7cd4aa8156d72d66 (diff) | |
| download | classpath-10f83276af6a232bccb8f3f550e5a38c5f68b2e9.tar.gz | |
2006-10-23 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/NativeEventLoopRunningEvent.java: New file.
* gnu/java/awt/peer/gtk/GtkMainThread.java: Post
NativeEventLoopRunningEvent after GTK main loop start and stop.
* java/awt/EventQueue.java (isShutdown): Check nativeLoopRunning.
(getNextEvent): Set dispatchThread to null.
(postEventImpl): Set nativeLoopRunning.
(pop): Interrupt event dispatch thread.
* java/awt/Frame.java (noteFrame): Synchronize on weakFrames.
Diffstat (limited to 'gnu/java')
| -rw-r--r-- | gnu/java/awt/peer/NativeEventLoopRunningEvent.java | 58 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkMainThread.java | 45 |
2 files changed, 68 insertions, 35 deletions
diff --git a/gnu/java/awt/peer/NativeEventLoopRunningEvent.java b/gnu/java/awt/peer/NativeEventLoopRunningEvent.java new file mode 100644 index 000000000..962ecd990 --- /dev/null +++ b/gnu/java/awt/peer/NativeEventLoopRunningEvent.java @@ -0,0 +1,58 @@ +/* NativeEventLoopRunningEvent.java -- communicates to EventQueue the + state of the native event loop + Copyright (C) 2006 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.awt.peer; + +import java.awt.AWTEvent; + +public class NativeEventLoopRunningEvent + extends AWTEvent +{ + private boolean running; + + public NativeEventLoopRunningEvent(Object source) + { + super(source, 2999); + running = ((Boolean) source).booleanValue(); + } + + public boolean isRunning() + { + return running; + } +} diff --git a/gnu/java/awt/peer/gtk/GtkMainThread.java b/gnu/java/awt/peer/gtk/GtkMainThread.java index fe374bd9d..a4e280fe4 100644 --- a/gnu/java/awt/peer/gtk/GtkMainThread.java +++ b/gnu/java/awt/peer/gtk/GtkMainThread.java @@ -38,13 +38,11 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import gnu.java.awt.peer.NativeEventLoopRunningEvent; + import java.awt.AWTEvent; /** - * This class implements the AWT exit conditions listed here: - * - * http://java.sun.com/j2se/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html - * * The Java thread representing the native GTK main loop, that is, * GtkMainThread.mainThread, terminates when GtkToolkit.gtkMain() * returns. That happens in response to the last window peer being @@ -73,17 +71,10 @@ import java.awt.AWTEvent; * GtkMainThread.mainThread is started when the window count goes from * zero to one. * - * The three exit conditions in the above document are satisfied by - * GtkMainThread alone: 1) no displayable AWT or Swing components: if - * no window peers exist then no AWT or Swing component is - * displayable; 2) no native events in the native event queue: when - * the last window is disposed of, the native GTK main loop is - * terminated, which means that there is no native event queue let - * alone native events therein; 3) no AWT events in the AWT event - * queue: endMainThread posts a dummy event to the AWT event queue, - * which if the other exit conditions are satisfied, becomes the last - * event posted to the AWT event queue before the AWT event dispatch - * thread terminates. + * GtkMainThread keeps the AWT event queue informed of its status by + * posting NativeEventLoopRunningEvents. The AWT event queue uses + * this status to determine whether or not the AWT exit conditions + * have been met (see EventQueue.isShutdown). */ public class GtkMainThread extends Thread { @@ -144,6 +135,8 @@ public class GtkMainThread extends Thread + " for GTK main loop to start"); } } + GtkGenericPeer.q() + .postEvent(new NativeEventLoopRunningEvent(new Boolean(true))); } } } @@ -169,18 +162,9 @@ public class GtkMainThread extends Thread + " for GTK main loop to stop"); } } - // Post a dummy event to wake up the AWT event dispatch - // thread. EventQueue.getNextEvent first checks the - // shutdown condition, then waits indefinitely for the - // next event to be posted. There is a possibility that - // the native GTK main loop will end between the - // isShutdown check and the wait call. Posting a dummy - // event here causes the AWT event dispatch thread to wake - // up, giving it a chance to check the shutdown condition - // again and terminate cleanly. GtkGenericPeer.q() - .postEvent(new WakeupEventDispatchThreadEvent (mainThread)); - } + .postEvent(new NativeEventLoopRunningEvent(new Boolean(false))); + } } } @@ -204,12 +188,3 @@ public class GtkMainThread extends Thread } } } - -class WakeupEventDispatchThreadEvent - extends AWTEvent -{ - WakeupEventDispatchThreadEvent(Object o) - { - super (o, 2000); - } -} |
