diff options
Diffstat (limited to 'libjava/gnu/awt/xlib')
-rw-r--r-- | libjava/gnu/awt/xlib/XEventLoop.java | 36 | ||||
-rw-r--r-- | libjava/gnu/awt/xlib/XFramePeer.java | 2 | ||||
-rw-r--r-- | libjava/gnu/awt/xlib/XToolkit.java | 26 |
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); + }; } |