From: <fd...@us...> - 2008-08-01 22:50:57
|
Revision: 4381 http://jnode.svn.sourceforge.net/jnode/?rev=4381&view=rev Author: fduminy Date: 2008-08-01 22:50:50 +0000 (Fri, 01 Aug 2008) Log Message: ----------- - fixed conflict between displaying of FBConsole and JNode desktop Modified Paths: -------------- trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java trunk/gui/src/awt/org/jnode/awt/StartAwt.java trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreen.java trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenManager.java trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenPlugin.java trunk/gui/src/driver/org/jnode/driver/video/AbstractFrameBufferDriver.java trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPI.java Added Paths: ----------- trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPIOwner.java Removed Paths: ------------- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbScreenPainter.java Modified: trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/awt/org/jnode/awt/JNodeToolkit.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -82,17 +82,21 @@ import org.jnode.driver.sound.speaker.SpeakerUtils; import org.jnode.driver.video.AlreadyOpenException; import org.jnode.driver.video.FrameBufferAPI; +import org.jnode.driver.video.FrameBufferAPIOwner; import org.jnode.driver.video.Surface; import org.jnode.driver.video.UnknownConfigurationException; import org.jnode.naming.InitialNaming; +import org.jnode.vm.Unsafe; + import sun.awt.image.ToolkitImage; /** * @author epr * @author Levente S\u00e1ntha */ -public abstract class JNodeToolkit extends ClasspathToolkit { - protected final Logger log = Logger.getLogger(getClass()); +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; @@ -332,6 +336,7 @@ graphics.close(); } + final FrameBufferAPI savedApi = this.api; this.api = null; this.graphics = null; this.keyboardHandler = null; @@ -352,6 +357,7 @@ graphicsMode = false; initCloseLock.notifyAll(); } + savedApi.releaseOwnership(this); return 0; } else { return rc; @@ -669,6 +675,7 @@ this.api = fbDevice.getAPI(); try { log.debug("Opening AWT: Using fbDevice " + fbDevice.getIDstring()); + api.requestOwnership(this); this.graphics = api.open(config.getConfig()); if (graphics == null) { log.debug("No Graphics for fbDevice: " + fbDevice.getIDstring()); @@ -859,6 +866,14 @@ graphicsMode = false; initCloseLock.notifyAll(); } + + try { + Unsafe.debug("leaveGUI : before releaseOwnership"); + api.releaseOwnership(this); + Unsafe.debug("leaveGUI : after releaseOwnership"); + } catch (Throwable t) { + Unsafe.debugStackTrace(t); + } } /** @@ -866,7 +881,8 @@ */ 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(), @@ -1058,4 +1074,45 @@ //todo implementit return null; } + + @Override + public void ownershipLost() { + if (isGuiActive()) { + leaveGUI(); + } + } + + @Override + public void ownershipGained() { + startAwt(); + } + + static void startAwt() { + if (JNodeToolkit.isGuiActive()) { + ((JNodeToolkit) JNodeToolkit.getDefaultToolkit()).joinGUI(); + JNodeToolkit.waitUntilStopped(); + } else { + JNodeToolkit.startGui(); + try { + final String desktopClassName = System.getProperty("jnode.desktop"); + if (desktopClassName != null) { + final Class<?> desktopClass = + Thread.currentThread().getContextClassLoader().loadClass(desktopClassName); + final Object desktop = desktopClass.newInstance(); + if (desktop instanceof Runnable) { + final Thread t = new Thread((Runnable) desktop); + t.start(); + } + } + } catch (ClassNotFoundException ex) { + log.error("Cannot find desktop class", ex); + } catch (InstantiationException ex) { + log.error("Cannot instantiate desktop class", ex); + } catch (IllegalAccessException ex) { + log.error("Cannot access desktop class", ex); + } finally { + JNodeToolkit.waitUntilStopped(); + } + } + } } Modified: trunk/gui/src/awt/org/jnode/awt/StartAwt.java =================================================================== --- trunk/gui/src/awt/org/jnode/awt/StartAwt.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/awt/org/jnode/awt/StartAwt.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -21,7 +21,6 @@ package org.jnode.awt; -import org.apache.log4j.Logger; /** * @author Ewout Prangsma (ep...@us...) @@ -29,8 +28,6 @@ */ public class StartAwt implements Runnable { - private static final Logger log = Logger.getLogger(StartAwt.class); - public static void main(String[] args) { new StartAwt().run(); } @@ -39,31 +36,6 @@ * @see java.lang.Runnable#run() */ public void run() { - if (JNodeToolkit.isGuiActive()) { - ((JNodeToolkit) JNodeToolkit.getDefaultToolkit()).joinGUI(); - JNodeToolkit.waitUntilStopped(); - } else { - JNodeToolkit.startGui(); - try { - final String desktopClassName = System.getProperty("jnode.desktop"); - if (desktopClassName != null) { - final Class desktopClass = - Thread.currentThread().getContextClassLoader().loadClass(desktopClassName); - final Object desktop = desktopClass.newInstance(); - if (desktop instanceof Runnable) { - final Thread t = new Thread((Runnable) desktop); - t.start(); - } - } - } catch (ClassNotFoundException ex) { - log.error("Cannot find desktop class", ex); - } catch (InstantiationException ex) { - log.error("Cannot instantiate desktop class", ex); - } catch (IllegalAccessException ex) { - log.error("Cannot access desktop class", ex); - } finally { - JNodeToolkit.waitUntilStopped(); - } - } + JNodeToolkit.startAwt(); } } Modified: trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -4,7 +4,9 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Collection; + import javax.naming.NameNotFoundException; + import org.apache.log4j.Logger; import org.jnode.driver.Device; import org.jnode.driver.DeviceManagerListener; @@ -14,12 +16,10 @@ import org.jnode.driver.textscreen.TextScreenManager; import org.jnode.driver.video.FrameBufferAPI; import org.jnode.driver.video.FrameBufferConfiguration; -import org.jnode.driver.video.Surface; import org.jnode.naming.InitialNaming; import org.jnode.shell.CommandShell; import org.jnode.shell.ShellManager; import org.jnode.shell.ShellUtils; -import org.jnode.vm.Unsafe; import org.jnode.vm.VmSystem; /** @@ -29,31 +29,28 @@ private static final Logger log = Logger.getLogger(FBConsole.class); /** - * TODO use a listener mechanism instead + * TODO use a listener mechanism instead */ private static void waitShellManagerAvailable() { - Unsafe.debug("waiting registration of a ShellManager"); while (true) { try { ShellManager mgr = ShellUtils.getShellManager(); if (mgr != null) { - Unsafe.debug("got a ShellManager"); break; } } catch (NameNotFoundException e) { // not yet available } - + // not yet available Thread.yield(); } } - + public static void start() throws Exception { waitShellManagerAvailable(); - Unsafe.debug("searching for already registered FrameBufferDevice\n"); Device dev = null; final Collection<Device> devs = DeviceUtils.getDevicesByAPI(FrameBufferAPI.class); int dev_count = devs.size(); @@ -63,13 +60,10 @@ } if (dev == null) { - Unsafe.debug("waiting registration of a FrameBufferDevice\n"); DeviceUtils.getDeviceManager().addListener(new DeviceManagerListener() { public void deviceRegistered(Device device) { - Unsafe.debug("device=" + device + "\n"); - if (device.implementsAPI(FrameBufferAPI.class)) { - Unsafe.debug("got a FrameBufferDevice\n"); + if (device.implementsAPI(FrameBufferAPI.class)) { startFBConsole(device); } } @@ -79,34 +73,31 @@ } }); } else { - Unsafe.debug("FrameBufferDevice already available\n"); startFBConsole(dev); } } - + private static void startFBConsole(Device dev) { - Unsafe.debug("startFBConsole\n"); - Surface g = null; + FbTextScreenManager fbTsMgr = null; try { final FrameBufferAPI api = dev.getAPI(FrameBufferAPI.class); final FrameBufferConfiguration conf = api.getConfigurations()[0]; - g = api.open(conf); - + fbTsMgr = new FbTextScreenManager(api, conf); InitialNaming.unbind(TextScreenManager.NAME); - InitialNaming.bind(TextScreenManager.NAME, new FbTextScreenManager(g)); - + InitialNaming.bind(TextScreenManager.NAME, fbTsMgr); + //// ConsoleManager mgr = InitialNaming.lookup(ConsoleManager.NAME); - + // final int options = ConsoleManager.CreateOptions.TEXT | ConsoleManager.CreateOptions.SCROLLABLE; final TextConsole first = (TextConsole) mgr.createConsole( - null, options); - - mgr.registerConsole(first); + null, options); + + mgr.registerConsole(first); mgr.focus(first); AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { @@ -125,13 +116,12 @@ Thread.sleep(60 * 1000); } catch (Throwable ex) { - Unsafe.debugStackTrace("Error in FBConsole", ex); + log.error("Error in FBConsole", ex); } finally { - Unsafe.debug("FINALLY\n"); - if (g != null) { + if (fbTsMgr != null) { log.info("Close graphics"); - g.close(); + fbTsMgr.ownershipLost(); } - } + } } } Deleted: trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbScreenPainter.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbScreenPainter.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbScreenPainter.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -1,88 +0,0 @@ -package org.jnode.driver.textscreen.fb; - -import java.awt.Color; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import org.jnode.driver.video.Surface; - -/** - * @author Levente S\u00e1ntha - */ -class FbScreenPainter { - private static final int margin = 5; - private static final int w = 7; - private static final int h = 18; - private final Surface surface; - private final int sw; - private final int sh; - private final BufferedImage buffer; - private final Graphics graphics; - private final Font font; - private final FbTextScreen screen; - private final Thread painterThread; - private final Background background; - private boolean update = true; - - public FbScreenPainter(FbTextScreen screen, Surface g) { - this.screen = screen; - this.surface = g; - sh = h * screen.getHeight() + 2 * margin; - sw = w * screen.getWidth() + 2 * margin; - - //background = new DefaultBackground(Color.BLACK); - background = new GradientBackground(sw, sh); - - buffer = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_ARGB); - graphics = buffer.getGraphics(); - font = new Font( - "-FontForge-Bitstream Vera Sans Mono-Book-R-Normal-SansMono--12-120-75-75-P-69-ISO10646", Font.PLAIN, 12); - - painterThread = new Thread(new Runnable() { - public void run() { - while (true) { - try { - paintComponent(); - synchronized (FbScreenPainter.this) { - if (update) { - update = false; - FbScreenPainter.this.wait(); - } - } - } catch (InterruptedException x) { - break; - } - } - } - }, "FbScreenPainter"); - painterThread.start(); - } - - protected void paintComponent() { - background.paint(graphics); - - graphics.setColor(Color.WHITE); - graphics.setFont(font); - - final char[] textBuffer = screen.getBuffer(); - final int length = screen.getWidth(); - int offset = 0; - final int x = margin; - int y = h; - - for (int i = 0; i < screen.getHeight(); i++) { - graphics.drawChars(textBuffer, offset, length, x, y); - - offset += length; - y += h; - } - surface.drawCompatibleRaster(buffer.getRaster(), 0, 0, 0, 0, sw, sh, Color.BLACK); - } - - public synchronized void repaint() { - if (!update) { - update = true; - notifyAll(); - } - } -} Modified: trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreen.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreen.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreen.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -21,6 +21,10 @@ package org.jnode.driver.textscreen.fb; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.image.BufferedImage; import java.util.Arrays; import org.jnode.driver.textscreen.TextScreen; @@ -29,21 +33,41 @@ class FbTextScreen extends AbstractPcTextScreen { - private static final int SCREEN_WIDTH = 80; - private static final int SCREEN_HEIGHT = 25; - + private final Font font; private final char[] buffer; private int cursorOffset; private boolean cursorVisible = true; - private final FbScreenPainter painter; - - public FbTextScreen(Surface g) { - super(SCREEN_WIDTH, SCREEN_HEIGHT); - buffer = new char[SCREEN_WIDTH * SCREEN_HEIGHT]; - painter = new FbScreenPainter(this, g); + private FbScreenPainter painter; + private final Surface surface; + private final Background background; + private final BufferedImage bufferedImage; + private final Graphics graphics; + private final int margin; + + /** + * + * @param g + * @param width in pixels + * @param height in pixels + */ + public FbTextScreen(Surface g, BufferedImage bufferedImage, Graphics graphics, Font font, int nbColumns, + int nbRows, int margin) { + super(nbColumns, nbRows); + buffer = new char[getWidth() * getHeight()]; Arrays.fill(buffer, ' '); + + //this.background = new DefaultBackground(Color.BLACK); + this.background = new GradientBackground(bufferedImage.getWidth(), bufferedImage.getHeight()); + + this.surface = g; + this.bufferedImage = bufferedImage; + this.graphics = graphics; + this.font = font; + this.margin = margin; + + open(); } public char getChar(int offset) { @@ -90,7 +114,9 @@ } public void sync(int offset, int length) { - painter.repaint(); + if (painter != null) { + painter.repaint(); + } } public int setCursor(int x, int y) { @@ -129,4 +155,79 @@ return buffer; } + class FbScreenPainter { + private final Thread painterThread; + + private boolean stop = false; + private boolean update = true; + + public FbScreenPainter() { + painterThread = new Thread(new Runnable() { + public void run() { + while (!stop) { + try { + paintComponent(); + synchronized (FbScreenPainter.this) { + if (update) { + update = false; + FbScreenPainter.this.wait(); + } + } + } catch (InterruptedException x) { + break; + } + } + } + }, "FbScreenPainter"); + painterThread.start(); + } + + private void stop() { + this.stop = true; + } + + protected void paintComponent() { + background.paint(graphics); + + graphics.setColor(Color.WHITE); + graphics.setFont(font); + + final int fontHeight = graphics.getFontMetrics().getHeight(); + + final char[] textBuffer = getBuffer(); + final int length = getWidth(); + int offset = 0; + final int x = margin; + int y = fontHeight + margin; + + for (int i = 0; i < getHeight(); i++) { + graphics.drawChars(textBuffer, offset, length, x, y); + + offset += length; + y += fontHeight; + } + surface.drawCompatibleRaster(bufferedImage.getRaster(), 0, 0, 0, 0, bufferedImage.getWidth(), + bufferedImage.getHeight(), Color.BLACK); + } + + public synchronized void repaint() { + if (!update) { + update = true; + notifyAll(); + } + } + } + + void close() { + if (painter != null) { + painter.stop(); + painter = null; + } + } + + void open() { + if (painter == null) { + painter = new FbScreenPainter(); + } + } } Modified: trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenManager.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenManager.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenManager.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -21,16 +21,66 @@ package org.jnode.driver.textscreen.fb; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.image.BufferedImage; + +import org.jnode.driver.DeviceException; import org.jnode.driver.textscreen.TextScreen; import org.jnode.driver.textscreen.TextScreenManager; +import org.jnode.driver.video.AlreadyOpenException; +import org.jnode.driver.video.FrameBufferAPI; +import org.jnode.driver.video.FrameBufferAPIOwner; +import org.jnode.driver.video.FrameBufferConfiguration; import org.jnode.driver.video.Surface; +import org.jnode.driver.video.UnknownConfigurationException; -final class FbTextScreenManager implements TextScreenManager { - +final class FbTextScreenManager implements TextScreenManager, FrameBufferAPIOwner { + /** + * The font to use for rendering characters in the console : + * it must be a mono spaced font (=a font with fixed width) + */ + private static final Font FONT = new Font( + "-FontForge-Bitstream Vera Sans Mono-Book-R-Normal-SansMono--12-120-75-75-P-69-ISO10646", + Font.PLAIN, 12); + private static final int MARGIN = 5; + private final FbTextScreen systemScreen; - FbTextScreenManager(Surface g) { - systemScreen = new FbTextScreen(g); + /** + * + * @param g + * @param width in pixels + * @param height in pixels + * @throws DeviceException + * @throws AlreadyOpenException + * @throws UnknownConfigurationException + */ + FbTextScreenManager(FrameBufferAPI api, FrameBufferConfiguration conf) + throws UnknownConfigurationException, AlreadyOpenException, DeviceException { + BufferedImage bufferedImage = new BufferedImage(conf.getScreenWidth(), conf.getScreenHeight(), + BufferedImage.TYPE_INT_ARGB); + Graphics graphics = bufferedImage.getGraphics(); + + //TODO wait for SurfaceGraphics2D implementation + textscreen supporting something else that 80x25 +/* + final Rectangle2D bounds = graphics.getFontMetrics().getStringBounds("Z", graphics); + final int fontHeight = (int) bounds.getHeight(); + final int fontWidth = (int) bounds.getWidth(); + + int nbColumns = (width - 2 * MARGIN) / fontWidth; + Unsafe.debug("getHeight: height=" + height + " font.width=" + fontWidth + " result=" + nbColumns); + + int nbRows = (height - 2 * MARGIN) / fontHeight; + Unsafe.debug("getWidth: width=" + width + " font.height=" + fontHeight + " result=" + nbRows); +*/ + final int nbColumns = 80; + final int nbRows = 25; + + api.requestOwnership(this); + Surface g = api.open(conf); + + systemScreen = new FbTextScreen(g, bufferedImage, graphics, FONT, nbColumns, nbRows, MARGIN); } /** @@ -40,4 +90,19 @@ return systemScreen; } + @Override + public void ownershipLost() { + // systemScreen might be null at construction time + if (systemScreen != null) { + systemScreen.close(); + } + } + + @Override + public void ownershipGained() { + // systemScreen might be null at construction time + if (systemScreen != null) { + systemScreen.open(); + } + } } Modified: trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenPlugin.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenPlugin.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FbTextScreenPlugin.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -31,14 +31,11 @@ public final class FbTextScreenPlugin extends Plugin { - // private final FbTextScreenManager mgr; - /** * @param descriptor */ public FbTextScreenPlugin(PluginDescriptor descriptor) { super(descriptor); - // this.mgr = new FbTextScreenManager(); } /** @@ -53,9 +50,7 @@ @Override public void run() { try { - Unsafe.debug("before FBConsole.start()\n"); FBConsole.start(); - Unsafe.debug("after FBConsole.start()\n"); } catch (Throwable e) { Unsafe.debugStackTrace(e); } Modified: trunk/gui/src/driver/org/jnode/driver/video/AbstractFrameBufferDriver.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/video/AbstractFrameBufferDriver.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/video/AbstractFrameBufferDriver.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -21,6 +21,8 @@ package org.jnode.driver.video; +import java.util.Stack; + import javax.naming.NameNotFoundException; import org.apache.log4j.Logger; @@ -42,6 +44,8 @@ /** Device name prefix of framebuffer devices */ public static final String FB_DEVICE_PREFIX = "fb"; + private Stack<FrameBufferAPIOwner> owners = new Stack<FrameBufferAPIOwner>(); + /** * @see org.jnode.driver.Driver#startDevice() */ @@ -58,7 +62,60 @@ device.registerAPI(FrameBufferAPI.class, this); } + /** + * Request to be the owner of the underlying FrameBuffer device. + * The old owner (if any) will receive a request to stop using the underlying FrameBuffer device. + * + * @param owner + */ + @Override + public final void requestOwnership(FrameBufferAPIOwner owner) { + FrameBufferAPIOwner oldOwner = null; + if (!owners.isEmpty()) { + oldOwner = owners.peek(); + } + + owners.push(owner); + + if (oldOwner != null) { + oldOwner.ownershipLost(); + } + + // the owner doesn't need to be notified since the caller knows it + // ... + } + + /** + * Request to be the owner of the underlying FrameBuffer device. + * The old owner (if any) will receive a request to stop using the underlying FrameBuffer device. + * + * @param owner + */ + @Override + public final void releaseOwnership(FrameBufferAPIOwner owner) { + FrameBufferAPIOwner newOwner = null; + + if (!owners.isEmpty()) { + if (owners.peek().equals(owner)) { + // the owner doesn't need to be notified since the caller knows it + // simply remove it from the stack + owners.pop(); + if (!owners.isEmpty()) { + newOwner = owners.peek(); + } + } else { + throw new IllegalArgumentException("parameter is not the current owner"); + } + } + + // notify new owner (if any) that he gained ownership + if (newOwner != null) { + newOwner.ownershipGained(); + } + } + + /** * @see org.jnode.driver.Driver#stopDevice() */ protected void stopDevice() throws DriverException { Modified: trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPI.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPI.java 2008-08-01 22:42:32 UTC (rev 4380) +++ trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPI.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -57,8 +57,25 @@ * @return */ public boolean isOpen(); + + /** + * Request to be the owner of the underlying FrameBuffer device. + * The old owner (if any) will receive a request to stop using the underlying FrameBuffer device. + * + * @param owner + * @return true if owner can now start using exclusively the underlying FrameBuffer device. + */ + public void requestOwnership(FrameBufferAPIOwner owner); /** + * Request the ownership on the underlying FrameBuffer device. + * + * @param owner + * @return true if owner can now start using exclusively the underlying FrameBuffer device. + */ + public void releaseOwnership(FrameBufferAPIOwner owner); + + /** * Gets the currently opened framebuffer configuration. * * @return Added: trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPIOwner.java =================================================================== --- trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPIOwner.java (rev 0) +++ trunk/gui/src/driver/org/jnode/driver/video/FrameBufferAPIOwner.java 2008-08-01 22:50:50 UTC (rev 4381) @@ -0,0 +1,13 @@ +package org.jnode.driver.video; + +public interface FrameBufferAPIOwner { + /** + * Ask the owner to free the ownership + */ + void ownershipLost(); + + /** + * Called by the {@link FrameBufferAPI} when the ownership is given again to the {@link FrameBufferAPIOwner} + */ + void ownershipGained(); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |