From: <fd...@us...> - 2008-08-02 19:25:50
|
Revision: 4386 http://jnode.svn.sourceforge.net/jnode/?rev=4386&view=rev Author: fduminy Date: 2008-08-02 19:25:44 +0000 (Sat, 02 Aug 2008) Log Message: ----------- fix for following FBConsole bugs : - impossible to switch to the log4j console - the main console is loosing some lines at boot time Modified Paths: -------------- trunk/core/src/driver/org/jnode/driver/console/Console.java trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsole.java trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java Modified: trunk/core/src/driver/org/jnode/driver/console/Console.java =================================================================== --- trunk/core/src/driver/org/jnode/driver/console/Console.java 2008-08-02 18:44:38 UTC (rev 4385) +++ trunk/core/src/driver/org/jnode/driver/console/Console.java 2008-08-02 19:25:44 UTC (rev 4386) @@ -23,6 +23,7 @@ import org.jnode.driver.input.KeyboardListener; import org.jnode.driver.input.PointerListener; +import org.jnode.driver.textscreen.TextScreen; import org.jnode.system.event.FocusListener; /** @@ -111,4 +112,10 @@ * @return */ public ConsoleManager getManager(); + + /** + * Method called to notify the {@link Console} that the system {@link TextScreen} has changed + * @param textScreen the new system {@link TextScreen} + */ + public void systemScreenChanged(TextScreen textScreen); } Modified: trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java =================================================================== --- trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java 2008-08-02 18:44:38 UTC (rev 4385) +++ trunk/core/src/driver/org/jnode/driver/console/ConsoleManager.java 2008-08-02 19:25:44 UTC (rev 4386) @@ -25,6 +25,7 @@ import java.util.Set; import org.jnode.driver.input.KeyboardListener; import org.jnode.driver.input.PointerListener; +import org.jnode.driver.textscreen.TextScreenManager; /** * @author epr @@ -151,4 +152,10 @@ public Console createConsole(String name, int options); public void printConsoles(PrintStream ps); + + /** + * That method is called when the system {@link TextScreenManager} has changed + * It's a temporary workaround. FIXME : create and use a listener mechanism in InitialNaming instead + */ + public void textScreenManagerChanged(); } Modified: trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsole.java =================================================================== --- trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsole.java 2008-08-02 18:44:38 UTC (rev 4385) +++ trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsole.java 2008-08-02 19:25:44 UTC (rev 4386) @@ -26,6 +26,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; +import org.jnode.driver.console.Console; import org.jnode.driver.console.ConsoleManager; import org.jnode.driver.console.InputCompleter; import org.jnode.driver.console.TextConsole; @@ -47,7 +48,7 @@ /** * The screen I'm writing on */ - private final TextScreen screen; + private TextScreen screen; /** * Width of the screen @@ -89,6 +90,11 @@ private final boolean claimSystemOutErr; private VmIsolate myIsolate; + + /** + * The options used to create this {@link TextScreenConsole} + */ + private final int options; /** * @param mgr @@ -97,6 +103,7 @@ */ public TextScreenConsole(ConsoleManager mgr, String name, TextScreen screen, int options) { super(mgr, name); + this.options = options; this.screen = screen; this.scrWidth = screen.getWidth(); this.scrHeight = screen.getHeight(); @@ -412,4 +419,31 @@ protected final TextScreen getScreen() { return this.screen; } + + /** + * Get the options used to create this {@link TextScreenConsole} + * @return + */ + final int getOptions() { + return options; + } + + /** + * @see Console#systemScreenChanged(TextScreen) + */ + @Override + public void systemScreenChanged(TextScreen systemScreen) { + // ensure that old and new screens are compatible + if ((systemScreen.getWidth() != screen.getWidth()) || (systemScreen.getHeight() != screen.getHeight())) { + throw new IllegalArgumentException("old and new screen have different sizes"); + } + + TextScreen oldScreen = screen; + screen = systemScreen; + + final int size = oldScreen.getWidth() * oldScreen.getHeight(); + oldScreen.ensureVisible(0, isFocused()); + oldScreen.copyTo(screen, 0, size); + syncScreen(0, size); + } } Modified: trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java =================================================================== --- trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java 2008-08-02 18:44:38 UTC (rev 4385) +++ trunk/core/src/driver/org/jnode/driver/console/textscreen/TextScreenConsoleManager.java 2008-08-02 19:25:44 UTC (rev 4386) @@ -25,6 +25,7 @@ import javax.naming.NameNotFoundException; +import org.jnode.driver.console.Console; import org.jnode.driver.console.ConsoleException; import org.jnode.driver.console.spi.AbstractConsoleManager; import org.jnode.driver.textscreen.ScrollableTextScreen; @@ -54,8 +55,7 @@ */ public TextScreenConsole createConsole(String name, int options) { if ((options & CreateOptions.TEXT) != 0) { - final TextScreenManager tsm; - tsm = getTextScreenManager(); + final TextScreenManager tsm = getTextScreenManager(); final TextScreenConsole console; if (name == null) { name = autoName(); @@ -122,6 +122,24 @@ } } + + @Override + public void textScreenManagerChanged() { + final TextScreen systemScreen = getTextScreenManager().getSystemScreen(); + + for (Console c : getConsoles()) { + TextScreenConsole console = (TextScreenConsole) c; + + final TextScreen screen; + if ((console.getOptions() & CreateOptions.SCROLLABLE) != 0) { + screen = systemScreen.createCompatibleScrollableBufferScreen(SCROLLABLE_HEIGHT); + } else { + screen = systemScreen.createCompatibleBufferScreen(); + } + console.systemScreenChanged(screen); + } + } + /* protected void setAccelerator(Console console) { for (int i = 0; i < 12; i++) { 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-02 18:44:38 UTC (rev 4385) +++ trunk/gui/src/driver/org/jnode/driver/textscreen/fb/FBConsole.java 2008-08-02 19:25:44 UTC (rev 4386) @@ -20,7 +20,6 @@ import org.jnode.shell.CommandShell; import org.jnode.shell.ShellManager; import org.jnode.shell.ShellUtils; -import org.jnode.vm.VmSystem; /** * @author Levente S\u00e1ntha @@ -87,34 +86,21 @@ InitialNaming.unbind(TextScreenManager.NAME); InitialNaming.bind(TextScreenManager.NAME, fbTsMgr); - //// + //// FIXME we shouldn't be forced to call that : a better (and more generic) solution would be to use a listener on InitialNaming binding changes ConsoleManager mgr = InitialNaming.lookup(ConsoleManager.NAME); + mgr.textScreenManagerChanged(); + //// - // - final int options = ConsoleManager.CreateOptions.TEXT | - ConsoleManager.CreateOptions.SCROLLABLE; - - final TextConsole first = (TextConsole) mgr.createConsole( - null, options); - - mgr.registerConsole(first); - mgr.focus(first); - AccessController.doPrivileged(new PrivilegedAction<Object>() { - public Object run() { - System.setOut(new PrintStream(first.getOut())); - System.setErr(new PrintStream(first.getErr())); - return null; - } - }); - System.out.println(VmSystem.getBootLog()); - - if (first.getIn() == null) { - throw new Exception("console input is null"); - } - + //// FIXME we shouldn't need that code since command shell is already created elsewhere + // but without that code : + // - it's impossible to scroll nor to type anything that is displayed in the console + // - it's also impossible to switch between consoles + // NB : I have checked and the scrollUp/ScrollDown method are called properly + final TextConsole first = (TextConsole) mgr.getFocus(); new CommandShell(first).run(); Thread.sleep(60 * 1000); - + //// end of FIXME + } catch (Throwable ex) { log.error("Error in FBConsole", ex); } finally { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |