#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);
LOG("(R+%i,C+%i)", RelRow, RelCol);
int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
+ // TODO: Support scrolling if cursor goes offscreen
+ // if( bScrollIfNeeded )
+ // Display_ScrollDown(extra);
+ // else
+ // clip
+
if( RelCol != 0 )
{
//
// 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 int wrpos = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltWritePos : Term->WritePos);
+ const int row = wrpos / Term->TextWidth;
+ const int col = wrpos % Term->TextWidth;
- LOG("(Dir=%i)", Dir);
+ LOG("(Dir=%i)", Dir);
// Erase all
if( Dir == 0 ) {
- VT_int_ClearLine(Term, *wrpos / Term->Width);
+ VT_int_ClearLine(Term, 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, row, 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, row, 0, col);
VT_int_UpdateScreen(Term, 0);
}
else {
{
LOG("(Dir=%i)", Dir);
int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos);
+ int height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1);
// All
if( Dir == 0 ) {
- int count;
- if( Term->Flags & VT_FLAG_ALTBUF ) {
- count = Term->TextHeight;
- }
- else {
- count = Term->TextHeight * (giVT_Scrollback + 1);
+ if( !(Term->Flags & VT_FLAG_ALTBUF) ) {
Term->ViewPos = 0;
}
+ int count = height;
while( count -- )
VT_int_ClearLine(Term, count);
*wrpos = 0;
}
// Downwards
else if( Dir == 1 ) {
- Log_Warning("VTerm", "TODO: ClearLines Down");
+ for( int row = *wrpos / Term->TextWidth; 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 / Term->TextWidth; row ++ )
+ VT_int_ClearLine(Term, row);
+ VT_int_UpdateScreen(Term, 1);
}
else {
// ERROR!