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
This commit is contained in:
@@ -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
|
||||
;
|
||||
;
|
||||
|
||||
@@ -10,11 +10,6 @@
|
||||
|
||||
#include "Shell.h"
|
||||
|
||||
#include "TermConst.h"
|
||||
#include "TermParse.h"
|
||||
|
||||
#include <OS.h>
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@@ -31,6 +26,13 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <OS.h>
|
||||
|
||||
#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)
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
// TODO: Maybe merge TermParse and Shell classes ?
|
||||
class TermParse;
|
||||
class TermView;
|
||||
|
||||
class Shell {
|
||||
public:
|
||||
Shell();
|
||||
|
||||
@@ -6,11 +6,6 @@
|
||||
*/
|
||||
#include "TermParse.h"
|
||||
|
||||
#include "CodeConv.h"
|
||||
#include "TermConst.h"
|
||||
#include "TermView.h"
|
||||
#include "VTparse.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
@@ -20,6 +15,11 @@
|
||||
#include <Beep.h>
|
||||
#include <Message.h>
|
||||
|
||||
#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 ([email protected])
|
||||
// 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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
#ifndef TERMVIEW_H
|
||||
#define TERMVIEW_H
|
||||
|
||||
|
||||
#include "CurPos.h"
|
||||
|
||||
#include <Messenger.h>
|
||||
#include <String.h>
|
||||
#include <View.h>
|
||||
|
||||
#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);
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright 2008, Ingo Weinhold, [email protected].
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
#include "TerminalBuffer.h"
|
||||
|
||||
|
||||
TerminalBuffer::TerminalBuffer()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TerminalBuffer::~TerminalBuffer()
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright 2008, Ingo Weinhold, [email protected].
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef TERMINAL_BUFFER_H
|
||||
#define TERMINAL_BUFFER_H
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user