From 2a36b915cbb201bda9b77431ae6d670961cee67a Mon Sep 17 00:00:00 2001 From: iamahuman Date: Fri, 25 Jan 2019 12:31:35 +0900 Subject: [PATCH] Implement CSI 3 J - Clear transcript --- .../java/com/termux/terminal/TerminalBuffer.java | 12 ++++++++++++ .../com/termux/terminal/TerminalEmulator.java | 5 ++++- .../terminal/ControlSequenceIntroducerTest.java | 16 ++++++++++++++++ .../main/java/com/termux/view/TerminalView.java | 4 +++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java b/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java index df9b58b3..b5002c70 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalBuffer.java @@ -1,5 +1,7 @@ package com.termux.terminal; +import java.util.Arrays; + /** * A circular buffer of {@link TerminalRow}:s which keeps notes about what is visible on a logical screen and the scroll * history. @@ -422,4 +424,14 @@ public final class TerminalBuffer { } } + public void clearTranscript() { + if (mScreenFirstRow < mActiveTranscriptRows) { + Arrays.fill(mLines, mTotalRows + mScreenFirstRow - mActiveTranscriptRows, mTotalRows, null); + Arrays.fill(mLines, 0, mScreenFirstRow, null); + } else { + Arrays.fill(mLines, mScreenFirstRow - mActiveTranscriptRows, mScreenFirstRow, null); + } + mActiveTranscriptRows = 0; + } + } 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 6827f20c..f778cf92 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -1404,7 +1404,7 @@ public final class TerminalEmulator { case 'I': // Cursor Horizontal Forward Tabulation (CHT). Move the active position n tabs forward. setCursorCol(nextTabStop(getArg0(1))); break; - case 'J': // "${CSI}${0,1,2}J" - Erase in Display (ED) + case 'J': // "${CSI}${0,1,2,3}J" - Erase in Display (ED) // ED ignores the scrolling margins. switch (getArg0(0)) { case 0: // Erase from the active position to the end of the screen, inclusive (default). @@ -1419,6 +1419,9 @@ public final class TerminalEmulator { // move.. blockClear(0, 0, mColumns, mRows); break; + case 3: // Delete all lines saved in the scrollback buffer (xterm etc) + mMainBuffer.clearTranscript(); + break; default: unknownSequence(b); return; diff --git a/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java b/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java index 88b8e026..62e898c0 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/ControlSequenceIntroducerTest.java @@ -46,4 +46,20 @@ public class ControlSequenceIntroducerTest extends TerminalTestCase { withTerminalSized(5, 2).enterString("abcde\033[2G\033[2b\n").assertLinesAre("aeede", " "); } + /** CSI 3 J Clear scrollback (xterm, libvte; non-standard). */ + public void testCsi3J() { + withTerminalSized(3, 2).enterString("a\r\nb\r\nc\r\nd"); + assertEquals("a\nb\nc\nd", mTerminal.getScreen().getTranscriptText()); + enterString("\033[3J"); + assertEquals("c\nd", mTerminal.getScreen().getTranscriptText()); + + withTerminalSized(3, 2).enterString("Lorem_ipsum"); + assertEquals("Lorem_ipsum", mTerminal.getScreen().getTranscriptText()); + enterString("\033[3J"); + assertEquals("ipsum", mTerminal.getScreen().getTranscriptText()); + + withTerminalSized(3, 2).enterString("w\r\nx\r\ny\r\nz\033[?1049h\033[3J\033[?1049l"); + assertEquals("y\nz", mTerminal.getScreen().getTranscriptText()); + } + } diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 3fb6af11..9ec39804 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -358,10 +358,12 @@ public final class TerminalView extends View { public void onScreenUpdated() { if (mEmulator == null) return; + int rowsInHistory = mEmulator.getScreen().getActiveTranscriptRows(); + if (mTopRow < -rowsInHistory) mTopRow = -rowsInHistory; + boolean skipScrolling = false; if (mIsSelectingText) { // Do not scroll when selecting text. - int rowsInHistory = mEmulator.getScreen().getActiveTranscriptRows(); int rowShift = mEmulator.getScrollCounter(); if (-mTopRow + rowShift > rowsInHistory) { // .. unless we're hitting the end of history transcript, in which