From 4386ce0206df74a06409dc1d5ebb0db3596c1e5c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 3 Jun 2008 15:29:10 +0000 Subject: [PATCH] Pulled the TermView interface used by TermParse into a new interface class TerminalBuffer, which will evolve into a TermBuffer replacement and decouple the parse thread from the window. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25787 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/Jamfile | 3 +- src/apps/terminal/Shell.cpp | 13 ++-- src/apps/terminal/Shell.h | 1 + src/apps/terminal/TermParse.cpp | 112 +++++++++++++-------------- src/apps/terminal/TermParse.h | 7 +- src/apps/terminal/TermView.h | 9 ++- src/apps/terminal/TerminalBuffer.cpp | 16 ++++ src/apps/terminal/TerminalBuffer.h | 63 +++++++++++++++ 8 files changed, 155 insertions(+), 69 deletions(-) create mode 100644 src/apps/terminal/TerminalBuffer.cpp create mode 100644 src/apps/terminal/TerminalBuffer.h diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index 45119187b6..2e68edbc48 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -20,6 +20,7 @@ Application Terminal : SmartTabView.cpp TermApp.cpp TermBuffer.cpp + TerminalBuffer.cpp TermParse.cpp TermView.cpp TermWindow.cpp @@ -29,4 +30,4 @@ Application Terminal : VTPrsTbl.c : be game tracker textencoding : Terminal.rdef Terminal.icons.rdef - ; +; diff --git a/src/apps/terminal/Shell.cpp b/src/apps/terminal/Shell.cpp index acc74fb555..15357f0b4d 100644 --- a/src/apps/terminal/Shell.cpp +++ b/src/apps/terminal/Shell.cpp @@ -10,11 +10,6 @@ #include "Shell.h" -#include "TermConst.h" -#include "TermParse.h" - -#include - #include #include #include @@ -31,6 +26,13 @@ #include #include +#include + +#include "TermConst.h" +#include "TermParse.h" +#include "TermView.h" + // TODO: Fix dependency! + #ifndef CEOF #define CEOF ('D'&037) @@ -225,6 +227,7 @@ Shell::FD() const } +// TODO: Fix this dependency! void Shell::ViewAttached(TermView *view) { diff --git a/src/apps/terminal/Shell.h b/src/apps/terminal/Shell.h index f21064830b..a869859cb5 100644 --- a/src/apps/terminal/Shell.h +++ b/src/apps/terminal/Shell.h @@ -18,6 +18,7 @@ // TODO: Maybe merge TermParse and Shell classes ? class TermParse; class TermView; + class Shell { public: Shell(); diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index b48e4dc654..2e56ddbba0 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -6,11 +6,6 @@ */ #include "TermParse.h" -#include "CodeConv.h" -#include "TermConst.h" -#include "TermView.h" -#include "VTparse.h" - #include #include #include @@ -20,6 +15,11 @@ #include #include +#include "CodeConv.h" +#include "TermConst.h" +#include "TerminalBuffer.h" +#include "VTparse.h" + ////////////////////////////////////////////////////////////////////////////// // EscParse ... Escape sequence parse and character encoding. @@ -56,7 +56,7 @@ TermParse::TermParse(int fd) fReaderLocker(-1), fBufferPosition(0), fLockFlag(0), - fView(NULL), + fBuffer(NULL), fQuitting(true) { } @@ -69,24 +69,24 @@ TermParse::~TermParse() status_t -TermParse::StartThreads(TermView *view) +TermParse::StartThreads(TerminalBuffer *buffer) { - if (fView != NULL) + if (fBuffer != NULL) return B_ERROR; fQuitting = false; - fView = view; + fBuffer = buffer; status_t status = InitPtyReader(); if (status < B_OK) { - fView = NULL; + fBuffer = NULL; return status; } status = InitTermParse(); if (status < B_OK) { StopPtyReader(); - fView = NULL; + fBuffer = NULL; return status; } @@ -97,7 +97,7 @@ TermParse::StartThreads(TermView *view) status_t TermParse::StopThreads() { - if (fView == NULL) + if (fBuffer == NULL) return B_ERROR; fQuitting = true; @@ -105,7 +105,7 @@ TermParse::StopThreads() StopPtyReader(); StopTermParse(); - fView = NULL; + fBuffer = NULL; return B_OK; } @@ -121,11 +121,11 @@ TermParse::GetReaderBuf(uchar &c) } while (status == B_INTERRUPTED); if (status == B_TIMED_OUT) { - fView->ScrollAtCursor(); - fView->UpdateLine(); + fBuffer->ScrollAtCursor(); + fBuffer->UpdateLine(); // Reset cursor blinking time and turn on cursor blinking. - fView->SetCurDraw(true); + fBuffer->SetCurDraw(true); // wait new input from pty. do { @@ -146,7 +146,7 @@ TermParse::GetReaderBuf(uchar &c) release_sem(fReaderLocker); } - fView->SetCurDraw(false); + fBuffer->SetCurDraw(false); return B_OK; } @@ -256,7 +256,7 @@ TermParse::PtyReader() uchar buf[READ_BUF_SIZE]; int nread = read(fFd, buf, READ_BUF_SIZE - (read_p - fBufferPosition)); if (nread <= 0) { - fView->NotifyQuit(errno); + fBuffer->NotifyQuit(errno); return B_OK; } @@ -348,11 +348,11 @@ TermParse::EscParse() //DumpState(groundtable, parsestate, c); - if (now_coding != fView->Encoding()) { + if (now_coding != fBuffer->Encoding()) { /* * Change coding, change parse table. */ - switch (fView->Encoding()) { + switch (fBuffer->Encoding()) { case B_ISO1_CONVERSION: case B_ISO2_CONVERSION: case B_ISO3_CONVERSION: @@ -379,14 +379,14 @@ TermParse::EscParse() break; } parsestate = groundtable; - now_coding = fView->Encoding(); + now_coding = fBuffer->Encoding(); } switch (parsestate[c]) { case CASE_PRINT: cbuf[0] = c; cbuf[1] = '\0'; - fView->Insert(cbuf, attr); + fBuffer->Insert(cbuf, attr); break; case CASE_PRINT_GR: @@ -427,7 +427,7 @@ TermParse::EscParse() else CodeConv::ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, B_EUC_CONVERSION); - fView->Insert(dstbuf, attr); + fBuffer->Insert(dstbuf, attr); break; case CASE_PRINT_CS96: @@ -436,22 +436,22 @@ TermParse::EscParse() cbuf[1] |= 0x80; cbuf[2] = 0; CodeConv::ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, B_EUC_CONVERSION); - fView->Insert(dstbuf, attr); + fBuffer->Insert(dstbuf, attr); break; case CASE_LF: - fView->InsertLF(); + fBuffer->InsertLF(); break; case CASE_CR: - fView->InsertCR(); + fBuffer->InsertCR(); break; case CASE_SJIS_KANA: cbuf[0] = (uchar)c; cbuf[1] = '\0'; CodeConv::ConvertToInternal((char*)cbuf, 1, (char*)dstbuf, now_coding); - fView->Insert(dstbuf, attr); + fBuffer->Insert(dstbuf, attr); break; case CASE_SJIS_INSTRING: @@ -459,7 +459,7 @@ TermParse::EscParse() GetReaderBuf(cbuf[1]); cbuf[2] = '\0'; CodeConv::ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, now_coding); - fView->Insert(dstbuf, attr); + fBuffer->Insert(dstbuf, attr); break; case CASE_UTF8_2BYTE: @@ -470,7 +470,7 @@ TermParse::EscParse() cbuf[1] = (uchar)c; cbuf[2] = '\0'; - fView->Insert(cbuf, attr); + fBuffer->Insert(cbuf, attr); break; case CASE_UTF8_3BYTE: @@ -485,7 +485,7 @@ TermParse::EscParse() break; cbuf[2] = c; cbuf[3] = '\0'; - fView->Insert(cbuf, attr); + fBuffer->Insert(cbuf, attr); break; case CASE_MBCS: @@ -517,13 +517,13 @@ TermParse::EscParse() break; case CASE_BS: - fView->MoveCurLeft(1); + fBuffer->MoveCurLeft(1); break; case CASE_TAB: - tmp = fView->GetCurX(); + tmp = fBuffer->GetCurX(); tmp %= 8; - fView->MoveCurRight(8 - tmp); + fBuffer->MoveCurRight(8 - tmp); break; case CASE_ESC: @@ -583,7 +583,7 @@ TermParse::EscParse() /* ICH */ if ((row = param[0]) < 1) row = 1; - fView->InsertSpace(row); + fBuffer->InsertSpace(row); parsestate = groundtable; break; @@ -591,7 +591,7 @@ TermParse::EscParse() /* CUU */ if ((row = param[0]) < 1) row = 1; - fView->MoveCurUp(row); + fBuffer->MoveCurUp(row); parsestate = groundtable; break; @@ -599,7 +599,7 @@ TermParse::EscParse() /* CUD */ if ((row = param[0]) < 1) row = 1; - fView->MoveCurDown(row); + fBuffer->MoveCurDown(row); parsestate = groundtable; break; @@ -607,7 +607,7 @@ TermParse::EscParse() /* CUF */ if ((row = param[0]) < 1) row = 1; - fView->MoveCurRight(row); + fBuffer->MoveCurRight(row); parsestate = groundtable; break; @@ -615,7 +615,7 @@ TermParse::EscParse() /* CUB */ if ((row = param[0]) < 1) row = 1; - fView->MoveCurLeft(row); + fBuffer->MoveCurLeft(row); parsestate = groundtable; break; @@ -626,7 +626,7 @@ TermParse::EscParse() if (nparam < 2 || (col = param[1]) < 1) col = 1; - fView->SetCurPos(col - 1, row - 1 ); + fBuffer->SetCurPos(col - 1, row - 1 ); parsestate = groundtable; break; @@ -635,15 +635,15 @@ TermParse::EscParse() switch (param[0]) { case DEFAULT: case 0: - fView->EraseBelow(); + fBuffer->EraseBelow(); break; case 1: break; case 2: - fView->SetCurPos(0, 0); - fView->EraseBelow(); + fBuffer->SetCurPos(0, 0); + fBuffer->EraseBelow(); break; } parsestate = groundtable; @@ -651,7 +651,7 @@ TermParse::EscParse() case CASE_EL: // delete line /* EL */ - fView->DeleteColumns(); + fBuffer->DeleteColumns(); parsestate = groundtable; break; @@ -659,7 +659,7 @@ TermParse::EscParse() /* IL */ if ((row = param[0]) < 1) row = 1; - fView->InsertNewLine(row); + fBuffer->InsertNewLine(row); parsestate = groundtable; break; @@ -667,7 +667,7 @@ TermParse::EscParse() /* DL */ if ((row = param[0]) < 1) row = 1; - fView->DeleteLine(row); + fBuffer->DeleteLine(row); parsestate = groundtable; break; @@ -675,19 +675,19 @@ TermParse::EscParse() /* DCH */ if ((row = param[0]) < 1) row = 1; - fView->DeleteChar(row); + fBuffer->DeleteChar(row); parsestate = groundtable; break; case CASE_SET: /* SET */ - fView->SetInsertMode(MODE_INSERT); + fBuffer->SetInsertMode(MODE_INSERT); parsestate = groundtable; break; case CASE_RST: /* RST */ - fView->SetInsertMode(MODE_OVER); + fBuffer->SetInsertMode(MODE_OVER); parsestate = groundtable; break; @@ -766,7 +766,7 @@ TermParse::EscParse() case CASE_CPR: // Q & D hack by Y.Hayakawa (hida@sawada.riec.tohoku.ac.jp) // 21-JUL-99 - fView->DeviceStatusReport(param[0]); + fBuffer->DeviceStatusReport(param[0]); parsestate = groundtable; break; @@ -785,7 +785,7 @@ TermParse::EscParse() bot--; if (bot > top) - fView->SetScrollRegion(top, bot); + fBuffer->SetScrollRegion(top, bot); parsestate = groundtable; break; @@ -822,13 +822,13 @@ TermParse::EscParse() case CASE_DECSC: /* DECSC */ - fView->SaveCursor(); + fBuffer->SaveCursor(); parsestate = groundtable; break; case CASE_DECRC: /* DECRC */ - fView->RestoreCursor(); + fBuffer->RestoreCursor(); parsestate = groundtable; break; @@ -840,7 +840,7 @@ TermParse::EscParse() case CASE_RI: /* RI */ - fView->ScrollRegion(-1, -1, SCRDOWN, 1); + fBuffer->ScrollRegion(-1, -1, SCRDOWN, 1); parsestate = groundtable; break; @@ -890,7 +890,7 @@ TermParse::EscParse() switch (mode_char) { case '0': case '2': - fView->SetTitle(string); + fBuffer->SetTitle(string); break; case '1': break; @@ -939,7 +939,7 @@ TermParse::EscParse() row = 1; // note beterm wants it 1-based unlike usual terminals - fView->SetCurY(row - 1); + fBuffer->SetCurY(row - 1); parsestate = groundtable; break; @@ -949,7 +949,7 @@ TermParse::EscParse() col = 1; // note beterm wants it 1-based unlike usual terminals - fView->SetCurX(col - 1); + fBuffer->SetCurX(col - 1); parsestate = groundtable; break; diff --git a/src/apps/terminal/TermParse.h b/src/apps/terminal/TermParse.h index 72a2416386..c6383d085c 100644 --- a/src/apps/terminal/TermParse.h +++ b/src/apps/terminal/TermParse.h @@ -40,13 +40,14 @@ //PtyReader buffer size. #define READ_BUF_SIZE 2048 -class TermView; +class TerminalBuffer; + class TermParse : public BHandler { public: TermParse(int fd); ~TermParse(); - status_t StartThreads(TermView *view); + status_t StartThreads(TerminalBuffer *view); status_t StopThreads(); private: @@ -80,7 +81,7 @@ private: int fLockFlag; - TermView *fView; + TerminalBuffer *fBuffer; bool fQuitting; }; diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index fc99267542..e7e5599d63 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -12,13 +12,13 @@ #ifndef TERMVIEW_H #define TERMVIEW_H - -#include "CurPos.h" - #include #include #include +#include "CurPos.h" +#include "TerminalBuffer.h" + class BClipboard; class BMessageRunner; @@ -26,7 +26,8 @@ class BScrollBar; class BString; class Shell; class TermBuffer; -class TermView : public BView { + +class TermView : public BView, public TerminalBuffer { public: TermView(BRect frame, int32 argc, const char **argv, int32 historySize = 1000); TermView(int rows, int columns, int32 argc, const char **argv, int32 historySize = 1000); diff --git a/src/apps/terminal/TerminalBuffer.cpp b/src/apps/terminal/TerminalBuffer.cpp new file mode 100644 index 0000000000..2272150464 --- /dev/null +++ b/src/apps/terminal/TerminalBuffer.cpp @@ -0,0 +1,16 @@ +/* + * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + +#include "TerminalBuffer.h" + + +TerminalBuffer::TerminalBuffer() +{ +} + + +TerminalBuffer::~TerminalBuffer() +{ +} diff --git a/src/apps/terminal/TerminalBuffer.h b/src/apps/terminal/TerminalBuffer.h new file mode 100644 index 0000000000..3cdcc88c85 --- /dev/null +++ b/src/apps/terminal/TerminalBuffer.h @@ -0,0 +1,63 @@ +/* + * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef TERMINAL_BUFFER_H +#define TERMINAL_BUFFER_H + +#include + + +class TerminalBuffer { +public: + TerminalBuffer(); + virtual ~TerminalBuffer(); + + virtual int Encoding() const = 0; + + // Output Character + virtual void Insert(uchar* string, ushort attr) = 0; + virtual void InsertCR() = 0; + virtual void InsertLF() = 0; + virtual void InsertNewLine(int num) = 0; + virtual void SetInsertMode(int flag) = 0; + virtual void InsertSpace(int num) = 0; + + // Delete Character + virtual void EraseBelow() = 0; + virtual void DeleteChar(int num) = 0; + virtual void DeleteColumns() = 0; + virtual void DeleteLine(int num) = 0; + + // Get and Set Cursor position + virtual void SetCurPos(int x, int y) = 0; + virtual void SetCurX(int x) = 0; + virtual void SetCurY(int y) = 0; + virtual int GetCurX() = 0; + virtual void SaveCursor() = 0; + virtual void RestoreCursor() = 0; + + // Move Cursor + virtual void MoveCurRight(int num) = 0; + virtual void MoveCurLeft(int num) = 0; + virtual void MoveCurUp(int num) = 0; + virtual void MoveCurDown(int num) = 0; + + // Cursor setting + virtual void SetCurDraw(bool flag) = 0; + + // Scroll region + virtual void ScrollRegion(int top, int bot, int dir, + int num) = 0; + virtual void SetScrollRegion(int top, int bot) = 0; + virtual void ScrollAtCursor() = 0; + + // Other + virtual void DeviceStatusReport(int) = 0; + virtual void UpdateLine() = 0; + + virtual void SetTitle(const char* title) = 0; + virtual void NotifyQuit(int32 reason) = 0; +}; + +#endif // TERMINAL_BUFFER_H