From: <ls...@us...> - 2008-11-17 13:47:03
|
Revision: 4706 http://jnode.svn.sourceforge.net/jnode/?rev=4706&view=rev Author: lsantha Date: 2008-11-17 13:46:59 +0000 (Mon, 17 Nov 2008) Log Message: ----------- Improved isolate support for GUI applications. Modified Paths: -------------- trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java trunk/core/src/openjdk/java/java/awt/DefaultKeyboardFocusManager.java trunk/core/src/openjdk/java/java/awt/KeyboardFocusManager.java trunk/core/src/openjdk/java/java/awt/Toolkit.java trunk/core/src/openjdk/sun/sun/awt/SunToolkit.java trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java trunk/gui/src/awt/org/jnode/awt/KeyboardHandler.java trunk/gui/src/awt/org/jnode/awt/MouseHandler.java trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindow.java trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindowPeer.java trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingComponentPeer.java trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingToolkit.java Modified: trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java =================================================================== --- trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/core/src/core/org/jnode/vm/isolate/VmIsolate.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -416,6 +416,12 @@ //only this isolate may call this method testIsolate(isolate); + //todo add similar checks to other exit modes too + synchronized (this) { + if(!this.state.equals(State.STARTED)) + return; + } + changeState(State.EXITING); this.exitReason = IsolateStatus.ExitReason.SELF_EXIT; Modified: trunk/core/src/openjdk/java/java/awt/DefaultKeyboardFocusManager.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/DefaultKeyboardFocusManager.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/core/src/openjdk/java/java/awt/DefaultKeyboardFocusManager.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -669,6 +669,7 @@ // Then we need to deactive the active Window as well. // No need to synthesize in other cases, because // WINDOW_ACTIVATED will handle it if necessary. + if(activeWindow != null) //jnode sometimes this is null, todo check it why sendMessage(activeWindow, new WindowEvent(activeWindow, WindowEvent.WINDOW_DEACTIVATED, Modified: trunk/core/src/openjdk/java/java/awt/KeyboardFocusManager.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/KeyboardFocusManager.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/core/src/openjdk/java/java/awt/KeyboardFocusManager.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -173,9 +173,21 @@ return getCurrentKeyboardFocusManager(AppContext.getAppContext()); } + //jnode-- + private static KeyboardFocusManager kbfm; synchronized static KeyboardFocusManager getCurrentKeyboardFocusManager(AppContext appcontext) { + if (kbfm == null) { + kbfm = new DefaultKeyboardFocusManager(); + } + return kbfm; + } + //--jnode + /* original + synchronized static KeyboardFocusManager + getCurrentKeyboardFocusManager(AppContext appcontext) + { KeyboardFocusManager manager = (KeyboardFocusManager) appcontext.get(KeyboardFocusManager.class); if (manager == null) { @@ -184,6 +196,7 @@ } return manager; } + */ /** * Sets the current KeyboardFocusManager instance for the calling thread's @@ -468,9 +481,13 @@ return null; } - return (focusOwner.appContext == AppContext.getAppContext()) + /*jnode + TODO remove it if we use per appcontext focus manager + return (focusOwner.appContext == AppContext.getAppContext()) ? focusOwner : null; + */ + return focusOwner; } } Modified: trunk/core/src/openjdk/java/java/awt/Toolkit.java =================================================================== --- trunk/core/src/openjdk/java/java/awt/Toolkit.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/core/src/openjdk/java/java/awt/Toolkit.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -67,6 +67,7 @@ import sun.security.util.SecurityConstants; import sun.util.CoreResourceBundleControl; +import org.jnode.vm.VmSystem; /** * This class is the abstract superclass of all actual @@ -866,6 +867,10 @@ try { //jnode ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if(cl == null) + cl = Toolkit.class.getClassLoader(); + if(cl == null) + cl = VmSystem.getSystemClassLoader().asClassLoader(); cls = cl.loadClass(nm); } catch (ClassNotFoundException e) { ClassLoader cl = ClassLoader.getSystemClassLoader(); Modified: trunk/core/src/openjdk/sun/sun/awt/SunToolkit.java =================================================================== --- trunk/core/src/openjdk/sun/sun/awt/SunToolkit.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/core/src/openjdk/sun/sun/awt/SunToolkit.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -612,11 +612,17 @@ if (eventContext != null && !eventContext.equals(appContext)) { log.fine("Event posted on wrong app context : " + event); } - PostEventQueue postEventQueue = + /*jnode: post queues are not used at this time + PostEventQueue postEventQueue = (PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY); if(postEventQueue != null) { postEventQueue.postEvent(event); } + */ + EventQueue eventQueue = (EventQueue) appContext.get(AppContext.EVENT_QUEUE_KEY); + if (eventQueue != null) { + eventQueue.postEvent(event); + } } /* Modified: trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -26,8 +26,8 @@ import gnu.java.awt.peer.ClasspathFontPeer; import gnu.java.awt.peer.EmbeddedWindowPeer; import gnu.java.security.action.GetPropertyAction; - import java.awt.AWTError; +import java.awt.AWTEvent; import java.awt.AWTException; import java.awt.Color; import java.awt.Component; @@ -50,6 +50,7 @@ import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; +import java.awt.event.ComponentEvent; import java.awt.geom.AffineTransform; import java.awt.im.InputMethodHighlight; import java.awt.image.BufferedImage; @@ -75,10 +76,8 @@ import java.util.Map; import java.util.Properties; import java.util.Set; - import javax.imageio.ImageIO; import javax.naming.NamingException; - import org.apache.log4j.Logger; import org.jnode.awt.font.FontManager; import org.jnode.awt.image.BufferedImageSurface; @@ -91,16 +90,19 @@ import org.jnode.driver.video.Surface; import org.jnode.driver.video.UnknownConfigurationException; import org.jnode.naming.InitialNaming; - +import org.jnode.vm.annotation.SharedStatics; +import sun.awt.AppContext; +import sun.awt.SunToolkit; import sun.awt.image.ToolkitImage; /** * @author epr * @author Levente S\u00e1ntha */ +@SharedStatics public abstract class JNodeToolkit extends ClasspathToolkit implements FrameBufferAPIOwner { protected static final Logger log = Logger.getLogger(JNodeToolkit.class); - + private final Object initCloseLock = new Object(); private EventQueue waitingNativeQueue; private Clipboard systemClipboard; @@ -121,6 +123,23 @@ public JNodeToolkit() { refCount = 0; systemClipboard = new Clipboard("JNodeSystemClipboard"); + + //initialize the main AppContext + AppContext appContext = AppContext.getAppContext(); + + synchronized (this) { + if (appContext.get(AppContext.EVENT_QUEUE_KEY) == null || _eventQueue == null) { + String eqName = System.getProperty("AWT.EventQueueClass", "org.jnode.awt.JNodeEventQueue"); + try { + _eventQueue = (JNodeEventQueue) Class.forName(eqName).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + System.err.println("Failed loading " + eqName + ": " + e); + _eventQueue = new JNodeEventQueue(); + } + appContext.put(AppContext.EVENT_QUEUE_KEY, _eventQueue); + } + } } /** @@ -148,7 +167,7 @@ } public static boolean isGuiActive() { - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } @@ -156,8 +175,7 @@ } public static void startGui() { - clearDefaultToolkit(); - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } @@ -165,7 +183,7 @@ } public static void initGui() { - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } @@ -173,15 +191,16 @@ } public static void stopGui() { - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } ((JNodeToolkit) tk).decRefCount(true); + Toolkit.clearDefaultToolkit(); } public static void refreshGui() { - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } @@ -193,7 +212,7 @@ } public static void waitUntilStopped() { - final Toolkit tk = getDefaultToolkit(); + final Toolkit tk = Toolkit.getDefaultToolkit(); if (!(tk instanceof JNodeToolkit)) { throw new AWTError("Toolkit is not a JNodeToolkit"); } @@ -602,16 +621,33 @@ * @return The event queue */ protected final EventQueue getSystemEventQueueImpl() { + AppContext ac = AppContext.getAppContext(); + if (ac != null) { + EventQueue eq = (EventQueue) ac.get(AppContext.EVENT_QUEUE_KEY); + if (eq != null) { + return eq; + } + } + if ((_eventQueue == null) || (!_eventQueue.isLive() && isGuiActive())) { synchronized (this) { if ((_eventQueue == null) || (!_eventQueue.isLive() && isGuiActive())) { _eventQueue = new JNodeEventQueue(); } + + if (ac != null && ac.get(AppContext.EVENT_QUEUE_KEY) == null) { + ac.put(AppContext.EVENT_QUEUE_KEY, _eventQueue); + } } } + return _eventQueue; } + public final synchronized EventQueue getMainEventQueue() { + return _eventQueue; + } + public Frame getTop() { return top; } @@ -786,22 +822,23 @@ config.getBounds().height - 2 * (100 + i)), null, tx, (i % 2 == 0) ? Color.RED : Color.BLUE, Surface.PAINT_MODE); } - + private JNodeFrameBufferDevice getDevice() { final JNodeFrameBufferDevice device = (JNodeFrameBufferDevice) GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); if (device == null) { throw new AWTError("No framebuffer fbDevice found"); } - + return device; } private GraphicsConfiguration[] configs; + public GraphicsConfiguration[] getConfigurations() { if (configs == null) { final GraphicsConfiguration[] configurations = getDevice().getConfigurations(); - + configs = new GraphicsConfiguration[configurations.length]; System.arraycopy(configurations, 0, configs, 0, configurations.length); Arrays.sort(configs, new Comparator<GraphicsConfiguration>() { @@ -809,7 +846,7 @@ public int compare(GraphicsConfiguration o1, GraphicsConfiguration o2) { final Rectangle b1 = o1.getBounds(); final Rectangle b2 = o2.getBounds(); - + int comp; if (b1.getWidth() > b2.getWidth()) { comp = +1; @@ -824,15 +861,15 @@ comp = 0; } } - + return comp; } - + }); } return configs; } - + public Dimension changeScreenSize(JNodeGraphicsConfiguration config) { final JNodeFrameBufferDevice device = getDevice(); @@ -900,7 +937,7 @@ graphicsMode = false; initCloseLock.notifyAll(); } - + api.releaseOwnership(this); } @@ -910,7 +947,7 @@ public final void joinGUI() { try { api.requestOwnership(this); - + this.graphics = api.open(config.getConfig()); this.keyboardHandler = new KeyboardHandler(_eventQueue); this.mouseHandler = new MouseHandler(fbDevice.getDevice(), @@ -1102,14 +1139,14 @@ //todo implementit return null; } - + @Override public void ownershipLost() { if (isGuiActive()) { leaveGUI(); } } - + @Override public void ownershipGained() { startAwt(); @@ -1117,7 +1154,7 @@ static void startAwt() { if (JNodeToolkit.isGuiActive()) { - ((JNodeToolkit) JNodeToolkit.getDefaultToolkit()).joinGUI(); + ((JNodeToolkit) Toolkit.getDefaultToolkit()).joinGUI(); JNodeToolkit.waitUntilStopped(); } else { JNodeToolkit.startGui(); @@ -1142,13 +1179,13 @@ JNodeToolkit.waitUntilStopped(); } } - ((JNodeToolkit) JNodeToolkit.getDefaultToolkit()).runExitAction(); + ((JNodeToolkit) Toolkit.getDefaultToolkit()).runExitAction(); } - + /** * Set the action to be performed after the GUI has been shutdown, and * before control is returned to (for instance) the CommandShell. - * + * * @param exitAction an action, or <code>null</code>. */ public static void setExitAction(Runnable exitAction) { @@ -1156,7 +1193,7 @@ // is currently used potentially offers a small window for some other // thread to insert an action that would then be executed in the security // context of the GUI's owner.) - ((JNodeToolkit) JNodeToolkit.getDefaultToolkit()).exitAction = exitAction; + ((JNodeToolkit) Toolkit.getDefaultToolkit()).exitAction = exitAction; } private synchronized void runExitAction() { @@ -1164,4 +1201,37 @@ exitAction.run(); } } + + /** + * Post the given event on the system eventqueue. + */ + public final void postEvent(AWTEvent event) { + Object source = event.getSource(); + if (source instanceof Component) { + AppContext ac = SunToolkit.targetToAppContext(source); + if (ac != null) { + java.awt.EventQueue eq = (java.awt.EventQueue) ac.get(sun.awt.AppContext.EVENT_QUEUE_KEY); + if (eq != null) { + eq.postEvent(event); + return; + } + } + } + getSystemEventQueueImpl().postEvent(event); + } + + public static void postToTarget(ComponentEvent event, Component target) { + EventQueue queue; + AppContext ac = SunToolkit.targetToAppContext(target); + if (ac == null) { + queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); + } else { + queue = (EventQueue) ac.get(sun.awt.AppContext.EVENT_QUEUE_KEY); + if (queue == null) { + queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); + } + } + + queue.postEvent(event); + } } Modified: trunk/gui/src/awt/org/jnode/awt/KeyboardHandler.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/KeyboardHandler.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/KeyboardHandler.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -256,7 +256,8 @@ } KeyEvent ke = new KeyEvent(source, id, time, modifiers, keyCode, keyChar); - eventQueue.postEvent(ke); + + JNodeToolkit.postToTarget(ke, source); } private boolean processSystemKey(KeyboardEvent event) { Modified: trunk/gui/src/awt/org/jnode/awt/MouseHandler.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/MouseHandler.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/MouseHandler.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -442,7 +442,8 @@ " p.x=" + p.x + " p.y=" + p.y +"\n"); } */ - eventQueue.postEvent(event); + + JNodeToolkit.postToTarget(event, source); } private Component findSource() { Modified: trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindow.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindow.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindow.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -25,6 +25,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; +import java.awt.EventQueue; import java.awt.Frame; import java.awt.Graphics; import java.awt.Insets; @@ -39,6 +40,8 @@ import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import sun.awt.AppContext; +import sun.awt.SunToolkit; /** * Base class for peer implementation that subclass {@link java.awt.Window}. @@ -84,7 +87,9 @@ public void paint(Graphics g) { super.paint(g); if (target instanceof RootPaneContainer && isVisible()) { - target.paint(g.create()); + //target.paint(g.create()); + swingPeer.postPaintEvent(); + //JNodeToolkit.postToTarget(new PaintEvent(target, PaintEvent.UPDATE, target.getBounds()), target); } } @@ -116,7 +121,17 @@ * @see java.awt.Component#processEvent(java.awt.AWTEvent) */ protected final void processEvent(AWTEvent event) { - target.dispatchEvent(SwingToolkit.convertEvent(event, target)); + AppContext ac = SunToolkit.targetToAppContext(target); + if (ac == null) { + target.dispatchEvent(SwingToolkit.convertEvent(event, target)); + } else { + EventQueue eq = (EventQueue) ac.get(AppContext.EVENT_QUEUE_KEY); + if (eq == null) { + target.dispatchEvent(SwingToolkit.convertEvent(event, target)); + } else { + eq.postEvent(SwingToolkit.convertEvent(event, target)); + } + } } /** Modified: trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindowPeer.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindowPeer.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingBaseWindowPeer.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -21,23 +21,28 @@ package org.jnode.awt.swingpeers; +import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dialog; +import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Insets; import java.awt.Point; +import java.awt.Toolkit; import java.awt.Window; -import java.awt.Color; +import java.awt.event.InvocationEvent; import java.awt.event.WindowEvent; import java.awt.peer.WindowPeer; import java.beans.PropertyVetoException; import javax.swing.JComponent; import javax.swing.JDesktopPane; -import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.InternalFrameEvent; import javax.swing.event.InternalFrameListener; +import org.jnode.awt.JNodeToolkit; +import sun.awt.AppContext; +import sun.awt.SunToolkit; /** * @author Ewout Prangsma (ep...@us...) @@ -70,7 +75,7 @@ * Add this window to the desktop. */ protected final void addToDesktop() { - SwingUtilities.invokeLater(new Runnable() { + Runnable run = new Runnable() { public void run() { final JDesktopPane desktop = toolkit.getAwtContext().getDesktop(); desktop.add(peerComponent); @@ -83,7 +88,19 @@ log.warn("", x); } } - }); + }; + + final JDesktopPane desktop = toolkit.getAwtContext().getDesktop(); + AppContext ac = SunToolkit.targetToAppContext(desktop); + if (ac != null) { + EventQueue eq = (EventQueue) ac.get(AppContext.EVENT_QUEUE_KEY); + if (eq != null) { + eq.postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), run)); + return; + } + } + //shouldn't get here + throw new RuntimeException("Desktop event queue not found!"); } /** @@ -174,7 +191,7 @@ * Fire a WindowEvent with a given id to the awtComponent. */ private final void fireWindowEvent(int id) { - getToolkitImpl().postEvent(new WindowEvent(targetComponent, id)); + JNodeToolkit.postToTarget(new WindowEvent(targetComponent, id), targetComponent); } public void updateAlwaysOnTop() { Modified: trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingComponentPeer.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingComponentPeer.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingComponentPeer.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -29,7 +29,6 @@ import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; -import java.awt.EventQueue; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; @@ -55,6 +54,7 @@ import org.jnode.awt.GraphicsFactory; import org.jnode.awt.JNodeGenericPeer; import org.jnode.awt.JNodeGraphics2D; +import org.jnode.awt.JNodeToolkit; import sun.awt.CausedFocusEvent; /** @@ -277,7 +277,8 @@ */ protected final void postPaintEvent() { if (targetComponent != null) { - toolkit.postEvent(new PaintEvent(targetComponent, PaintEvent.PAINT, targetComponent.getBounds())); + final PaintEvent event = new PaintEvent(targetComponent, PaintEvent.PAINT, targetComponent.getBounds()); + JNodeToolkit.postToTarget(event, targetComponent); } } @@ -403,18 +404,14 @@ if (fl != null) { postPaintEvent(); - toolkit.postEvent(fl); - //XWindow.sendEvent(fl); + JNodeToolkit.postToTarget(fl, currentOwner); } - toolkit.postEvent(fg); - //XWindow.sendEvent(fg); + JNodeToolkit.postToTarget(fg, (Component) fg.getSource()); return true; } catch (Exception x) { x.printStackTrace(); - org.jnode.vm.Unsafe.debug("SwingComponentPeer.requestFocus() exception\n"); - org.jnode.vm.Unsafe.debugStackTrace(); return false; } } @@ -508,8 +505,7 @@ * @param what */ protected final void fireComponentEvent(int what) { - final EventQueue queue = toolkit.getSystemEventQueue(); - queue.postEvent(new ComponentEvent(targetComponent, what)); + JNodeToolkit.postToTarget(new ComponentEvent(targetComponent, what), targetComponent); } public void layout() { Modified: trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingToolkit.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingToolkit.java 2008-11-17 07:50:22 UTC (rev 4705) +++ trunk/gui/src/awt/org/jnode/awt/swingpeers/SwingToolkit.java 2008-11-17 13:46:59 UTC (rev 4706) @@ -32,6 +32,7 @@ import java.awt.Component; import java.awt.Container; import java.awt.Dialog; +import java.awt.EventQueue; import java.awt.FileDialog; import java.awt.Font; import java.awt.Frame; @@ -51,9 +52,11 @@ import java.awt.Shape; import java.awt.TextArea; import java.awt.TextField; +import java.awt.Toolkit; import java.awt.Window; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.peer.DragSourceContextPeer; +import java.awt.event.InvocationEvent; import java.awt.image.BufferedImage; import java.awt.peer.ButtonPeer; import java.awt.peer.CanvasPeer; @@ -85,12 +88,16 @@ import javax.swing.RepaintManager; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.plaf.metal.OceanTheme; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; import org.jnode.awt.JNodeAwtContext; import org.jnode.awt.JNodeToolkit; +import org.jnode.vm.annotation.SharedStatics; +import sun.awt.AWTAutoShutdown; +import sun.awt.AppContext; +import sun.awt.SunToolkit; /** * AWT toolkit implemented entirely with JFC peers, thus allowing a lightweight @@ -99,6 +106,7 @@ * @author Levente S\u00e1ntha * @author Ewout Prangsma (ep...@us...) */ +@SharedStatics public final class SwingToolkit extends JNodeToolkit { /** @@ -155,13 +163,6 @@ } /** - * Post the given event on the system eventqueue. - */ - public final void postEvent(AWTEvent event) { - getSystemEventQueueImpl().postEvent(event); - } - - /** * Paint all the lightweight children of the given container. * * @param awtContainer @@ -247,31 +248,112 @@ return null; } - protected FramePeer createFrame(Frame target) { - if (!isGuiActive()) { - //throw new AWTError("AWT is currently not available"); - initGui(); - } - if (target instanceof DesktopFrame) { - setTop(target); - log.debug("createFrame:desktopFramePeer(" + target + ")"); - // Only desktop is real frame - return new DesktopFramePeer(this, (DesktopFrame) target); - } else /*if (target instanceof JFrame) */ { + protected FramePeer createFrame(final Frame target) { + final FramePeer[] ret = new FramePeer[1]; + + Runnable run = new Runnable() { + public void run() { + + if (!isGuiActive()) { + //throw new AWTError("AWT is currently not available"); + initGui(); + } + if (target instanceof DesktopFrame) { + setTop(target); + log.debug("createFrame:desktopFramePeer(" + target + ")"); + // Only desktop is real frame + //return new DesktopFramePeer(SwingToolkit.this, (DesktopFrame) target); + synchronized (ret) { + ret[0] = new DesktopFramePeer(SwingToolkit.this, (DesktopFrame) target); + try { + AWTAutoShutdown.class.getMethod("registerPeer", Object.class, Object.class). + invoke(AWTAutoShutdown.getInstance(), target, ret[0]); + } catch (Exception x) { + x.printStackTrace(); + } + } + } else /*if (target instanceof JFrame) */ { + if (!isGuiActive()) { + throw new AWTError("Gui is not active"); + } + log.debug("createFrame:normal(" + target + ")"); + // Other frames are emulated + //return new SwingFramePeer(SwingToolkit.this, target); + synchronized (ret) { + ret[0] = new SwingFramePeer(SwingToolkit.this, target); + } + } /*else { if (!isGuiActive()) { throw new AWTError("Gui is not active"); } log.debug("createFrame:normal(" + target + ")"); // Other frames are emulated - return new SwingFramePeer(this, target); - } /*else { - if (!isGuiActive()) { - throw new AWTError("Gui is not active"); - } - log.debug("createFrame:normal(" + target + ")"); - // Other frames are emulated return new SwingJFramePeer(this, target); } */ + } + }; + + //peer frames should be created in the same app context where the desktop is + //todo refactor this into a generic inter-appcontext invoke and wait + AppContext ac = SunToolkit.targetToAppContext(target); + if (ac != null) { + EventQueue eq = (EventQueue) ac.get(sun.awt.AppContext.EVENT_QUEUE_KEY); + if (eq != null) { + try { + EventQueue.class.getMethod("initDispatchThread").invoke(eq); + } catch (Exception x) { + x.printStackTrace(); + } + } + } + + // invoke and wait -- + EventQueue eq = getMainEventQueue(); + + if (eq == getSystemEventQueueImpl()) { + run.run(); + synchronized (ret) { + return ret[0]; + } + } + + try { + Thread edt = (Thread) EventQueue.class.getField("dispatchThread").get(eq); + if (Thread.currentThread() == edt) { + run.run(); + synchronized (ret) { + return ret[0]; + } + } + } catch (Exception x) { + throw new RuntimeException(x); + } + + class AWTInvocationLock { + } + Object lock = new AWTInvocationLock(); + + InvocationEvent event = new InvocationEvent(Toolkit.getDefaultToolkit(), run, lock, true); + + try { + synchronized (lock) { + eq.postEvent(event); + lock.wait(); + } + } catch (Exception x) { + throw new RuntimeException(x); + } + + Throwable eventThrowable = event.getThrowable(); + if (eventThrowable != null) { + throw new RuntimeException(eventThrowable); + } + + // --invoke and wait + + synchronized (ret) { + return ret[0]; + } } protected LabelPeer createLabel(Label target) { @@ -469,7 +551,7 @@ try { MetalLookAndFeel.setCurrentTheme(new OceanTheme()); - UIManager.setLookAndFeel(new MetalLookAndFeel()); + UIManager.setLookAndFeel(new MetalLookAndFeel()); } catch (Exception x) { log.warn("Look And Feel not found: ", x); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |