diff --git a/console/src/test/java/org/jline/widget/TailTipWidgetsTest.java b/console/src/test/java/org/jline/widget/TailTipWidgetsTest.java index 2257484b2..861e3c13c 100644 --- a/console/src/test/java/org/jline/widget/TailTipWidgetsTest.java +++ b/console/src/test/java/org/jline/widget/TailTipWidgetsTest.java @@ -14,6 +14,7 @@ import org.jline.reader.LineReader; import org.jline.reader.impl.LineReaderImpl; +import org.jline.terminal.Size; import org.jline.terminal.Terminal; import org.jline.terminal.impl.DumbTerminal; import org.jline.utils.InfoCmp.Capability; @@ -34,6 +35,7 @@ private SupportedDumbTerminal() throws IOException { strings.put(Capability.save_cursor, ""); strings.put(Capability.restore_cursor, ""); strings.put(Capability.cursor_address, ""); + setSize(new Size(160, 50)); } } diff --git a/reader/src/test/java/org/jline/reader/impl/LineReaderTest.java b/reader/src/test/java/org/jline/reader/impl/LineReaderTest.java index e085b3c03..4d3aa1092 100644 --- a/reader/src/test/java/org/jline/reader/impl/LineReaderTest.java +++ b/reader/src/test/java/org/jline/reader/impl/LineReaderTest.java @@ -203,4 +203,16 @@ public void terminalLineInfiniteLoop() throws IOException { assertEquals("hello", read1); assertEquals("world", read2); } + + @Test + public void testNoBackspaceInOutputOnDumbTerminal() throws IOException { + ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {'\n'}); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (Terminal terminal = new DumbTerminal(in, out)) { + LineReader r = new LineReaderImpl(terminal); + r.readLine("123"); + String written = out.toString(); + assertEquals("123", written); + } + } } diff --git a/terminal/src/main/java/org/jline/utils/Display.java b/terminal/src/main/java/org/jline/utils/Display.java index b13a1b965..c2c17ecb7 100644 --- a/terminal/src/main/java/org/jline/utils/Display.java +++ b/terminal/src/main/java/org/jline/utils/Display.java @@ -68,7 +68,7 @@ public void setDelayLineWrap(boolean v) { public void resize(int rows, int columns) { if (rows == 0 || columns == 0) { - columns = 1; + columns = Integer.MAX_VALUE - 1; rows = 1; } if (this.rows != rows || this.columns != columns) { @@ -209,7 +209,8 @@ public void update(List newLines, int targetCursorPos, boolean cursorPos++; if (newLength == 0 || newLine.isHidden(0)) { // go to next line column zero - rawPrint(new AttributedString(" \b")); + rawPrint(' '); + terminal.puts(Capability.key_backspace); } else { AttributedString firstChar = newLine.substring(0, 1); // go to next line column one @@ -309,7 +310,8 @@ public void update(List newLines, int targetCursorPos, boolean } else if (atRight) { if (this.wrapAtEol) { if (!fullScreen || (fullScreen && lineIndex < numLines)) { - terminal.writer().write(" \b"); + rawPrint(' '); + terminal.puts(Capability.key_backspace); cursorPos++; } } else { diff --git a/terminal/src/main/java/org/jline/utils/Status.java b/terminal/src/main/java/org/jline/utils/Status.java index 7acc6dbb3..ca8f0c0c1 100644 --- a/terminal/src/main/java/org/jline/utils/Status.java +++ b/terminal/src/main/java/org/jline/utils/Status.java @@ -48,7 +48,8 @@ public Status(Terminal terminal) { this.supported = terminal.getStringCapability(Capability.change_scroll_region) != null && terminal.getStringCapability(Capability.save_cursor) != null && terminal.getStringCapability(Capability.restore_cursor) != null - && terminal.getStringCapability(Capability.cursor_address) != null; + && terminal.getStringCapability(Capability.cursor_address) != null + && isValid(terminal.getSize()); if (supported) { display = new MovingCursorDisplay(terminal); resize(); @@ -57,6 +58,10 @@ public Status(Terminal terminal) { } } + private boolean isValid(Size size) { + return size.getRows() > 0 && size.getRows() < 1000 && size.getColumns() > 0 && size.getColumns() < 1000; + } + public void close() { terminal.puts(Capability.save_cursor); terminal.puts(Capability.change_scroll_region, 0, display.rows - 1);