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 6aa150a7..a9c88004 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -1310,6 +1310,8 @@ public final class TerminalEmulator { state.mSavedCursorRow = mCursorRow; state.mSavedCursorCol = mCursorCol; state.mSavedEffect = mEffect; + state.mSavedForeColor = mForeColor; + state.mSavedBackColor = mBackColor; state.mSavedDecFlags = mCurrentDecSetFlags; state.mUseLineDrawingG0 = mUseLineDrawingG0; state.mUseLineDrawingG1 = mUseLineDrawingG1; @@ -1321,6 +1323,8 @@ public final class TerminalEmulator { SavedScreenState state = (mScreen == mMainBuffer) ? mSavedStateMain : mSavedStateAlt; setCursorRowCol(state.mSavedCursorRow, state.mSavedCursorCol); mEffect = state.mSavedEffect; + mForeColor = state.mSavedForeColor; + mBackColor = state.mSavedBackColor; int mask = (DECSET_BIT_AUTOWRAP | DECSET_BIT_ORIGIN_MODE); mCurrentDecSetFlags = (mCurrentDecSetFlags & ~mask) | (state.mSavedDecFlags & mask); mUseLineDrawingG0 = state.mUseLineDrawingG0; @@ -2268,8 +2272,8 @@ public final class TerminalEmulator { mBottomMargin = mRows; mRightMargin = mColumns; mAboutToAutoWrap = false; - mForeColor = TextStyle.COLOR_INDEX_FOREGROUND; - mBackColor = TextStyle.COLOR_INDEX_BACKGROUND; + mForeColor = mSavedStateMain.mSavedForeColor = mSavedStateAlt.mSavedForeColor = TextStyle.COLOR_INDEX_FOREGROUND; + mBackColor = mSavedStateMain.mSavedBackColor = mSavedStateAlt.mSavedBackColor = TextStyle.COLOR_INDEX_BACKGROUND; setDefaultTabStops(); mUseLineDrawingG0 = mUseLineDrawingG1 = false; @@ -2323,7 +2327,7 @@ public final class TerminalEmulator { static final class SavedScreenState { /** Saved state of the cursor position, Used to implement the save/restore cursor position escape sequences. */ int mSavedCursorRow, mSavedCursorCol; - int mSavedEffect; + int mSavedEffect, mSavedForeColor, mSavedBackColor; int mSavedDecFlags; boolean mUseLineDrawingG0, mUseLineDrawingG1, mUseLineDrawingUsesG0 = true; } diff --git a/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java b/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java index 567e627b..92c41f0f 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/CursorAndScreenTest.java @@ -227,4 +227,44 @@ public class CursorAndScreenTest extends TerminalTestCase { withTerminalSized(3, 3).enterString("\b\b\b\bhi").assertLinesAre("hi ", " ", " "); } + public void testCursorSaveRestoreLocation() { + // DEC save/restore + withTerminalSized(4, 2).enterString("t\0337est\r\nme\0338ry ").assertLinesAre("try ", "me "); + // ANSI.SYS save/restore + withTerminalSized(4, 2).enterString("t\033[sest\r\nme\033[ury ").assertLinesAre("try ", "me "); + // Alternate screen enter/exit + withTerminalSized(4, 2).enterString("t\033[?1049h\033[Hest\r\nme").assertLinesAre("est ", "me ").enterString("\033[?1049lry").assertLinesAre("try ", " "); + } + + public void testCursorSaveRestoreTextStyle() { + long s; + + // DEC save/restore + withTerminalSized(4, 2).enterString("\033[31;42;4m..\0337\033[36;47;24m\0338.."); + s = getStyleAt(0, 3); + Assert.assertEquals(1, TextStyle.decodeForeColor(s)); + Assert.assertEquals(2, TextStyle.decodeBackColor(s)); + Assert.assertEquals(TextStyle.CHARACTER_ATTRIBUTE_UNDERLINE, TextStyle.decodeEffect(s)); + + // ANSI.SYS save/restore + withTerminalSized(4, 2).enterString("\033[31;42;4m..\033[s\033[36;47;24m\033[u.."); + s = getStyleAt(0, 3); + Assert.assertEquals(1, TextStyle.decodeForeColor(s)); + Assert.assertEquals(2, TextStyle.decodeBackColor(s)); + Assert.assertEquals(TextStyle.CHARACTER_ATTRIBUTE_UNDERLINE, TextStyle.decodeEffect(s)); + + // Alternate screen enter/exit + withTerminalSized(4, 2); + enterString("\033[31;42;4m..\033[?1049h\033[H\033[36;47;24m."); + s = getStyleAt(0, 0); + Assert.assertEquals(6, TextStyle.decodeForeColor(s)); + Assert.assertEquals(7, TextStyle.decodeBackColor(s)); + Assert.assertEquals(0, TextStyle.decodeEffect(s)); + enterString("\033[?1049l.."); + s = getStyleAt(0, 3); + Assert.assertEquals(1, TextStyle.decodeForeColor(s)); + Assert.assertEquals(2, TextStyle.decodeBackColor(s)); + Assert.assertEquals(TextStyle.CHARACTER_ATTRIBUTE_UNDERLINE, TextStyle.decodeEffect(s)); + } + }