X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm_termbuf.c;h=525f1a4b3d0034ede417839c2ed189eb7dc83dec;hb=b0da731b2d89b9dd58de2c98eaf6218a41a21920;hp=2511048cfaf86ae23606cb5231f59e5fd2c9941a;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_termbuf.c b/KernelLand/Kernel/drv/vterm_termbuf.c index 2511048c..525f1a4b 100644 --- a/KernelLand/Kernel/drv/vterm_termbuf.c +++ b/KernelLand/Kernel/drv/vterm_termbuf.c @@ -15,24 +15,27 @@ */ void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count) { - Uint32 val; int i; // Iterate for( i = 0; i < Count; i++ ) { // Handle escape sequences - if( Buffer[i] == 0x1B ) + if( Buffer[i] == 0x1B && Count - i > 1 ) { - i ++; - i += VT_int_ParseEscape(Term, (const char*)&Buffer[i]) - 1; - continue; + int ret = VT_int_ParseEscape(Term, (const char*)&Buffer[i+1], Count-(i+1)); + if( ret > 0 ) + { + i += ret; + continue; + } } // Fast check for non UTF-8 if( Buffer[i] < 128 ) // Plain ASCII VT_int_PutChar(Term, Buffer[i]); else { // UTF-8 + Uint32 val; i += ReadUTF8(&Buffer[i], &val) - 1; VT_int_PutChar(Term, val); } @@ -70,14 +73,15 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) write_pos -= write_pos % Term->TextWidth; break; - case '\t': { int tmp = write_pos / Term->TextWidth; + case '\t': { + int line = write_pos / Term->TextWidth; write_pos %= Term->TextWidth; do { buffer[ write_pos ].Ch = '\0'; buffer[ write_pos ].Colour = Term->CurColour; write_pos ++; } while(write_pos & 7); - write_pos += tmp * Term->TextWidth; + write_pos += line * Term->TextWidth; break; } case '\b': @@ -85,7 +89,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) if(write_pos == 0) break; write_pos --; - // Singe Character + // Single Character if(buffer[ write_pos ].Ch != '\0') { buffer[ write_pos ].Ch = 0; buffer[ write_pos ].Colour = Term->CurColour; @@ -114,7 +118,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) if(Term->Flags & VT_FLAG_ALTBUF) { - Term->AltBuf = buffer; Term->AltWritePos = write_pos; if(Term->AltWritePos >= Term->TextWidth*Term->TextHeight) @@ -126,7 +129,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) } else { - Term->Text = buffer; Term->WritePos = write_pos; // Move Screen // - Check if we need to scroll the entire scrollback buffer @@ -134,10 +136,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) { int base; - // Update previous line - Term->WritePos -= Term->TextWidth; - VT_int_UpdateScreen( Term, 0 ); - // Update view position base = Term->TextWidth*Term->TextHeight*(giVT_Scrollback); if(Term->ViewPos < base) @@ -146,16 +144,12 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) Term->ViewPos = base; VT_int_ScrollText(Term, 1); + Term->WritePos -= Term->TextWidth; } // Ok, so we only need to scroll the screen else if(Term->WritePos >= Term->ViewPos + Term->TextWidth*Term->TextHeight) { - // Update the last line - Term->WritePos -= Term->TextWidth; - VT_int_UpdateScreen( Term, 0 ); - Term->WritePos += Term->TextWidth; - - VT_int_ScrollText(Term, 1); + VT_int_ScrollFramebuffer( Term, 1 ); Term->ViewPos += Term->TextWidth; } @@ -189,7 +183,7 @@ void VT_int_ScrollText(tVTerm *Term, int Count) scroll_height = height; } - // Scroll text downwards + // Scroll text upwards (more space at bottom) if( Count > 0 ) { int base; @@ -370,6 +364,7 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode, int NewWidth, int NewHeight) } // Debug + #if 0 switch(NewMode) { case TERM_MODE_TEXT: @@ -384,6 +379,7 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode, int NewWidth, int NewHeight) //case TERM_MODE_3DACCEL: // return; } + #endif }