X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=inline;f=KernelLand%2FKernel%2Fdrv%2Fvterm_termbuf.c;h=d4ea9a41a787cd307cd64956f7eaf036247b74e0;hb=573469df47d366903d780ca563c9f2da18f2bf62;hp=cb0de748635fd1da7ddf359a96eebf305353e3ef;hpb=0247bf719b9a610776747221b8ed4c1343f5c93a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_termbuf.c b/KernelLand/Kernel/drv/vterm_termbuf.c index cb0de748..d4ea9a41 100644 --- a/KernelLand/Kernel/drv/vterm_termbuf.c +++ b/KernelLand/Kernel/drv/vterm_termbuf.c @@ -62,26 +62,49 @@ void VT_int_PutRawString(tVTerm *Term, const Uint8 *String, size_t Bytes) void VT_int_PutChar(tVTerm *Term, Uint32 Ch) { int i; - tVT_Char *buffer; - int write_pos; - int limit; HEAP_VALIDATE(); - if(Term->Flags & VT_FLAG_ALTBUF) { - buffer = Term->AltBuf; - write_pos = Term->AltWritePos; - limit = Term->TextHeight * Term->TextWidth; + size_t limit = VT_int_GetBufferRows(Term) * Term->TextWidth; + size_t write_pos = *VT_int_GetWritePosPtr(Term); + tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text); + + ASSERTC(write_pos, >=, 0); + + // Scroll entire buffer (about to write outside limit) + if( write_pos >= limit ) + { + ASSERTC(write_pos, <, limit + Term->TextWidth); + VT_int_ScrollText(Term, 1); + write_pos -= Term->TextWidth; } - else { - buffer = Term->Text; - write_pos = Term->WritePos; - limit = Term->TextHeight*(giVT_Scrollback+1) * Term->TextWidth; + + // Bring written cell into view + if( !(Term->Flags & VT_FLAG_ALTBUF) ) + { + size_t onescreen = Term->TextWidth*Term->TextHeight; + if( write_pos >= Term->ViewPos + onescreen ) + { + size_t new_pos = write_pos - (write_pos % Term->TextWidth) - onescreen + Term->TextWidth; + size_t count = (new_pos - Term->ViewPos) / Term->TextWidth; + VT_int_ScrollFramebuffer(Term, count); + //Debug("VT_int_PutChar: VScroll down to %i", new_pos/Term->TextWidth); + Term->ViewPos = new_pos; + } + else if( write_pos < Term->ViewPos ) + { + size_t new_pos = write_pos - (write_pos % Term->TextWidth); + size_t count = (Term->ViewPos - new_pos) / Term->TextWidth; + VT_int_ScrollFramebuffer(Term, -count); + //Debug("VT_int_PutChar: VScroll up to %i", new_pos/Term->TextWidth); + Term->ViewPos = new_pos; + } + else + { + // no action, cell is visible + } } - // TODO: Can the write position be equal to the end of screen? - ASSERTC(write_pos, <, limit); - switch(Ch) { case '\0': // Ignore NULL byte @@ -89,6 +112,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) case '\n': VT_int_UpdateScreen( Term, 0 ); // Update the line before newlining write_pos += Term->TextWidth; + // TODO: Scroll display down if needed case '\r': write_pos -= write_pos % Term->TextWidth; break; @@ -135,43 +159,8 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) break; } - if(Term->Flags & VT_FLAG_ALTBUF) - { - Term->AltWritePos = write_pos; - - if(Term->AltWritePos >= limit) - { - Term->AltWritePos -= Term->TextWidth; - VT_int_ScrollText(Term, 1); - } - } - else - { - Term->WritePos = write_pos; - // Move Screen - // - Check if we need to scroll the entire scrollback buffer - if(Term->WritePos >= limit) - { - int base; - - // Update view position - base = Term->TextWidth*Term->TextHeight*(giVT_Scrollback); - if(Term->ViewPos < base) - Term->ViewPos += Term->Width; - if(Term->ViewPos > base) - 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) - { - VT_int_ScrollFramebuffer( Term, 1 ); - - Term->ViewPos += Term->TextWidth; - } - } + ASSERTC(write_pos, <=, limit); + *VT_int_GetWritePosPtr(Term) = write_pos; HEAP_VALIDATE(); @@ -181,26 +170,23 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) void VT_int_ScrollText(tVTerm *Term, int Count) { tVT_Char *buf; - int *write_pos_ptr; - int height; int scroll_top, scroll_height; HEAP_VALIDATE(); // Get buffer pointer and attributes + size_t height = VT_int_GetBufferRows(Term); + size_t *write_pos_ptr = VT_int_GetWritePosPtr(Term); + if( Term->Flags & VT_FLAG_ALTBUF ) { buf = Term->AltBuf; - height = Term->TextHeight; - write_pos_ptr = &Term->AltWritePos; scroll_top = Term->ScrollTop; scroll_height = Term->ScrollHeight; } else { buf = Term->Text; - height = Term->TextHeight*(giVT_Scrollback+1); - write_pos_ptr = &Term->WritePos; scroll_top = 0; scroll_height = height; } @@ -286,7 +272,7 @@ void VT_int_ClearLine(tVTerm *Term, int Row) { HEAP_VALIDATE(); - size_t height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1); + size_t height = VT_int_GetBufferRows(Term); tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text); ASSERTCR(Row, >=, 0, ); ASSERTCR(Row, <, height, ); @@ -306,7 +292,7 @@ void VT_int_ClearInLine(tVTerm *Term, int Row, int FirstCol, int LastCol) { HEAP_VALIDATE(); - size_t height = Term->TextHeight * (Term->Flags & VT_FLAG_ALTBUF ? 1 : giVT_Scrollback + 1); + size_t height = VT_int_GetBufferRows(Term); tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text); ASSERTCR(Row, >=, 0, ); ASSERTCR(Row, <, height, ); @@ -436,3 +422,13 @@ void VT_int_ToggleAltBuffer(tVTerm *Term, int Enabled) VT_int_UpdateScreen(Term, 1); } +size_t *VT_int_GetWritePosPtr(tVTerm *Term) +{ + return ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos); +} + +size_t VT_int_GetBufferRows(tVTerm *Term) +{ + return ((Term->Flags & VT_FLAG_ALTBUF) ? 1 : (giVT_Scrollback+1))*Term->TextHeight; +} +