From b54c7909bd3f9deca6b0ccee6ca8c715d5d025ea Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sun, 29 Nov 2015 10:04:50 +0100 Subject: [PATCH] Fix crash with wide character in last column Ignore wide character outputs instead of crashing when the cursor is in the last column with autowrap disabled. --- .../com/termux/terminal/TerminalEmulator.java | 21 ++++++++++++------- .../com/termux/terminal/UnicodeInputTest.java | 8 +++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/termux/terminal/TerminalEmulator.java b/app/src/main/java/com/termux/terminal/TerminalEmulator.java index 92de6c96..01a4c4dc 100644 --- a/app/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/app/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -2156,15 +2156,22 @@ public final class TerminalEmulator { final boolean autoWrap = isDecsetInternalBitSet(DECSET_BIT_AUTOWRAP); final int displayWidth = WcWidth.width(codePoint); + final boolean cursorInLastColumn = mCursorCol == mRightMargin - 1; - if (autoWrap && (mCursorCol == mRightMargin - 1 && ((mAboutToAutoWrap && displayWidth == 1) || displayWidth == 2))) { - mScreen.setLineWrap(mCursorRow); - mCursorCol = mLeftMargin; - if (mCursorRow + 1 < mBottomMargin) { - mCursorRow++; - } else { - scrollDownOneLine(); + if (autoWrap) { + if (cursorInLastColumn && ((mAboutToAutoWrap && displayWidth == 1) || displayWidth == 2)) { + mScreen.setLineWrap(mCursorRow); + mCursorCol = mLeftMargin; + if (mCursorRow + 1 < mBottomMargin) { + mCursorRow++; + } else { + scrollDownOneLine(); + } } + } else if (cursorInLastColumn && displayWidth == 2) { + // The behaviour when a wide character is output with cursor in the last column when + // autowrap is disabled is not obvious - it's ignored here. + return; } if (mInsertMode && displayWidth > 0) { diff --git a/app/src/test/java/com/termux/terminal/UnicodeInputTest.java b/app/src/test/java/com/termux/terminal/UnicodeInputTest.java index 49fb7306..ba0bbf07 100644 --- a/app/src/test/java/com/termux/terminal/UnicodeInputTest.java +++ b/app/src/test/java/com/termux/terminal/UnicodeInputTest.java @@ -84,4 +84,12 @@ public class UnicodeInputTest extends TerminalTestCase { assertLineIs(0, "\uFFFDY "); } + public void testWideCharacterWithoutWrapping() throws Exception { + // With wraparound disabled. The behaviour when a wide character is output with cursor in + // the last column when autowrap is disabled is not obvious, but we expect the wide + // character to be ignored here. + withTerminalSized(3, 3).enterString("\033[?7l").enterString("枝枝枝").assertLinesAre("枝 ", " ", " "); + enterString("a枝").assertLinesAre("枝a", " ", " "); + } + }