X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm_output.c;h=95c552f5f898417fc41db9a8edf3f8766ffb2834;hb=5b487e31cf5145372e9777e9f82a8cd661d4f1b4;hp=357132c03ecdd00a7f2544805236ea8f214dfa9b;hpb=dca6decf0b2d98f521488f071ba3af1a4a6b8647;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_output.c b/KernelLand/Kernel/drv/vterm_output.c index 357132c0..95c552f5 100644 --- a/KernelLand/Kernel/drv/vterm_output.c +++ b/KernelLand/Kernel/drv/vterm_output.c @@ -5,9 +5,9 @@ * drv/vterm_input.c * - Virtual Terminal - Input code */ +#define DEBUG 0 #include "vterm.h" #include -#define DEBUG 0 // === CODE === /** @@ -52,8 +52,12 @@ void VT_int_ScrollFramebuffer( tVTerm *Term, int Count ) // Only update if this is the current terminal if( Term != gpVT_CurTerm ) return; + ENTER("pTerm iCount", + Term, Count); + if( Count > Term->ScrollHeight ) Count = Term->ScrollHeight; if( Count < -Term->ScrollHeight ) Count = -Term->ScrollHeight; + LOG("Count = %i", Count); // Switch to 2D Command Stream tmp = VIDEO_BUFFMT_2DSTREAM; @@ -81,6 +85,7 @@ void VT_int_ScrollFramebuffer( tVTerm *Term, int Count ) // Restore old mode (this function is only called during text mode) tmp = VIDEO_BUFFMT_TEXT; VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETBUFFORMAT, &tmp); + LEAVE('-'); } void VT_int_UpdateCursor( tVTerm *Term, int bShow ) @@ -88,6 +93,8 @@ void VT_int_UpdateCursor( tVTerm *Term, int bShow ) tVideo_IOCtl_Pos csr_pos; if( Term != gpVT_CurTerm ) return ; + + ENTER("pTerm bShow", Term, bShow); if( !bShow ) { @@ -96,8 +103,6 @@ void VT_int_UpdateCursor( tVTerm *Term, int bShow ) } else if( Term->Mode == TERM_MODE_TEXT ) { - int offset; - // if( !(Term->Flags & VT_FLAG_SHOWCSR) // && ( (Term->Flags & VT_FLAG_HIDECSR) || !Term->Node.ReadThreads) // ) @@ -108,13 +113,9 @@ void VT_int_UpdateCursor( tVTerm *Term, int bShow ) } else { - if(Term->Flags & VT_FLAG_ALTBUF) - offset = Term->AltWritePos; - else - offset = Term->WritePos - Term->ViewPos; - - csr_pos.x = offset % Term->TextWidth; - csr_pos.y = offset / Term->TextWidth; + const tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term); + csr_pos.x = wrpos->Col; + csr_pos.y = wrpos->Row - (Term->Flags & VT_FLAG_ALTBUF ? 0 : Term->ViewTopRow); if( 0 > csr_pos.y || csr_pos.y >= Term->TextHeight ) csr_pos.y = -1, csr_pos.x = -1; } @@ -125,6 +126,7 @@ void VT_int_UpdateCursor( tVTerm *Term, int bShow ) csr_pos.y = Term->VideoCursorY; } VFS_IOCtl(giVT_OutputDevHandle, VIDEO_IOCTL_SETCURSOR, &csr_pos); + LEAVE('-'); } /** @@ -133,17 +135,21 @@ void VT_int_UpdateCursor( tVTerm *Term, int bShow ) */ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) { - tVT_Char *buffer; - int view_pos, write_pos; + ENTER("pTerm iUpdateAll", Term, UpdateAll); // Only update if this is the current terminal - if( Term != gpVT_CurTerm ) return; - + if( Term != gpVT_CurTerm ) { + LOG("Term != gpVT_CurTerm (%p)", gpVT_CurTerm); + LEAVE('-'); + return; + } + switch( Term->Mode ) { - case TERM_MODE_TEXT: - view_pos = (Term->Flags & VT_FLAG_ALTBUF) ? 0 : Term->ViewPos; - write_pos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos; - buffer = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltBuf : Term->Text; + case TERM_MODE_TEXT: { + size_t view_pos = (Term->Flags & VT_FLAG_ALTBUF) ? 0 : Term->ViewTopRow*Term->TextWidth; + const tVT_Pos *wrpos = VT_int_GetWritePosPtr(Term); + const tVT_Char *buffer = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltBuf : Term->Text; + LOG("view_pos = %i, wrpos = %p (R%i,C%i), buffer=%p", view_pos, wrpos, wrpos->Row, wrpos->Col, buffer); // Re copy the entire screen? if(UpdateAll) { VFS_WriteAt( @@ -155,7 +161,8 @@ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) } // Only copy the current line else { - int ofs = write_pos - write_pos % Term->TextWidth; + size_t ofs = wrpos->Row * Term->TextWidth; + LOG("ofs = %i", ofs); VFS_WriteAt( giVT_OutputDevHandle, (ofs - view_pos)*sizeof(tVT_Char), @@ -163,11 +170,12 @@ void VT_int_UpdateScreen( tVTerm *Term, int UpdateAll ) &buffer[ofs] ); } - break; + break; } case TERM_MODE_FB: break; } VT_int_UpdateCursor(Term, 1); + LEAVE('-'); }