X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fvterm.c;h=1d4b367246507933e0219e86670eb5f14e373565;hb=5985944028ce18d8abf3bcf5208545a506526f0f;hp=8a3bd26fe7bdb4152c05670e4789e2e3bb2f0344;hpb=75a4b9b73ca624eae571477741ac853e39871c90;p=tpg%2Facess2.git diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index 8a3bd26f..1d4b3672 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -5,9 +5,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -24,6 +24,7 @@ #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 #define DEFAULT_SCROLLBACK 2 // 2 Screens of text + current screen +//#define DEFAULT_SCROLLBACK 0 #define DEFAULT_COLOUR (VT_COL_BLACK|(0xAAA<<16)) #define VT_FLAG_HIDECSR 0x01 @@ -109,7 +110,7 @@ const Uint16 caVT100Colours[] = { }; // === GLOBALS === -MODULE_DEFINE(0, VERSION, VTerm, VT_Install, NULL, FALLBACK_OUTPUT, DEFAULT_INPUT, NULL); +MODULE_DEFINE(0, VERSION, VTerm, VT_Install, NULL, DEFAULT_INPUT, FALLBACK_OUTPUT, NULL); tDevFS_Driver gVT_DrvInfo = { NULL, "VTerm", { @@ -802,10 +803,10 @@ void VT_KBCallBack(Uint32 Codepoint) case KEY_PGDOWN: if( gpVT_CurTerm->Flags & VT_FLAG_ALTBUF ) return ; - if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback-1) ) + if( gpVT_CurTerm->ViewPos < gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback) ) gpVT_CurTerm->ViewPos += gpVT_CurTerm->Width; else - gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback-1); + gpVT_CurTerm->ViewPos = gpVT_CurTerm->Width*gpVT_CurTerm->Height*(giVT_Scrollback); return; } } @@ -904,11 +905,6 @@ void VT_KBCallBack(Uint32 Codepoint) } VFS_MarkAvaliable(&term->Node, 1); - - // Wake up the thread waiting on us - //if( term->ReadingThread >= 0 ) { - // Threads_WakeTID(term->ReadingThread); - //} } /** @@ -968,7 +964,7 @@ int VT_int_ParseEscape(tVTerm *Term, char *Buffer) } // Get Command - if( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) + if( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) { if( bQuestionMark ) { @@ -1355,47 +1351,55 @@ void VT_int_ScrollText(tVTerm *Term, int Count) tVT_Char *buf; int height, init_write_pos; int len, i; - + int scroll_top, scroll_height; + + // Get buffer pointer and attributes if( Term->Flags & VT_FLAG_ALTBUF ) { buf = Term->AltBuf; height = Term->TextHeight; init_write_pos = Term->AltWritePos; + scroll_top = Term->ScrollTop; + scroll_height = Term->ScrollHeight; } else { buf = Term->Text; - height = Term->TextHeight*giVT_Scrollback; + height = Term->TextHeight*(giVT_Scrollback+1); init_write_pos = Term->WritePos; + scroll_top = 0; + scroll_height = height; } - + + // Scroll text downwards if( Count > 0 ) { int base; - if(Count > Term->ScrollHeight) Count = Term->ScrollHeight; - base = Term->TextWidth*(Term->ScrollTop + Term->ScrollHeight - Count); - len = Term->TextWidth*(Term->ScrollHeight - Count); + + // Set up + if(Count > scroll_height) Count = scroll_height; + base = Term->TextWidth*(scroll_top + scroll_height - Count); + len = Term->TextWidth*(scroll_height - Count); // Scroll terminal cache - memcpy( - &buf[Term->TextWidth*Term->ScrollTop], - &buf[Term->TextWidth*(Term->ScrollTop+Count)], + memmove( + &buf[Term->TextWidth*scroll_top], + &buf[Term->TextWidth*(scroll_top+Count)], len*sizeof(tVT_Char) ); // Clear last rows for( i = 0; i < Term->TextWidth*Count; i ++ ) { - Term->AltBuf[ base + i ].Ch = 0; - Term->AltBuf[ base + i ].Colour = Term->CurColour; + buf[ base + i ].Ch = 0; + buf[ base + i ].Colour = Term->CurColour; } // Update Screen VT_int_ScrollFramebuffer( Term, Count ); if( Term->Flags & VT_FLAG_ALTBUF ) - Term->AltWritePos = Term->TextWidth*(Term->ScrollTop + Term->ScrollHeight - Count); + Term->AltWritePos = base; else - Term->WritePos = Term->ViewPos + Term->TextWidth*(Term->ScrollTop + Term->ScrollHeight - Count); -// Log_Debug("VTerm", "Term->WritePos = %i/%i = %i", Term->WritePos, Term->TextWidth, Term->WritePos/Term->TextWidth); + Term->WritePos = Term->ViewPos + Term->TextWidth*(Term->TextHeight - Count); for( i = 0; i < Count; i ++ ) { VT_int_UpdateScreen( Term, 0 ); @@ -1408,28 +1412,28 @@ void VT_int_ScrollText(tVTerm *Term, int Count) else { Count = -Count; - if(Count > Term->ScrollHeight) Count = Term->ScrollHeight; + if(Count > scroll_height) Count = scroll_height; - len = Term->TextWidth*(Term->ScrollHeight - Count); + len = Term->TextWidth*(scroll_height - Count); // Scroll terminal cache - memcpy( - &buf[Term->TextWidth*(Term->ScrollTop+Count)], - &buf[Term->TextWidth*Term->ScrollTop], + memmove( + &buf[Term->TextWidth*(scroll_top+Count)], + &buf[Term->TextWidth*scroll_top], len*sizeof(tVT_Char) ); // Clear preceding rows for( i = 0; i < Term->TextWidth*Count; i ++ ) { - Term->AltBuf[ i ].Ch = 0; - Term->AltBuf[ i ].Colour = Term->CurColour; + buf[ i ].Ch = 0; + buf[ i ].Colour = Term->CurColour; } VT_int_ScrollFramebuffer( Term, -Count ); if( Term->Flags & VT_FLAG_ALTBUF ) - Term->AltWritePos = Term->TextWidth*Term->ScrollTop; + Term->AltWritePos = Term->TextWidth*scroll_top; else - Term->WritePos = Term->ViewPos + Term->TextWidth*Term->ScrollTop; + Term->WritePos = Term->ViewPos; for( i = 0; i < Count; i ++ ) { VT_int_UpdateScreen( Term, 0 );