From b43255b9f734ffd7158599585a4bfae635bcd7e2 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 20 Jun 2008 00:30:13 +0000 Subject: [PATCH] Squashed TODO: When writing a character in the last column of a line we wrapped to the next line and a subsequent LF would advance another line. We behave like xterm now, i.e. visually the cursor stays on the same line (on the last character), but the next character will be wrapped to the next line. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26033 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/BasicTerminalBuffer.cpp | 39 +++++++++++++++++++---- src/apps/terminal/BasicTerminalBuffer.h | 1 + 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/apps/terminal/BasicTerminalBuffer.cpp b/src/apps/terminal/BasicTerminalBuffer.cpp index 1a57ce1472..7ee5708531 100644 --- a/src/apps/terminal/BasicTerminalBuffer.cpp +++ b/src/apps/terminal/BasicTerminalBuffer.cpp @@ -116,6 +116,7 @@ BasicTerminalBuffer::Init(int32 width, int32 height, int32 historySize) fCursor.x = 0; fCursor.y = 0; + fSoftWrappedCursor = false; fScreenOffset = 0; @@ -180,6 +181,7 @@ BasicTerminalBuffer::SetHistoryCapacity(int32 historyCapacity) void BasicTerminalBuffer::Clear(bool resetCursor) { + fSoftWrappedCursor = false; fScreenOffset = 0; _ClearLines(0, fHeight - 1); @@ -541,11 +543,13 @@ BasicTerminalBuffer::InsertChar(UTF8Char c, uint32 attributes) if (width == FULL_WIDTH) attributes |= A_WIDTH; - if (fCursor.x + width > fWidth) + if (fSoftWrappedCursor || fCursor.x + width > fWidth) _SoftBreakLine(); else _PadLineToCursor(); + fSoftWrappedCursor = false; + if (!fOverwriteMode) _InsertGap(width); @@ -563,9 +567,10 @@ BasicTerminalBuffer::InsertChar(UTF8Char c, uint32 attributes) // TODO: Deal correctly with full-width chars! We must take care not to // overwrite half of a full-width char. This holds also for other methods. - if (fCursor.x == fWidth) - _SoftBreakLine(); - // TODO: Handle a subsequent CR correctly! + if (fCursor.x == fWidth) { + fCursor.x -= width; + fSoftWrappedCursor = true; + } } @@ -573,6 +578,7 @@ void BasicTerminalBuffer::InsertCR() { _LineAt(fCursor.y)->softBreak = false; + fSoftWrappedCursor = false; fCursor.x = 0; _CursorChanged(); } @@ -581,6 +587,8 @@ BasicTerminalBuffer::InsertCR() void BasicTerminalBuffer::InsertLF() { + fSoftWrappedCursor = false; + // If we're at the end of the scroll region, scroll. Otherwise just advance // the cursor. if (fCursor.y == fScrollBottom) { @@ -596,8 +604,10 @@ BasicTerminalBuffer::InsertLF() void BasicTerminalBuffer::InsertLines(int32 numLines) { - if (fCursor.y >= fScrollTop && fCursor.y < fScrollBottom) + if (fCursor.y >= fScrollTop && fCursor.y < fScrollBottom) { + fSoftWrappedCursor = false; _Scroll(fCursor.y, fScrollBottom, -numLines); + } } @@ -616,6 +626,7 @@ BasicTerminalBuffer::InsertSpace(int32 num) num = fWidth - fCursor.x; if (num > 0) { + fSoftWrappedCursor = false; _PadLineToCursor(); _InsertGap(num); @@ -637,6 +648,8 @@ BasicTerminalBuffer::EraseChars(int32 numChars) if (fCursor.y >= line->length) return; + fSoftWrappedCursor = false; + int32 first = fCursor.x; int32 end = min_c(fCursor.x + numChars, line->length); if (first > 0 && IS_WIDTH(line->cells[first - 1].attributes)) @@ -660,6 +673,8 @@ BasicTerminalBuffer::EraseAbove() if (fCursor.y > 0) _ClearLines(0, fCursor.y - 1); + fSoftWrappedCursor = false; + // Delete the chars on the cursor line before (and including) the cursor. TerminalLine* line = _LineAt(fCursor.y); if (fCursor.x < line->length) { @@ -680,6 +695,8 @@ BasicTerminalBuffer::EraseAbove() void BasicTerminalBuffer::EraseBelow() { + fSoftWrappedCursor = false; + // Clear the following lines. if (fCursor.y < fHeight - 1) _ClearLines(fCursor.y + 1, fHeight - 1); @@ -692,6 +709,8 @@ BasicTerminalBuffer::EraseBelow() void BasicTerminalBuffer::DeleteChars(int32 numChars) { + fSoftWrappedCursor = false; + TerminalLine* line = _LineAt(fCursor.y); if (fCursor.x < line->length) { if (fCursor.x + numChars < line->length) { @@ -712,6 +731,8 @@ BasicTerminalBuffer::DeleteChars(int32 numChars) void BasicTerminalBuffer::DeleteColumns() { + fSoftWrappedCursor = false; + TerminalLine* line = _LineAt(fCursor.y); if (fCursor.x < line->length) { line->length = fCursor.x; @@ -723,8 +744,10 @@ BasicTerminalBuffer::DeleteColumns() void BasicTerminalBuffer::DeleteLines(int32 numLines) { - if (fCursor.y >= fScrollTop && fCursor.y <= fScrollBottom) + if (fCursor.y >= fScrollTop && fCursor.y <= fScrollBottom) { + fSoftWrappedCursor = false; _Scroll(fCursor.y, fScrollBottom, numLines); + } } @@ -732,6 +755,7 @@ void BasicTerminalBuffer::SetCursor(int32 x, int32 y) { //debug_printf("BasicTerminalBuffer::SetCursor(%d, %d)\n", x, y); + fSoftWrappedCursor = false; x = restrict_value(x, 0, fWidth - 1); y = restrict_value(y, 0, fHeight - 1); if (x != fCursor.x || y != fCursor.y) { @@ -955,6 +979,7 @@ BasicTerminalBuffer::_ResizeSimple(int32 width, int32 height, if (fCursor.x > width) fCursor.x = width; fCursor.y -= firstLine; + fSoftWrappedCursor = false; return B_OK; } @@ -1131,6 +1156,7 @@ BasicTerminalBuffer::_ResizeRewrap(int32 width, int32 height, //cursor.x, cursor.y); fCursor.x = cursor.x; fCursor.y = cursor.y; + fSoftWrappedCursor = false; //debug_printf(" screen offset: %ld -> %ld\n", fScreenOffset, destScreenOffset % height); fScreenOffset = destScreenOffset % height; //debug_printf(" height %ld -> %ld\n", fHeight, height); @@ -1266,7 +1292,6 @@ void BasicTerminalBuffer::_SoftBreakLine() { TerminalLine* line = _LineAt(fCursor.y); - line->length = fCursor.x; line->softBreak = true; fCursor.x = 0; diff --git a/src/apps/terminal/BasicTerminalBuffer.h b/src/apps/terminal/BasicTerminalBuffer.h index 538bdfa393..f1593d5fea 100644 --- a/src/apps/terminal/BasicTerminalBuffer.h +++ b/src/apps/terminal/BasicTerminalBuffer.h @@ -183,6 +183,7 @@ protected: // cursor position (origin: (0, 0)) TermPos fCursor; TermPos fSavedCursor; + bool fSoftWrappedCursor; bool fOverwriteMode; // false for insert bool fAlternateScreenActive;