|
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.
|