X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm_vt100.c;h=0d59a666fc7f6158968087cceb55352a17571a1b;hb=3c283c4831c40c14d308a54cefb997832a860bca;hp=bab78022e6babc805aa74fb1bcdbd5ceee876e0f;hpb=45ea05112879353e05848dde97fff36615721d6b;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_vt100.c b/KernelLand/Kernel/drv/vterm_vt100.c index bab78022..0d59a666 100644 --- a/KernelLand/Kernel/drv/vterm_vt100.c +++ b/KernelLand/Kernel/drv/vterm_vt100.c @@ -11,8 +11,21 @@ #define sTerminal sVTerm #include "../../../Usermode/Applications/gui_terminal_src/vt100.c" +void *Display_GetTermState(tTerminal *Term) { + 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_PutRawString(Term, (const void*)UTF8Text, Length); } void Display_Newline(tTerminal *Term, bool bCarriageReturn) @@ -31,107 +44,111 @@ void Display_ScrollDown(tTerminal *Term, int CountDown) LOG("(%i)", CountDown); VT_int_UpdateScreen(Term, 0); if( Term->Flags & VT_FLAG_ALTBUF ) - VT_int_ScrollText(Term, CountDown); + 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 ) { - size_t 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( currow + RelRow < 0 ) - RelRow = currow; + if( RelRow < -currow ) + RelRow = -currow; } else { if( currow + RelRow > maxrows-1 ) RelRow = maxrows-1 - currow; } - *wrpos += RelRow*Term->TextWidth; + wrpos->Row += RelRow; } + 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 { @@ -143,32 +160,33 @@ void Display_ClearLine(tTerminal *Term, int Dir) void Display_ClearLines(tTerminal *Term, int Dir) { LOG("(Dir=%i)", Dir); - int *wrpos = (Term->Flags & VT_FLAG_ALTBUF ? &Term->AltWritePos : &Term->WritePos); - tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text); + 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! @@ -192,7 +210,7 @@ void Display_SetBackground(tTerminal *Term, uint32_t RGB) { LOG("(%06x)", RGB); Term->CurColour &= 0xFFFF8000; - Term->CurColour |= (Uint32)VT_Colour24to12(RGB) <<06; + Term->CurColour |= (Uint32)VT_Colour24to12(RGB) << 0; } void Display_Flush(tTerminal *Term) { @@ -204,4 +222,8 @@ void Display_ShowAltBuffer(tTerminal *Term, bool AltBufEnabled) LOG("(%B)", AltBufEnabled); VT_int_ToggleAltBuffer(Term, AltBufEnabled); } +void Display_SetTitle(tTerminal *Term, const char *Title) +{ + // ignore +}