summaryrefslogtreecommitdiff
path: root/gnu/java
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2006-10-23 19:12:35 +0000
committerThomas Fitzsimmons <fitzsim@redhat.com>2006-10-23 19:12:35 +0000
commit10f83276af6a232bccb8f3f550e5a38c5f68b2e9 (patch)
tree50342a9bd03fe717276905ddab5b0d1aa4cbbffa /gnu/java
parent4819597067f97c8b8779c64a7cd4aa8156d72d66 (diff)
downloadclasspath-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.java58
-rw-r--r--gnu/java/awt/peer/gtk/GtkMainThread.java45
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);
- }
-}