From eb29bbb5ec70c43895dd0f053630c7e3cd402cba Mon Sep 17 00:00:00 2001 From: Kevin Lamonte Date: Sat, 26 Aug 2017 07:26:08 -0400 Subject: [PATCH] Expose width/height in TApplication constructor, attempt on ECMA48 --- build.xml | 2 +- src/jexer/TApplication.java | 33 +++++++++++++++++++++++++ src/jexer/TEditColorThemeWindow.java | 2 +- src/jexer/backend/ECMA48Backend.java | 35 +++++++++++++++++++++++++++ src/jexer/backend/ECMA48Terminal.java | 31 ++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index 807a6ea..f21f321 100644 --- a/build.xml +++ b/build.xml @@ -66,7 +66,7 @@ - + diff --git a/src/jexer/TApplication.java b/src/jexer/TApplication.java index e6c5819..e61cea2 100644 --- a/src/jexer/TApplication.java +++ b/src/jexer/TApplication.java @@ -575,6 +575,39 @@ public class TApplication implements Runnable { // Constructors ----------------------------------------------------------- // ------------------------------------------------------------------------ + /** + * Public constructor. + * + * @param backendType BackendType.XTERM, BackendType.ECMA48 or + * BackendType.SWING + * @param windowWidth the number of text columns to start with + * @param windowHeight the number of text rows to start with + * @param fontSize the size in points + * @throws UnsupportedEncodingException if an exception is thrown when + * creating the InputStreamReader + */ + public TApplication(final BackendType backendType, final int windowWidth, + final int windowHeight, final int fontSize) + throws UnsupportedEncodingException { + + switch (backendType) { + case SWING: + backend = new SwingBackend(this, windowWidth, windowHeight, + fontSize); + break; + case XTERM: + // Fall through... + case ECMA48: + backend = new ECMA48Backend(this, null, null, windowWidth, + windowHeight, fontSize); + break; + default: + throw new IllegalArgumentException("Invalid backend type: " + + backendType); + } + TApplicationImpl(); + } + /** * Public constructor. * diff --git a/src/jexer/TEditColorThemeWindow.java b/src/jexer/TEditColorThemeWindow.java index b4f0dcf..5b4abf3 100644 --- a/src/jexer/TEditColorThemeWindow.java +++ b/src/jexer/TEditColorThemeWindow.java @@ -44,7 +44,7 @@ import static jexer.TKeypress.*; * color theme. * */ -public final class TEditColorThemeWindow extends TWindow { +public class TEditColorThemeWindow extends TWindow { /** * Translated strings. diff --git a/src/jexer/backend/ECMA48Backend.java b/src/jexer/backend/ECMA48Backend.java index 3e588f9..59cd670 100644 --- a/src/jexer/backend/ECMA48Backend.java +++ b/src/jexer/backend/ECMA48Backend.java @@ -52,6 +52,41 @@ public final class ECMA48Backend extends GenericBackend { this(null, null, null); } + /** + * Public constructor. + * + * @param listener the object this backend needs to wake up when new + * input comes in + * @param input an InputStream connected to the remote user, or null for + * System.in. If System.in is used, then on non-Windows systems it will + * be put in raw mode; shutdown() will (blindly!) put System.in in cooked + * mode. input is always converted to a Reader with UTF-8 encoding. + * @param output an OutputStream connected to the remote user, or null + * for System.out. output is always converted to a Writer with UTF-8 + * encoding. + * @param windowWidth the number of text columns to start with + * @param windowHeight the number of text rows to start with + * @param fontSize the size in points. ECMA48 cannot set it, but it is + * here to match the Swing API. + * @throws UnsupportedEncodingException if an exception is thrown when + * creating the InputStreamReader + */ + public ECMA48Backend(final Object listener, final InputStream input, + final OutputStream output, final int windowWidth, + final int windowHeight, final int fontSize) + throws UnsupportedEncodingException { + + // Create a terminal and explicitly set stdin into raw mode + terminal = new ECMA48Terminal(listener, input, output, windowWidth, + windowHeight); + + // Keep the terminal's sessionInfo so that TApplication can see it + sessionInfo = ((ECMA48Terminal) terminal).getSessionInfo(); + + // ECMA48Terminal is the screen too + screen = (ECMA48Terminal) terminal; + } + /** * Public constructor. * diff --git a/src/jexer/backend/ECMA48Terminal.java b/src/jexer/backend/ECMA48Terminal.java index 56c2c7c..ae35610 100644 --- a/src/jexer/backend/ECMA48Terminal.java +++ b/src/jexer/backend/ECMA48Terminal.java @@ -290,6 +290,37 @@ public final class ECMA48Terminal extends LogicalScreen } } + /** + * Constructor sets up state for getEvent(). + * + * @param listener the object this backend needs to wake up when new + * input comes in + * @param input an InputStream connected to the remote user, or null for + * System.in. If System.in is used, then on non-Windows systems it will + * be put in raw mode; shutdown() will (blindly!) put System.in in cooked + * mode. input is always converted to a Reader with UTF-8 encoding. + * @param output an OutputStream connected to the remote user, or null + * for System.out. output is always converted to a Writer with UTF-8 + * encoding. + * @param windowWidth the number of text columns to start with + * @param windowHeight the number of text rows to start with + * @throws UnsupportedEncodingException if an exception is thrown when + * creating the InputStreamReader + */ + public ECMA48Terminal(final Object listener, final InputStream input, + final OutputStream output, final int windowWidth, + final int windowHeight) throws UnsupportedEncodingException { + + this(listener, input, output); + + // Send dtterm/xterm sequences, which will probably not work because + // allowWindowOps is defaulted to false. + String resizeString = String.format("\033[8;%d;%dt", windowHeight, + windowWidth); + this.output.write(resizeString); + this.output.flush(); + } + /** * Constructor sets up state for getEvent(). * -- 2.27.0