libbluray | branch: master | hpi1 <[email protected]> | Sat Mar 30 01:53:54 2013 +0200| [a8a50855a08d21032ddd9418593d216f29cdcb08] | committer: hpi1
Per-xlet event queues > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=a8a50855a08d21032ddd9418593d216f29cdcb08 --- .../bdj/java-j2me/java/awt/BDToolkit.java | 38 ++++++++++++++++++++ .../bdj/java-j2se/java/awt/BDToolkit.java | 38 ++++++++++++++++++++ src/libbluray/bdj/java/java/awt/BDRootWindow.java | 6 +++- src/libbluray/bdj/java/org/havi/ui/HComponent.java | 3 ++ src/libbluray/bdj/java/org/havi/ui/HScene.java | 3 ++ .../bdj/java/org/videolan/BDJAppProxy.java | 18 ++++++++++ .../bdj/java/org/videolan/BDJXletContext.java | 10 ++++++ 7 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/libbluray/bdj/java-j2me/java/awt/BDToolkit.java b/src/libbluray/bdj/java-j2me/java/awt/BDToolkit.java index c439fad..7798506 100644 --- a/src/libbluray/bdj/java-j2me/java/awt/BDToolkit.java +++ b/src/libbluray/bdj/java-j2me/java/awt/BDToolkit.java @@ -23,7 +23,9 @@ import java.awt.image.ColorModel; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.net.URL; +import java.util.Collections; import java.util.Hashtable; +import java.util.WeakHashMap; import java.util.Map; import java.util.Iterator; @@ -193,7 +195,43 @@ public class BDToolkit extends Toolkit { public void beep() { } + // mapping of Components to AppContexts, WeakHashMap<Component,AppContext> + private static final Map contextMap = + Collections.synchronizedMap(new WeakHashMap()); + + public static void addComponent(Component component) { + + BDJXletContext context = BDJXletContext.getCurrentContext(); + if (context == null) { + logger.warning("addComponent() outside of app context"); + return; + } + contextMap.put(component, context); + } + + public static EventQueue getEventQueue(Component component) { + if (component != null) { + BDJXletContext ctx = (BDJXletContext)contextMap.get(component); + if (ctx != null) { + EventQueue eq = ctx.getEventQueue(); + if (eq == null) { + logger.warning("getEventQueue() failed: no context event queue"); + } + return eq; + } + logger.warning("getEventQueue() failed: no context"); + } + return null; + } + protected EventQueue getSystemEventQueueImpl() { + BDJXletContext ctx = BDJXletContext.getCurrentContext(); + if (ctx != null) { + EventQueue eq = ctx.getEventQueue(); + if (eq != null) { + return eq; + } + } return eventQueue; } } diff --git a/src/libbluray/bdj/java-j2se/java/awt/BDToolkit.java b/src/libbluray/bdj/java-j2se/java/awt/BDToolkit.java index fecec43..c35b1e1 100644 --- a/src/libbluray/bdj/java-j2se/java/awt/BDToolkit.java +++ b/src/libbluray/bdj/java-j2se/java/awt/BDToolkit.java @@ -25,7 +25,9 @@ import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.awt.peer.KeyboardFocusManagerPeer; import java.net.URL; +import java.util.Collections; import java.util.Hashtable; +import java.util.WeakHashMap; import java.util.Map; import java.util.Iterator; @@ -206,7 +208,43 @@ public class BDToolkit extends Toolkit implements KeyboardFocusManagerPeerProvid public void beep() { } + // mapping of Components to AppContexts, WeakHashMap<Component,AppContext> + private static final Map contextMap = + Collections.synchronizedMap(new WeakHashMap()); + + public static void addComponent(Component component) { + + BDJXletContext context = BDJXletContext.getCurrentContext(); + if (context == null) { + logger.warning("addComponent() outside of app context"); + return; + } + contextMap.put(component, context); + } + + public static EventQueue getEventQueue(Component component) { + if (component != null) { + BDJXletContext ctx = (BDJXletContext)contextMap.get(component); + if (ctx != null) { + EventQueue eq = ctx.getEventQueue(); + if (eq == null) { + logger.warning("getEventQueue() failed: no context event queue"); + } + return eq; + } + logger.warning("getEventQueue() failed: no context"); + } + return null; + } + protected EventQueue getSystemEventQueueImpl() { + BDJXletContext ctx = BDJXletContext.getCurrentContext(); + if (ctx != null) { + EventQueue eq = ctx.getEventQueue(); + if (eq != null) { + return eq; + } + } return eventQueue; } diff --git a/src/libbluray/bdj/java/java/awt/BDRootWindow.java b/src/libbluray/bdj/java/java/awt/BDRootWindow.java index 1fa8274..d0a35d9 100644 --- a/src/libbluray/bdj/java/java/awt/BDRootWindow.java +++ b/src/libbluray/bdj/java/java/awt/BDRootWindow.java @@ -66,6 +66,10 @@ public class BDRootWindow extends Frame { return null; } + public static void stopEventQueue(EventQueue eq) { + eq.getDispatchThread().stopDispatching(); + } + public void postKeyEvent(int id, int modifiers, int keyCode) { Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner(); if (focusOwner != null) { @@ -76,7 +80,7 @@ public class BDRootWindow extends Frame { event = new KeyEvent(focusOwner, id, when, modifiers, KeyEvent.VK_UNDEFINED, (char)keyCode); else event = new KeyEvent(focusOwner, id, when, modifiers, keyCode, KeyEvent.CHAR_UNDEFINED); - Toolkit.getEventQueue().postEvent(event); + BDToolkit.getEventQueue(focusOwner).postEvent(event); return; } catch (Throwable e) { System.err.println(" *** " + e + ""); diff --git a/src/libbluray/bdj/java/org/havi/ui/HComponent.java b/src/libbluray/bdj/java/org/havi/ui/HComponent.java index 5459d58..c853952 100644 --- a/src/libbluray/bdj/java/org/havi/ui/HComponent.java +++ b/src/libbluray/bdj/java/org/havi/ui/HComponent.java @@ -24,11 +24,14 @@ import java.awt.AWTEvent; import java.awt.Component; import org.dvb.ui.TestOpacity; +import java.awt.BDToolkit; + public abstract class HComponent extends Component implements HMatteLayer, TestOpacity { public HComponent() { this(0, 0, 0, 0); + BDToolkit.addComponent(this); } public HComponent(int x, int y, int width, int height) diff --git a/src/libbluray/bdj/java/org/havi/ui/HScene.java b/src/libbluray/bdj/java/org/havi/ui/HScene.java index e614a04..336b91a 100644 --- a/src/libbluray/bdj/java/org/havi/ui/HScene.java +++ b/src/libbluray/bdj/java/org/havi/ui/HScene.java @@ -36,10 +36,13 @@ import java.util.Map; import org.havi.ui.event.HEventGroup; import org.videolan.BDJXletContext; import org.videolan.GUIManager; +import java.awt.BDToolkit; + public class HScene extends Container implements HComponentOrdering { protected HScene() { context = BDJXletContext.getCurrentContext(); + BDToolkit.addComponent(this); } public BDJXletContext getXletContext() { diff --git a/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java b/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java index 1b84004..824c171 100644 --- a/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java +++ b/src/libbluray/bdj/java/org/videolan/BDJAppProxy.java @@ -23,6 +23,8 @@ import org.dvb.application.AppStateChangeEvent; import org.dvb.application.AppStateChangeEventListener; import org.dvb.application.DVBJProxy; +import java.awt.EventQueue; + import java.io.File; import java.util.LinkedList; import javax.tv.xlet.Xlet; @@ -37,6 +39,14 @@ public class BDJAppProxy implements DVBJProxy, Runnable { thread = new Thread(threadGroup, this); thread.setDaemon(true); thread.start(); + + /* wait until thread has been started and event queue is initialized. + * We want event dispatcher thread to be inside xlet thread group + * -> event queue must be created from thread running inside applet thread group. + */ + while (context.getEventQueue() == null) { + Thread.yield(); + } } public int getState() { @@ -136,6 +146,12 @@ public class BDJAppProxy implements DVBJProxy, Runnable { } catch (InterruptedException e) { } + + EventQueue eq = context.getEventQueue(); + context.setEventQueue(null); + if (eq != null) { + GUIManager.stopEventQueue(eq); + } } public void addAppStateChangeEventListener(AppStateChangeEventListener listener) { @@ -275,6 +291,8 @@ public class BDJAppProxy implements DVBJProxy, Runnable { } public void run() { + context.setEventQueue(new EventQueue()); + for (;;) { AppCommand cmd; synchronized(cmds) { diff --git a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java index 81c9a61..5112cbe 100644 --- a/src/libbluray/bdj/java/org/videolan/BDJXletContext.java +++ b/src/libbluray/bdj/java/org/videolan/BDJXletContext.java @@ -19,6 +19,7 @@ package org.videolan; import java.awt.Container; +import java.awt.EventQueue; import java.security.AccessController; import java.security.PrivilegedAction; @@ -81,6 +82,14 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi return loader; } + protected void setEventQueue(EventQueue eq) { + eventQueue = eq; + } + + public EventQueue getEventQueue() { + return eventQueue; + } + public static BDJXletContext getCurrentContext() { Object obj = AccessController.doPrivileged( new PrivilegedAction() { @@ -114,4 +123,5 @@ public class BDJXletContext implements javax.tv.xlet.XletContext, javax.microedi private AppID appid; private BDJClassLoader loader; private Container container; + private EventQueue eventQueue = null; } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
