aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/awt/xlib
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/gnu/awt/xlib')
-rw-r--r--libjava/gnu/awt/xlib/XEventLoop.java36
-rw-r--r--libjava/gnu/awt/xlib/XFramePeer.java2
-rw-r--r--libjava/gnu/awt/xlib/XToolkit.java26
3 files changed, 42 insertions, 22 deletions
diff --git a/libjava/gnu/awt/xlib/XEventLoop.java b/libjava/gnu/awt/xlib/XEventLoop.java
index 66878185b51..8f7828770e8 100644
--- a/libjava/gnu/awt/xlib/XEventLoop.java
+++ b/libjava/gnu/awt/xlib/XEventLoop.java
@@ -21,12 +21,11 @@ import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.util.Vector;
-public class XEventLoop implements Runnable
+public class XEventLoop
{
Display display;
EventQueue queue;
XAnyEvent anyEvent;
- Thread eventLoopThread;
LightweightRedirector lightweightRedirector = new LightweightRedirector();
@@ -36,44 +35,40 @@ public class XEventLoop implements Runnable
this.queue = queue;
anyEvent = new XAnyEvent(display);
- eventLoopThread = new Thread(this, "AWT thread for XEventLoop");
- eventLoopThread.start();
}
- public void run()
+ void interrupt()
{
- while (true)
- postNextEvent();
+ anyEvent.interrupt();
}
- void postNextEvent()
+ void postNextEvent(boolean block)
{
- AWTEvent evt = getNextEvent();
- queue.postEvent(evt);
+ AWTEvent evt = getNextEvent(block);
+ if (evt != null)
+ queue.postEvent(evt);
}
/** get next event. Will block until events become available. */
- public AWTEvent getNextEvent()
+ public AWTEvent getNextEvent(boolean block)
{
// ASSERT:
if (isIdle())
throw new Error("should not be idle");
AWTEvent event = null;
- while (event == null)
+ if (loadNextEvent(block))
{
- loadNextEvent();
- event = createEvent();
- }
-
- event = lightweightRedirector.redirect(event);
-
+ event = createEvent();
+ event = lightweightRedirector.redirect(event);
+ }
return event;
}
- void loadNextEvent()
+ boolean loadNextEvent(boolean block)
{
+ boolean gotEvent = false;
try
{
setIdle(true);
@@ -100,7 +95,7 @@ public class XEventLoop implements Runnable
of events. */
//display.flush(); // implicit?
- anyEvent.loadNext();
+ gotEvent = anyEvent.loadNext(block);
}
catch (RuntimeException re)
{
@@ -110,6 +105,7 @@ public class XEventLoop implements Runnable
{
setIdle(false);
}
+ return gotEvent;
}
/**
diff --git a/libjava/gnu/awt/xlib/XFramePeer.java b/libjava/gnu/awt/xlib/XFramePeer.java
index ec159078aba..f3c655ecf80 100644
--- a/libjava/gnu/awt/xlib/XFramePeer.java
+++ b/libjava/gnu/awt/xlib/XFramePeer.java
@@ -78,7 +78,7 @@ public class XFramePeer extends XCanvasPeer implements FramePeer
bounds. */
public void setBounds(int x, int y, int width, int height)
{
- if (Thread.currentThread() == getXToolkit().eventLoop.eventLoopThread)
+ if (EventQueue.isDispatchThread())
return;
super.setBounds(x, y, width, height);
diff --git a/libjava/gnu/awt/xlib/XToolkit.java b/libjava/gnu/awt/xlib/XToolkit.java
index a1d2440eef5..1e937c23867 100644
--- a/libjava/gnu/awt/xlib/XToolkit.java
+++ b/libjava/gnu/awt/xlib/XToolkit.java
@@ -438,5 +438,29 @@ public class XToolkit extends ClasspathToolkit
{
throw new java.lang.UnsupportedOperationException ();
}
-
+
+ public RobotPeer createRobot (GraphicsDevice screen) throws AWTException
+ {
+ throw new java.lang.UnsupportedOperationException ();
+ }
+
+ boolean interrupted;
+
+ public boolean nativeQueueEmpty()
+ {
+ return eventLoop.isIdle();
+ }
+
+ public void wakeNativeQueue()
+ {
+ interrupted = true;
+ eventLoop.interrupt();
+ }
+
+ public void iterateNativeQueue(java.awt.EventQueue locked, boolean block)
+ {
+ interrupted = false;
+ while (!interrupted)
+ eventLoop.postNextEvent(block);
+ };
}