X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm_termbuf.c;h=1a14f8252ab8481f45c3c477e36df1f4336ab7eb;hb=8b72370eae1a3cfa8916136fd8ffc1460e9291ba;hp=d4ea9a41a787cd307cd64956f7eaf036247b74e0;hpb=573469df47d366903d780ca563c9f2da18f2bf62;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_termbuf.c b/KernelLand/Kernel/drv/vterm_termbuf.c index d4ea9a41..1a14f825 100644 --- a/KernelLand/Kernel/drv/vterm_termbuf.c +++ b/KernelLand/Kernel/drv/vterm_termbuf.c @@ -25,6 +25,7 @@ extern int Term_HandleVT100(tVTerm *Term, int Len, const char *Buf); */ void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count) { + ENTER("pTerm pBuffer iCount", Term, Buffer, Count); // Iterate for( int ofs = 0; ofs < Count; ) { @@ -43,7 +44,9 @@ void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count) ofs += esc_len; } // Update Screen - VT_int_UpdateScreen( Term, 1 ); + LOG("Update"); + VT_int_UpdateScreen( Term, 0 ); + LEAVE('-'); } void VT_int_PutRawString(tVTerm *Term, const Uint8 *String, size_t Bytes) @@ -65,60 +68,72 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) HEAP_VALIDATE(); - size_t limit = VT_int_GetBufferRows(Term) * Term->TextWidth; - size_t write_pos = *VT_int_GetWritePosPtr(Term); + const size_t maxrows = VT_int_GetBufferRows(Term); + const size_t limit = maxrows * Term->TextWidth; + tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term); tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF ? Term->AltBuf : Term->Text); - ASSERTC(write_pos, >=, 0); + // If writing with the cursor on righthand edge, wrap down to next line + // TODO: Wrap to same line? + if( wrpos->Col >= Term->TextWidth ) + { + ASSERTC(wrpos->Col, <=, Term->TextWidth); + VT_int_UpdateScreen( Term, 0 ); + wrpos->Row ++; + wrpos->Col = 0; + } // Scroll entire buffer (about to write outside limit) - if( write_pos >= limit ) + if( wrpos->Row >= maxrows ) { - ASSERTC(write_pos, <, limit + Term->TextWidth); + ASSERTC(wrpos->Row, <, maxrows + 1); VT_int_ScrollText(Term, 1); - write_pos -= Term->TextWidth; + wrpos->Row --; } // Bring written cell into view if( !(Term->Flags & VT_FLAG_ALTBUF) ) { - size_t onescreen = Term->TextWidth*Term->TextHeight; - if( write_pos >= Term->ViewPos + onescreen ) + if( wrpos->Row >= Term->ViewTopRow + Term->TextHeight ) { - size_t new_pos = write_pos - (write_pos % Term->TextWidth) - onescreen + Term->TextWidth; - size_t count = (new_pos - Term->ViewPos) / Term->TextWidth; + size_t new_pos = wrpos->Row - (Term->TextHeight - 1); + size_t count = new_pos - Term->ViewTopRow; VT_int_ScrollFramebuffer(Term, count); - //Debug("VT_int_PutChar: VScroll down to %i", new_pos/Term->TextWidth); - Term->ViewPos = new_pos; + //Debug("VT_int_PutChar: VScroll down to %i", new_pos); + Term->ViewTopRow = new_pos; } - else if( write_pos < Term->ViewPos ) + else if( wrpos->Row < Term->ViewTopRow ) { - size_t new_pos = write_pos - (write_pos % Term->TextWidth); - size_t count = (Term->ViewPos - new_pos) / Term->TextWidth; + size_t new_pos = wrpos->Row; + size_t count = Term->ViewTopRow - new_pos; VT_int_ScrollFramebuffer(Term, -count); - //Debug("VT_int_PutChar: VScroll up to %i", new_pos/Term->TextWidth); - Term->ViewPos = new_pos; + //Debug("VT_int_PutChar: VScroll up to %i", new_pos); + Term->ViewTopRow = new_pos; } else { // no action, cell is visible } } - + + size_t write_pos = wrpos->Row * Term->TextWidth + wrpos->Col; + ASSERTC(write_pos, <, limit); + switch(Ch) { case '\0': // Ignore NULL byte return; case '\n': + LOG("Newline, update @ %i", write_pos); VT_int_UpdateScreen( Term, 0 ); // Update the line before newlining - write_pos += Term->TextWidth; - // TODO: Scroll display down if needed + wrpos->Row ++; + // TODO: Force scroll? case '\r': - write_pos -= write_pos % Term->TextWidth; + wrpos->Col = 0; break; case '\t': { - size_t col = write_pos % Term->TextWidth; + size_t col = wrpos->Col; do { buffer[ write_pos ].Ch = '\0'; buffer[ write_pos ].Colour = Term->CurColour; @@ -147,28 +162,33 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) } while(write_pos && i-- && buffer[ write_pos ].Ch == '\0'); if(buffer[ write_pos ].Ch != '\0') write_pos ++; + wrpos->Col = write_pos % Term->TextWidth; break; default: buffer[ write_pos ].Ch = Ch; buffer[ write_pos ].Colour = Term->CurColour; // Update the line before wrapping - if( (write_pos + 1) % Term->TextWidth == 0 ) + if( (write_pos + 1) % Term->TextWidth == 0 ) { + LOG("Line wrap, update @ %i", write_pos); VT_int_UpdateScreen( Term, 0 ); + // NOTE: Code at the top of PutChar handles the actual wrapping + } + wrpos->Col ++; write_pos ++; break; } ASSERTC(write_pos, <=, limit); - *VT_int_GetWritePosPtr(Term) = write_pos; HEAP_VALIDATE(); - //LEAVE('-'); + // TODO: Schedule a delayed screen update } void VT_int_ScrollText(tVTerm *Term, int Count) { + ENTER("pTerm iCount", Term, Count); tVT_Char *buf; int scroll_top, scroll_height; @@ -176,7 +196,7 @@ void VT_int_ScrollText(tVTerm *Term, int Count) // Get buffer pointer and attributes size_t height = VT_int_GetBufferRows(Term); - size_t *write_pos_ptr = VT_int_GetWritePosPtr(Term); + tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term); if( Term->Flags & VT_FLAG_ALTBUF ) { @@ -191,7 +211,7 @@ void VT_int_ScrollText(tVTerm *Term, int Count) scroll_height = height; } - const int init_write_pos = *write_pos_ptr; + const tVT_Pos init_wrpos = *wrpos; // Scroll text upwards (more space at bottom) if( Count > 0 ) @@ -217,13 +237,13 @@ void VT_int_ScrollText(tVTerm *Term, int Count) // Update Screen VT_int_ScrollFramebuffer( Term, Count ); if( Term->Flags & VT_FLAG_ALTBUF ) - Term->AltWritePos = base; + wrpos->Row = scroll_top; else - Term->WritePos = Term->ViewPos + Term->TextWidth*(Term->TextHeight - Count); + wrpos->Row = Term->ViewTopRow + (Term->TextHeight - Count); for( int i = 0; i < Count; i ++ ) { VT_int_UpdateScreen( Term, 0 ); - *write_pos_ptr += Term->TextWidth; + wrpos->Row ++; } } else @@ -249,18 +269,20 @@ void VT_int_ScrollText(tVTerm *Term, int Count) // Update screen (shift framebuffer, re-render revealed lines) VT_int_ScrollFramebuffer( Term, -Count ); if( Term->Flags & VT_FLAG_ALTBUF ) - Term->AltWritePos = Term->TextWidth*scroll_top; + wrpos->Row = scroll_top; else - Term->WritePos = Term->ViewPos; + wrpos->Row = Term->ViewTopRow; for( int i = 0; i < Count; i ++ ) { VT_int_UpdateScreen( Term, 0 ); + // Increment? } } - *write_pos_ptr = init_write_pos; + *wrpos = init_wrpos; HEAP_VALIDATE(); + LEAVE('-'); } /** @@ -422,7 +444,7 @@ void VT_int_ToggleAltBuffer(tVTerm *Term, int Enabled) VT_int_UpdateScreen(Term, 1); } -size_t *VT_int_GetWritePosPtr(tVTerm *Term) +tVT_Pos *VT_int_GetWritePosPtr(tVTerm *Term) { return ((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos); }