From aa77d68274fff56c0ceca162a687ea70795624ea Mon Sep 17 00:00:00 2001 From: Kevin Lamonte Date: Thu, 17 Aug 2017 09:53:29 -0400 Subject: [PATCH] Better resizing under ptypipe --- src/jexer/TTerminalWindow.java | 21 +++++++++-- src/jexer/tterminal/DisplayListener.java | 14 ++++++++ src/jexer/tterminal/ECMA48.java | 44 +++++++++++++++--------- 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/jexer/TTerminalWindow.java b/src/jexer/TTerminalWindow.java index 89280fd..165ab71 100644 --- a/src/jexer/TTerminalWindow.java +++ b/src/jexer/TTerminalWindow.java @@ -202,8 +202,7 @@ public class TTerminalWindow extends TScrollableWindow pb.redirectErrorStream(true); shell = pb.start(); emulator = new ECMA48(deviceType, shell.getInputStream(), - shell.getOutputStream()); - emulator.setListener(this); + shell.getOutputStream(), this); } catch (IOException e) { messageBox("Error", "Error launching shell: " + e.getMessage()); } @@ -349,6 +348,24 @@ public class TTerminalWindow extends TScrollableWindow doRepaint(); } + /** + * Function to call to obtain the display width. + * + * @return the number of columns in the display + */ + public int getDisplayWidth() { + return getWidth() - 2; + } + + /** + * Function to call to obtain the display height. + * + * @return the number of rows in the display + */ + public int getDisplayHeight() { + return getHeight() - 2; + } + /** * Handle window close. */ diff --git a/src/jexer/tterminal/DisplayListener.java b/src/jexer/tterminal/DisplayListener.java index fcd8854..7a47921 100644 --- a/src/jexer/tterminal/DisplayListener.java +++ b/src/jexer/tterminal/DisplayListener.java @@ -39,4 +39,18 @@ public interface DisplayListener { */ public void displayChanged(); + /** + * Function to call to obtain the display width. + * + * @return the number of columns in the display + */ + public int getDisplayWidth(); + + /** + * Function to call to obtain the display height. + * + * @return the number of rows in the display + */ + public int getDisplayHeight(); + } diff --git a/src/jexer/tterminal/ECMA48.java b/src/jexer/tterminal/ECMA48.java index 5a30d37..96f4e40 100644 --- a/src/jexer/tterminal/ECMA48.java +++ b/src/jexer/tterminal/ECMA48.java @@ -307,17 +307,7 @@ public class ECMA48 implements Runnable { /** * The enclosing listening object. */ - private DisplayListener listener; - - /** - * Set a listening object. - * - * @param listener the object that will have displayChanged() called - * after bytes are received from the remote terminal - */ - public void setListener(final DisplayListener listener) { - this.listener = listener; - } + private DisplayListener displayListener; /** * When true, the reader thread is expected to exit. @@ -578,7 +568,9 @@ public class ECMA48 implements Runnable { */ public final void setHeight(final int height) { this.height = height; - scrollRegionBottom = height - 1; + if (scrollRegionBottom >= height) { + scrollRegionBottom = height - 1; + } if (scrollRegionTop >= scrollRegionBottom) { scrollRegionTop = 0; } @@ -906,6 +898,11 @@ public class ECMA48 implements Runnable { arrowKeyMode = ArrowKeyMode.ANSI; keypadMode = KeypadMode.Numeric; wrapLineFlag = false; + if (displayListener != null) { + width = displayListener.getDisplayWidth(); + height = displayListener.getDisplayHeight(); + rightMargin = width - 1; + } // Flags shiftOut = false; @@ -944,11 +941,14 @@ public class ECMA48 implements Runnable { * @param outputStream an OutputStream connected to the remote user. For * type == XTERM, outputStream is converted to a Writer with UTF-8 * encoding. + * @param displayListener a callback to the outer display, or null for + * default VT100 behavior * @throws UnsupportedEncodingException if an exception is thrown when * creating the InputStreamReader */ public ECMA48(final DeviceType type, final InputStream inputStream, - final OutputStream outputStream) throws UnsupportedEncodingException { + final OutputStream outputStream, final DisplayListener displayListener) + throws UnsupportedEncodingException { assert (inputStream != null); assert (outputStream != null); @@ -973,6 +973,7 @@ public class ECMA48 implements Runnable { this.output = null; this.outputStream = new BufferedOutputStream(outputStream); } + this.displayListener = displayListener; reset(); for (int i = 0; i < height; i++) { @@ -2503,9 +2504,18 @@ public class ECMA48 implements Runnable { } else { // 80 columns columns132 = false; - rightMargin = 79; + if ((displayListener != null) + && (type == DeviceType.XTERM) + ) { + // For xterms, reset to the actual width, not 80 + // columns. + width = displayListener.getDisplayWidth(); + rightMargin = width - 1; + } else { + rightMargin = 79; + width = rightMargin + 1; + } } - width = rightMargin + 1; // Entire screen is cleared, and scrolling region is // reset eraseScreen(0, 0, height - 1, width - 1, false); @@ -6085,8 +6095,8 @@ public class ECMA48 implements Runnable { } } // Permit my enclosing UI to know that I updated. - if (listener != null) { - listener.displayChanged(); + if (displayListener != null) { + displayListener.displayChanged(); } } // System.err.println("end while loop"); System.err.flush(); -- 2.27.0