From a177ec8cf6ae96f95e0ea57ba4ca8b2db2e4f5b3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 17 Jun 2008 03:06:25 +0000 Subject: [PATCH] Added support for \ESC[%dX (erase characters). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25988 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/BasicTerminalBuffer.cpp | 23 +++++++++++++++++++++++ src/apps/terminal/BasicTerminalBuffer.h | 1 + src/apps/terminal/TermParse.cpp | 8 ++++++++ src/apps/terminal/VTPrsTbl.c | 2 +- src/apps/terminal/VTparse.h | 5 +++-- 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/apps/terminal/BasicTerminalBuffer.cpp b/src/apps/terminal/BasicTerminalBuffer.cpp index 7929b3c50d..49b6229443 100644 --- a/src/apps/terminal/BasicTerminalBuffer.cpp +++ b/src/apps/terminal/BasicTerminalBuffer.cpp @@ -628,6 +628,29 @@ BasicTerminalBuffer::InsertSpace(int32 num) } +void +BasicTerminalBuffer::EraseChars(int32 numChars) +{ + TerminalLine* line = _LineAt(fCursor.y); + if (fCursor.y >= line->length) + return; + + int32 first = fCursor.x; + int32 end = min_c(fCursor.x + numChars, line->length); + if (first > 0 && IS_WIDTH(line->cells[first - 1].attributes)) + first--; + if (end > 0 && IS_WIDTH(line->cells[end - 1].attributes)) + end++; + + for (int32 i = first; i < end; i++) { + line->cells[i].character = kSpaceChar; + line->cells[i].attributes = 0; + } + + _Invalidate(fCursor.y, fCursor.y); +} + + void BasicTerminalBuffer::EraseAbove() { diff --git a/src/apps/terminal/BasicTerminalBuffer.h b/src/apps/terminal/BasicTerminalBuffer.h index 8137b543c8..3f6c341a98 100644 --- a/src/apps/terminal/BasicTerminalBuffer.h +++ b/src/apps/terminal/BasicTerminalBuffer.h @@ -104,6 +104,7 @@ public: void InsertLines(int32 numLines); // delete chars/lines + void EraseChars(int32 numChars); void EraseAbove(); void EraseBelow(); void DeleteChars(int32 numChars); diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index 738df89f32..c3de1243db 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -959,6 +959,14 @@ TermParse::EscParse() parsestate = groundtable; break; + + case CASE_ECH: // erase characters + if ((col = param[0]) < 1) + col = 1; + fBuffer->EraseChars(col); + parsestate = groundtable; + break; + default: break; } diff --git a/src/apps/terminal/VTPrsTbl.c b/src/apps/terminal/VTPrsTbl.c index 9b8c679926..0b53da289c 100644 --- a/src/apps/terminal/VTPrsTbl.c +++ b/src/apps/terminal/VTPrsTbl.c @@ -1122,7 +1122,7 @@ CASE_GROUND_STATE, CASE_GROUND_STATE, CASE_GROUND_STATE, /* X Y Z [ */ -CASE_GROUND_STATE, +CASE_ECH, CASE_GROUND_STATE, CASE_GROUND_STATE, CASE_GROUND_STATE, diff --git a/src/apps/terminal/VTparse.h b/src/apps/terminal/VTparse.h index 536ea3b3a3..4fc92a8552 100644 --- a/src/apps/terminal/VTparse.h +++ b/src/apps/terminal/VTparse.h @@ -120,5 +120,6 @@ #define CASE_VPA 87 #define CASE_HPA 88 -#define CASE_SU 89 /* scroll screen up */ -#define CASE_SD 90 /* scroll screen down */ +#define CASE_SU 89 /* scroll screen up */ +#define CASE_SD 90 /* scroll screen down */ +#define CASE_ECH 91 /* erase characters */