#include "../../../Usermode/Applications/gui_terminal_src/vt100.c"
void *Display_GetTermState(tTerminal *Term) {
- return Term->VT100Info;;
+ return Term->VT100Info;
}
void Display_SetTermState(tTerminal *Term, void *State) {
Term->VT100Info = State;
}
+void Display_SendInput(tTerminal *Term, const char *String)
+{
+ PTY_SendInput(Term->PTY, String, strlen(String));
+}
+
void Display_AddText(tTerminal *Term, size_t Length, const char *UTF8Text)
{
LOG("'%*C'", Length, UTF8Text);
VT_int_ScrollText(Term, CountDown);
else
{
- if(Term->ViewPos/Term->TextWidth + CountDown < 0)
+ if(Term->ViewTopRow + CountDown < 0)
return ;
- if(Term->ViewPos/Term->TextWidth + CountDown > Term->TextHeight * (giVT_Scrollback + 1))
+ if(Term->ViewTopRow + CountDown > Term->TextHeight * (giVT_Scrollback + 1))
return ;
- Term->ViewPos += Term->TextWidth * CountDown;
+ Term->ViewTopRow += CountDown;
}
}
void Display_SetCursor(tTerminal *Term, int Row, int Col)
{
LOG("(R%i,C%i)", Row, Col);
VT_int_UpdateScreen(Term, 0);
- int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
+ int maxrows = VT_int_GetBufferRows(Term);
ASSERTCR( Row, >=, 0, );
ASSERTCR( Row, <, maxrows, );
ASSERTCR( Col, >=, 0, );
ASSERTCR( Col, <, Term->TextWidth, );
- *(Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos) = Row*Term->TextWidth + Col;
+ VT_int_GetWritePosPtr(Term)->Row = Row;
+ VT_int_GetWritePosPtr(Term)->Col = Col;
}
void Display_MoveCursor(tTerminal *Term, int RelRow, int RelCol)
{
LOG("(R+%i,C+%i)", RelRow, RelCol);
- int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
+ tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+
+ // TODO: Support scrolling if cursor goes offscreen
+ // if( bScrollIfNeeded )
+ // Display_ScrollDown(extra);
+ // else
+ // clip
if( RelCol != 0 )
{
//
if( RelCol < 0 )
{
- int avail = *wrpos % Term->TextWidth;
- if( RelCol < -avail )
- RelCol = -avail;
+ int max = wrpos->Col;
+ if( RelCol < -max )
+ RelCol = -max;
}
else
{
- size_t avail = Term->TextWidth - (*wrpos % Term->TextWidth);
- if(RelCol > avail)
- RelCol = avail;
+ size_t max = Term->TextWidth - wrpos->Col - 1;
+ if(RelCol > max)
+ RelCol = max;
}
- *wrpos += RelCol;
+ wrpos->Col += RelCol;
}
if( RelRow != 0 )
{
- int currow = *wrpos / Term->TextWidth;
- int maxrows = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight;
+ int currow = wrpos->Row;
+ int maxrows = VT_int_GetBufferRows(Term);
if( RelRow < 0 )
{
if( RelRow < -currow )
if( currow + RelRow > maxrows-1 )
RelRow = maxrows-1 - currow;
}
- *wrpos += RelRow*Term->TextWidth;
+ wrpos->Row += RelRow;
}
- LOG("=(R%i,C%i)", *wrpos / Term->TextWidth, *wrpos % Term->TextWidth);
+ LOG("=(R%i,C%i)", wrpos->Row, wrpos->Col);
}
void Display_SaveCursor(tTerminal *Term)
{
- Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
+ Term->SavedWritePos = *VT_int_GetWritePosPtr(Term);
LOG("Saved = %i", Term->SavedWritePos);
}
void Display_RestoreCursor(tTerminal *Term)
{
- int max = ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight * Term->TextWidth;
- int *wrpos = ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos);
- if( Term->SavedWritePos >= max )
- *wrpos = max-1;
- else
- *wrpos = Term->SavedWritePos;
- LOG("Restored %i", *wrpos);
+ size_t maxrow = VT_int_GetBufferRows(Term);
+ tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+ *wrpos = Term->SavedWritePos;
+ if(wrpos->Row >= maxrow)
+ wrpos->Row = maxrow-1;
+ if(wrpos->Col >= Term->TextWidth )
+ wrpos->Col = Term->TextWidth-1;
+ LOG("Restored (R%i,C%i)", wrpos->Row, wrpos->Col);
}
// 0: All, 1: Forward, -1: Reverse
void Display_ClearLine(tTerminal *Term, int Dir)
{
- int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
- tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text);
+ const tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
- LOG("(Dir=%i)", Dir);
+ LOG("(Dir=%i)", Dir);
// Erase all
if( Dir == 0 ) {
- VT_int_ClearLine(Term, *wrpos / Term->Width);
+ VT_int_ClearLine(Term, wrpos->Row);
VT_int_UpdateScreen(Term, 0);
}
// Erase to right
else if( Dir == 1 ) {
- int max = Term->Width - *wrpos % Term->Width;
- for( int i = 0; i < max; i ++ )
- buffer[*wrpos+i].Ch = 0;
+ VT_int_ClearInLine(Term, wrpos->Row, wrpos->Col, Term->TextWidth);
VT_int_UpdateScreen(Term, 0);
}
// Erase to left
else if( Dir == -1 ) {
- int start = *wrpos - *wrpos % Term->Width;
- for( int i = start; i < *wrpos; i ++ )
- buffer[i].Ch = 0;
+ VT_int_ClearInLine(Term, wrpos->Row, 0, wrpos->Col);
VT_int_UpdateScreen(Term, 0);
}
else {
void Display_ClearLines(tTerminal *Term, int Dir)
{
LOG("(Dir=%i)", Dir);
- int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
+ tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term);
+ size_t height = VT_int_GetBufferRows(Term);
// All
if( Dir == 0 ) {
- int count;
- if( Term->Flags & VT_FLAG_ALTBUF ) {
- count = Term->TextHeight;
- }
- else {
- count = Term->TextHeight * (giVT_Scrollback + 1);
- Term->ViewPos = 0;
+ if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
+ Term->ViewTopRow = 0;
}
+ int count = height;
while( count -- )
VT_int_ClearLine(Term, count);
- *wrpos = 0;
+ wrpos->Col = 0;
+ wrpos->Row = 0;
VT_int_UpdateScreen(Term, 1);
}
// Downwards
else if( Dir == 1 ) {
- Log_Warning("VTerm", "TODO: ClearLines Down");
+ for( int row = wrpos->Row; row < height; row ++ )
+ VT_int_ClearLine(Term, row);
+ VT_int_UpdateScreen(Term, 1);
}
// Upwards
else if( Dir == -1 ) {
- Log_Warning("VTerm", "TODO: ClearLines Up");
+ for( int row = 0; row < wrpos->Row; row ++ )
+ VT_int_ClearLine(Term, row);
+ VT_int_UpdateScreen(Term, 1);
}
else {
// ERROR!