diff --git a/src/apps/terminal/CodeConv.cpp b/src/apps/terminal/CodeConv.cpp index 27677bfbf4..2af5a842f5 100644 --- a/src/apps/terminal/CodeConv.cpp +++ b/src/apps/terminal/CodeConv.cpp @@ -33,17 +33,8 @@ UTF8 extern char gUTF8WidthTable[]; // defined in UTF8WidthTbl.c -CodeConv::CodeConv() -{ -} - - -CodeConv::~CodeConv() -{ -} - - //! get font width in coding. +/* static */ int32 CodeConv::UTF8GetFontWidth(const char *string) { @@ -61,6 +52,7 @@ CodeConv::UTF8GetFontWidth(const char *string) //! Convert internal coding from src coding. +/* static */ int32 CodeConv::ConvertFromInternal(const char *src, int32 srclen, char *dst, int coding) { @@ -92,6 +84,7 @@ CodeConv::ConvertFromInternal(const char *src, int32 srclen, char *dst, int codi //! Convert internal coding to src coding. +/* static */ int32 CodeConv::ConvertToInternal(const char *src, int32 srclen, char *dst, int coding) { @@ -131,6 +124,7 @@ CodeConv::ConvertToInternal(const char *src, int32 srclen, char *dst, int coding } +/* static */ unsigned short CodeConv::UTF8toUnicode(const char *utf8) { @@ -157,6 +151,7 @@ CodeConv::UTF8toUnicode(const char *utf8) } +/* static */ void CodeConv::euc_to_sjis(uchar *buf) { diff --git a/src/apps/terminal/CodeConv.h b/src/apps/terminal/CodeConv.h index 0ab32b9f2e..12460e5e74 100644 --- a/src/apps/terminal/CodeConv.h +++ b/src/apps/terminal/CodeConv.h @@ -13,23 +13,17 @@ class CodeConv { public: - CodeConv(); - ~CodeConv(); - - int32 UTF8GetFontWidth(const char *string); + static int32 UTF8GetFontWidth(const char *string); /* internal(UTF8) -> coding */ - int32 ConvertFromInternal(const char *src, int32 bytes, char *dst, int coding); + static int32 ConvertFromInternal(const char *src, int32 bytes, char *dst, int coding); /* coding -> internal(UTF8) */ - int32 ConvertToInternal(const char *src, int32 bytes, char *dst, int coding); + static int32 ConvertToInternal(const char *src, int32 bytes, char *dst, int coding); private: - void euc_to_sjis(uchar *buf); - - unsigned short UTF8toUnicode(const char *utf8); - - int fNowCoding; + static void euc_to_sjis(uchar *buf); + static unsigned short UTF8toUnicode(const char *utf8); }; #endif /* CODECONV_H */ diff --git a/src/apps/terminal/Shell.cpp b/src/apps/terminal/Shell.cpp index 919269660b..99f5826683 100644 --- a/src/apps/terminal/Shell.cpp +++ b/src/apps/terminal/Shell.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,8 @@ #include #include "TermConst.h" +#include "TermParse.h" +#include "TermView.h" #include "Shell.h" #include "PrefHandler.h" @@ -108,7 +111,10 @@ static pid_t sShPid; Shell::Shell() - :fFd(-1) + : + fFd(-1), + fTermParse(NULL), + fAttached(false) { } @@ -125,13 +131,25 @@ Shell::Open(int row, int col, const char *command, const char *coding) if (fFd >= 0) return B_ERROR; - return _Spawn(row, col, command, coding); + status_t status = _Spawn(row, col, command, coding); + if (status < B_OK) + return status; + + fTermParse = new (std::nothrow) TermParse(fFd); + if (fTermParse == NULL) { + Close(); + return B_NO_MEMORY; + } + + return B_OK; } void Shell::Close() { + delete fTermParse; + if (fFd >= 0) { close(fFd); kill(-sShPid, SIGHUP); @@ -208,6 +226,30 @@ Shell::FD() const } +void +Shell::ViewAttached(TermView *view) +{ + if (fAttached) + return; + + status_t status = fTermParse->StartThreads(view); + if (status < B_OK) { + // TODO: What can we do here ? + fprintf(stderr, "Shell:ViewAttached():" + " cannot start parser threads: %s", + strerror(status)); + } +} + + +void +Shell::ViewDetached() +{ + if (fAttached) + fTermParse->StopThreads(); +} + + // private static status_t send_handshake_message(thread_id target, const handshake_t& handshake) diff --git a/src/apps/terminal/Shell.h b/src/apps/terminal/Shell.h index 1c11ea59f9..11fe5297b1 100644 --- a/src/apps/terminal/Shell.h +++ b/src/apps/terminal/Shell.h @@ -81,10 +81,13 @@ #define RDEL 0xFF +// TODO: Maybe merge TermParse and Shell classes ? +class TermParse; +class TermView; class Shell { public: Shell(); - ~Shell(); + virtual ~Shell(); status_t Open(int row, int col, const char *command, const char *coding); void Close(); @@ -101,9 +104,14 @@ public: status_t SetAttr(struct termios &attr); int FD() const; + + virtual void ViewAttached(TermView *view); + virtual void ViewDetached(); private: - int fFd; + int fFd; + TermParse *fTermParse; + bool fAttached; status_t _Spawn(int row, int col, const char *command, const char *coding); }; diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index 20f10d1152..3dee70c14c 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -47,11 +47,10 @@ extern int mbcstable[]; /* ESC $ */ #define NPARAM 10 // Max parameters -TermParse::TermParse(int fd, TermView *inViewObj, CodeConv *inConvObj) +TermParse::TermParse(int fd) : fFd(fd), - fViewObj(inViewObj), - fConvObj(inConvObj), + fViewObj(NULL), fParseThread(-1), fParseSem(-1), fReaderThread(-1), @@ -66,6 +65,33 @@ TermParse::TermParse(int fd, TermView *inViewObj, CodeConv *inConvObj) TermParse::~TermParse() +{ + StopThreads(); +} + + +status_t +TermParse::StartThreads(TermView *view) +{ + fViewObj = view; + + status_t status = InitPtyReader(); + + if (status < B_OK) + return status; + + status = InitTermParse(); + if (status < B_OK) { + //AbortPtyReader(); + return status; + } + + return B_OK; +} + + +status_t +TermParse::StopThreads() { fQuitting = true; @@ -78,22 +104,8 @@ TermParse::~TermParse() status_t dummy; wait_for_thread(fReaderThread, &dummy); wait_for_thread(fParseThread, &dummy); -} - -status_t -TermParse::StartThreads() -{ - status_t status = InitPtyReader(); - - if (status < B_OK) - return status; - - status = InitTermParse(); - if (status < B_OK) { - //AbortPtyReader(); - return status; - } + fViewObj = NULL; return B_OK; } @@ -241,10 +253,7 @@ TermParse::EscParse() int top, bot; int cs96; uchar curess = 0; - - TermView *viewObj = fViewObj; - CodeConv *convObj = fConvObj; - + uchar cbuf[4], dstbuf[4]; uchar *ptr; @@ -305,7 +314,7 @@ TermParse::EscParse() cbuf[0] = c; cbuf[1] = '\0'; width = HALF_WIDTH; - viewObj->PutChar(cbuf, attr, width); + fViewObj->PutChar(cbuf, attr, width); break; case CASE_PRINT_GR: @@ -346,11 +355,11 @@ TermParse::EscParse() } if (now_coding != M_ISO_2022_JP) - convObj->ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, now_coding); + CodeConv::ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, now_coding); else - convObj->ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, M_EUC_JP); + CodeConv::ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, M_EUC_JP); - viewObj->PutChar(dstbuf, attr, width); + fViewObj->PutChar(dstbuf, attr, width); break; case CASE_PRINT_CS96: @@ -359,33 +368,33 @@ TermParse::EscParse() cbuf[1] |= 0x80; cbuf[2] = 0; width = 2; - convObj->ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, M_EUC_JP); - viewObj->PutChar(dstbuf, attr, width); + CodeConv::ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, M_EUC_JP); + fViewObj->PutChar(dstbuf, attr, width); break; case CASE_LF: - viewObj->PutLF(); + fViewObj->PutLF(); break; case CASE_CR: - viewObj->PutCR(); + fViewObj->PutCR(); break; case CASE_SJIS_KANA: cbuf[0] = (uchar)c; cbuf[1] = '\0'; - convObj->ConvertToInternal((char*)cbuf, 1, (char*)dstbuf, now_coding); + CodeConv::ConvertToInternal((char*)cbuf, 1, (char*)dstbuf, now_coding); width = 1; - viewObj->PutChar(dstbuf, attr, width); + fViewObj->PutChar(dstbuf, attr, width); break; case CASE_SJIS_INSTRING: cbuf[0] = (uchar)c; GetReaderBuf(cbuf[1]); cbuf[2] = '\0'; - convObj->ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, now_coding); + CodeConv::ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, now_coding); width = 2; - viewObj->PutChar(dstbuf, attr, width); + fViewObj->PutChar(dstbuf, attr, width); break; case CASE_UTF8_2BYTE: @@ -395,8 +404,8 @@ TermParse::EscParse() break; cbuf[1] = (uchar)c; cbuf[2] = '\0'; - width = convObj->UTF8GetFontWidth((char*)cbuf); - viewObj->PutChar(cbuf, attr, width); + width = CodeConv::UTF8GetFontWidth((char*)cbuf); + fViewObj->PutChar(cbuf, attr, width); break; case CASE_UTF8_3BYTE: @@ -411,8 +420,8 @@ TermParse::EscParse() break; cbuf[2] = c; cbuf[3] = '\0'; - width = convObj->UTF8GetFontWidth((char*)cbuf); - viewObj->PutChar (cbuf, attr, width); + width = CodeConv::UTF8GetFontWidth((char*)cbuf); + fViewObj->PutChar (cbuf, attr, width); break; case CASE_MBCS: @@ -444,13 +453,13 @@ TermParse::EscParse() break; case CASE_BS: - viewObj->MoveCurLeft(1); + fViewObj->MoveCurLeft(1); break; case CASE_TAB: - tmp = viewObj->GetCurX(); + tmp = fViewObj->GetCurX(); tmp %= 8; - viewObj->MoveCurRight(8 - tmp); + fViewObj->MoveCurRight(8 - tmp); break; case CASE_ESC: @@ -510,7 +519,7 @@ TermParse::EscParse() /* ICH */ if ((row = param[0]) < 1) row = 1; - viewObj->InsertSpace(row); + fViewObj->InsertSpace(row); parsestate = groundtable; break; @@ -518,7 +527,7 @@ TermParse::EscParse() /* CUU */ if ((row = param[0]) < 1) row = 1; - viewObj->MoveCurUp(row); + fViewObj->MoveCurUp(row); parsestate = groundtable; break; @@ -526,7 +535,7 @@ TermParse::EscParse() /* CUD */ if ((row = param[0]) < 1) row = 1; - viewObj->MoveCurDown(row); + fViewObj->MoveCurDown(row); parsestate = groundtable; break; @@ -534,7 +543,7 @@ TermParse::EscParse() /* CUF */ if ((row = param[0]) < 1) row = 1; - viewObj->MoveCurRight(row); + fViewObj->MoveCurRight(row); parsestate = groundtable; break; @@ -542,7 +551,7 @@ TermParse::EscParse() /* CUB */ if ((row = param[0]) < 1) row = 1; - viewObj->MoveCurLeft(row); + fViewObj->MoveCurLeft(row); parsestate = groundtable; break; @@ -553,7 +562,7 @@ TermParse::EscParse() if (nparam < 2 || (col = param[1]) < 1) col = 1; - viewObj->SetCurPos(col - 1, row - 1 ); + fViewObj->SetCurPos(col - 1, row - 1 ); parsestate = groundtable; break; @@ -562,15 +571,15 @@ TermParse::EscParse() switch (param[0]) { case DEFAULT: case 0: - viewObj->EraseBelow(); + fViewObj->EraseBelow(); break; case 1: break; case 2: - viewObj->SetCurPos(0, 0); - viewObj->EraseBelow(); + fViewObj->SetCurPos(0, 0); + fViewObj->EraseBelow(); break; } parsestate = groundtable; @@ -578,7 +587,7 @@ TermParse::EscParse() case CASE_EL: // delete line /* EL */ - viewObj->DeleteColumns(); + fViewObj->DeleteColumns(); parsestate = groundtable; break; @@ -586,7 +595,7 @@ TermParse::EscParse() /* IL */ if ((row = param[0]) < 1) row = 1; - viewObj->PutNL(row); + fViewObj->PutNL(row); parsestate = groundtable; break; @@ -594,7 +603,7 @@ TermParse::EscParse() /* DL */ if ((row = param[0]) < 1) row = 1; - viewObj->DeleteLine(row); + fViewObj->DeleteLine(row); parsestate = groundtable; break; @@ -602,19 +611,19 @@ TermParse::EscParse() /* DCH */ if ((row = param[0]) < 1) row = 1; - viewObj->DeleteChar(row); + fViewObj->DeleteChar(row); parsestate = groundtable; break; case CASE_SET: /* SET */ - viewObj->SetInsertMode(MODE_INSERT); + fViewObj->SetInsertMode(MODE_INSERT); parsestate = groundtable; break; case CASE_RST: /* RST */ - viewObj->SetInsertMode(MODE_OVER); + fViewObj->SetInsertMode(MODE_OVER); parsestate = groundtable; break; @@ -681,7 +690,7 @@ TermParse::EscParse() case CASE_CPR: // Q & D hack by Y.Hayakawa (hida@sawada.riec.tohoku.ac.jp) // 21-JUL-99 - viewObj->DeviceStatusReport(param[0]); + fViewObj->DeviceStatusReport(param[0]); parsestate = groundtable; break; @@ -700,7 +709,7 @@ TermParse::EscParse() bot--; if (bot > top) - viewObj->SetScrollRegion(top, bot); + fViewObj->SetScrollRegion(top, bot); parsestate = groundtable; break; @@ -737,13 +746,13 @@ TermParse::EscParse() case CASE_DECSC: /* DECSC */ - viewObj->SaveCursor(); + fViewObj->SaveCursor(); parsestate = groundtable; break; case CASE_DECRC: /* DECRC */ - viewObj->RestoreCursor(); + fViewObj->RestoreCursor(); parsestate = groundtable; break; @@ -755,7 +764,7 @@ TermParse::EscParse() case CASE_RI: /* RI */ - viewObj->ScrollRegion(-1, -1, SCRDOWN, 1); + fViewObj->ScrollRegion(-1, -1, SCRDOWN, 1); parsestate = groundtable; break; diff --git a/src/apps/terminal/TermParse.h b/src/apps/terminal/TermParse.h index 0441291d36..f0d30637bd 100644 --- a/src/apps/terminal/TermParse.h +++ b/src/apps/terminal/TermParse.h @@ -34,21 +34,20 @@ #include "TermConst.h" #include +#include #include - -class TermView; -class CodeConv; - //PtyReader buffer size. #define READ_BUF_SIZE 2048 +class TermView; class TermParse : public BHandler { public: - TermParse(int fd, TermView *inViewObj, CodeConv *inConvObj); + TermParse(int fd); ~TermParse(); - status_t StartThreads(); + status_t StartThreads(TermView *view); + status_t StopThreads(); private: // Initialize TermParse and PtyReader thread. @@ -71,7 +70,6 @@ private: int fFd; TermView *fViewObj; - CodeConv *fConvObj; thread_id fParseThread; sem_id fParseSem; diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 07eb9ec23f..163f908354 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -61,7 +61,7 @@ const static rgb_color kTermColorTable[16] = { }; -TermView::TermView(BRect frame, CodeConv *inCodeConv) +TermView::TermView(BRect frame) : BView(frame, "termview", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS), fShell(NULL), fFontWidth(0), @@ -85,7 +85,6 @@ TermView::TermView(BRect frame, CodeConv *inCodeConv) fTermColumns(PrefHandler::Default()->getInt32(PREF_COLS)), fTop(0), fTextBuffer(new (nothrow) TermBuffer(fTermRows, fTermColumns)), - fCodeConv(inCodeConv), fScrollBar(NULL), fScrTop(0), fScrBot(fTermRows - 1), @@ -127,7 +126,8 @@ TermView::AttachShell(Shell *shell) return B_BAD_VALUE; fShell = shell; - + fShell->ViewAttached(this); + return B_OK; } @@ -135,6 +135,7 @@ TermView::AttachShell(Shell *shell) void TermView::DetachShell() { + fShell->ViewDetached(); fShell = NULL; } @@ -1352,7 +1353,7 @@ TermView::KeyDown(const char *bytes, int32 numBytes) // input multibyte character if (GetEncoding() != M_UTF8) { - int cnum = fCodeConv->ConvertFromInternal(bytes, numBytes, + int cnum = CodeConv::ConvertFromInternal(bytes, numBytes, (char *)dstbuf, GetEncoding()); fShell->Write(dstbuf, cnum); return; @@ -1600,7 +1601,7 @@ TermView::WritePTY(const uchar *text, int numBytes) { if (GetEncoding() != M_UTF8) { uchar *destBuffer = (uchar *)malloc(numBytes * 3); - numBytes = fCodeConv->ConvertFromInternal((char*)text, numBytes, + numBytes = CodeConv::ConvertFromInternal((char*)text, numBytes, (char*)destBuffer, GetEncoding()); fShell->Write(destBuffer, numBytes); free(destBuffer); diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index ad18267727..69e4f75c3b 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -90,7 +90,6 @@ const unsigned char M_ADD_CURSOR [] = { }; class TermBuffer; -class CodeConv; class BPopUpMenu; class BScrollBar; class BString; @@ -98,7 +97,7 @@ class Shell; class TermView : public BView { public: - TermView(BRect frame, CodeConv *inCodeConv); + TermView(BRect frame); ~TermView(); status_t AttachShell(Shell *shell); @@ -282,7 +281,6 @@ class TermView : public BView { // Object pointer. TermBuffer *fTextBuffer; - CodeConv *fCodeConv; BScrollBar *fScrollBar; // Offscreen Bitmap and View. diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index 0755115c97..7a8aa82374 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -27,7 +27,7 @@ #include #include -#include "CodeConv.h" +#include "Coding.h" #include "ColorWindow.h" #include "MenuUtil.h" #include "FindWindow.h" @@ -54,7 +54,6 @@ TermWindow::TermWindow(BRect frame, const char* title, const char *command) : BWindow(frame, title, B_DOCUMENT_WINDOW, B_CURRENT_WORKSPACE|B_QUIT_ON_WINDOW_CLOSE), fShell(NULL), - fTermParse(NULL), fMenubar(NULL), fFilemenu(NULL), fEditmenu(NULL), @@ -64,7 +63,6 @@ TermWindow::TermWindow(BRect frame, const char* title, const char *command) fWindowSizeMenu(NULL), fNewFontMenu(NULL), fTermView(NULL), - fCodeConv(NULL), fPrintSettings(NULL), fPrefWindow(NULL), fFindPanel(NULL), @@ -106,8 +104,6 @@ TermWindow::~TermWindow() fTermView->DetachShell(); delete fShell; - delete fTermParse; - delete fCodeConv; if (fPrefWindow) fPrefWindow->PostMessage(B_QUIT_REQUESTED); @@ -159,13 +155,11 @@ TermWindow::InitWindow() BRect textframe = Bounds(); textframe.top = fMenubar->Bounds().bottom + 1.0; - fCodeConv = new CodeConv(); - fTermView = new TermView(textframe, fCodeConv); + fTermView = new TermView(textframe); fTermView->AttachShell(fShell); // Initialize TermView. (font, size and color) - fTermView->SetTermFont(&halfFont, &fullFont); BRect rect = fTermView->SetTermSize(PrefHandler::Default()->getInt32(PREF_ROWS), @@ -205,9 +199,6 @@ TermWindow::InitWindow() // Initialize TermParse SetEncoding(longname2id(PrefHandler::Default()->getString(PREF_TEXT_ENCODING))); - fTermParse = new TermParse(fShell->FD(), fTermView, fCodeConv); - if (fTermParse->StartThreads() < B_OK) - return; // Initialize MessageRunner. fWindowUpdate = new BMessageRunner(BMessenger(this), diff --git a/src/apps/terminal/TermWindow.h b/src/apps/terminal/TermWindow.h index 791cf5a96e..9c089e46f8 100644 --- a/src/apps/terminal/TermWindow.h +++ b/src/apps/terminal/TermWindow.h @@ -37,7 +37,6 @@ class BMenu; class BMenuBar; class BMessageRunner; -class CodeConv; class FindWindow; class PrefWindow; class Shell; @@ -79,7 +78,6 @@ private: *fWindowSizeMenu, *fNewFontMenu; TermView *fTermView; - CodeConv *fCodeConv; BMessage *fPrintSettings; PrefWindow *fPrefWindow; FindWindow *fFindPanel;