From 9e5293a08e111c6965af7ab2551513511f42dc56 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sat, 28 Oct 2017 10:54:47 +0200 Subject: [PATCH] Do not scroll when below bottom margin --- .../com/termux/terminal/TerminalEmulator.java | 18 +++++++++++++----- .../com/termux/terminal/ScrollRegionTest.java | 9 +++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java index 10c7321d..9b947c34 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -1192,12 +1192,20 @@ public final class TerminalEmulator { } private void doLinefeed() { + boolean belowScrollingRegion = mCursorRow >= mBottomMargin; int newCursorRow = mCursorRow + 1; - if (newCursorRow >= mBottomMargin) { - scrollDownOneLine(); - newCursorRow = mBottomMargin - 1; + if (belowScrollingRegion) { + // Move down (but not scroll) as long as we are above the last row. + if (mCursorRow != mRows - 1) { + setCursorRow(newCursorRow); + } + } else { + if (newCursorRow == mBottomMargin) { + scrollDownOneLine(); + newCursorRow = mBottomMargin - 1; + } + setCursorRow(newCursorRow); } - setCursorRow(newCursorRow); } private void continueSequence(int state) { @@ -1571,7 +1579,7 @@ public final class TerminalEmulator { break; case 'r': // "CSI${top};${bottom}r" - set top and bottom Margins (DECSTBM). { - // http://www.vt100.net/docs/vt510-rm/DECSTBM + // https://vt100.net/docs/vt510-rm/DECSTBM.html // The top margin defaults to 1, the bottom margin defaults to mRows. // The escape sequence numbers top 1..23, but we number top 0..22. // The escape sequence numbers bottom 2..24, and so do we (because we use a zero based numbering diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java index b7e258a5..260a481a 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ScrollRegionTest.java @@ -98,4 +98,13 @@ public class ScrollRegionTest extends TerminalTestCase { withTerminalSized(2, 5).enterString("1\r\n2\r\n3\r\n4\r\n5").assertLinesAre("1 ", "2 ", "3 ", "4 ", "5 "); enterString("\033[3r").enterString("\033[2T").assertLinesAre("1 ", "2 ", " ", " ", "3 "); } + + public void testScrollDownBelowScrollRegion() { + withTerminalSized(2, 5).enterString("1\r\n2\r\n3\r\n4\r\n5").assertLinesAre("1 ", "2 ", "3 ", "4 ", "5 "); + enterString("\033[1;3r"); // DECSTBM margins. + enterString("\033[4;1H"); // Place cursor just below bottom margin. + enterString("QQ\r\nRR\r\n\r\n\r\nYY"); + assertLinesAre("1 ", "2 ", "3 ", "QQ", "YY"); + } + }