From d87b4502664304f1fea19a8ede7faf912805e74f Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Tue, 31 Jul 2001 20:28:43 +0000 Subject: [PATCH 1/1] Removed the bugged conio.c:ComputeOffsetBuffer() (Phillip noted it). Restored the inline offset computation in conio.c:CsrpWriteConsole(). Added \t and \r processing in conio.c:CsrpWriteConsole() which leads to formatted SCREEN_BUFFERS to be restored when you switch console. Please test it. svn path=/trunk/; revision=2127 --- reactos/subsys/csrss/api/conio.c | 44 ++++++++++++++------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/reactos/subsys/csrss/api/conio.c b/reactos/subsys/csrss/api/conio.c index d2519005e4a..be54212f175 100644 --- a/reactos/subsys/csrss/api/conio.c +++ b/reactos/subsys/csrss/api/conio.c @@ -1,4 +1,4 @@ -/* $Id: conio.c,v 1.20 2001/07/30 11:56:54 ea Exp $ +/* $Id: conio.c,v 1.21 2001/07/31 20:28:43 ea Exp $ * * reactos/subsys/csrss/api/conio.c * @@ -224,28 +224,15 @@ NTSTATUS CsrReadConsole(PCSRSS_PROCESS_DATA ProcessData, (b)->Buffer[(o)++]=(c);\ (b)->Buffer[(o)++]=(a); -static DWORD FASTCALL -ComputeOffsetBuffer ( - PCSRSS_SCREEN_BUFFER Buff, - DWORD LogicalX, - DWORD LogicalY - ) -{ - /* 2 == sizeof (cell) */ - return (2 * ((LogicalY * Buff->MaxX) + LogicalX)); -} - static VOID FASTCALL ClearLineBuffer ( PCSRSS_SCREEN_BUFFER Buff, - DWORD StartX, - DWORD StopX + DWORD StartX ) { - DWORD LogicalX = StartX; - DWORD Offset = ComputeOffsetBuffer (Buff, LogicalX, Buff->CurrentY); + DWORD Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + StartX); - for ( ; LogicalX < StopX; LogicalX ++ ) + for ( ; StartX < Buff->MaxX; StartX ++ ) { /* Fill the cell: Offset is incremented by the macro */ SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib) @@ -274,10 +261,10 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length { Buff->CurrentY = 0; } - ClearLineBuffer (Buff, 0, Buff->MaxX); + ClearLineBuffer (Buff, 0); break; /* --- BS --- */ - case '\b': { + case '\b': if( Buff->CurrentX == 0 ) { /* slide viewable screen up */ @@ -297,13 +284,20 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length } else Buff->CurrentX--; - Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY); + Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX); SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib); break; - } + /* --- CR --- */ + case '\r': + Buff->CurrentX = 0; + break; + /* --- TAB --- */ + case '\t': + CsrpWriteConsole(Buff, " ", 8, Attrib); + break; /* --- */ default: - Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY); + Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX); Buff->Buffer[Offset ++] = Buffer[ i ]; if( Attrib ) Buff->Buffer[Offset] = Buff->DefaultAttrib; @@ -317,11 +311,11 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length /* if end of buffer, wrap back to beginning */ Buff->CurrentY = 0; /* clear new line */ - ClearLineBuffer (Buff, 0, Buff->MaxX); + ClearLineBuffer (Buff, 0); } else { /* clear new line */ - ClearLineBuffer (Buff, 0, Buff->MaxX); + ClearLineBuffer (Buff, 0); } /* slide the viewable screen */ if( (Buff->CurrentY - Buff->ShowY) == PhysicalConsoleSize.Y ) @@ -382,7 +376,7 @@ NTSTATUS CsrInitConsoleScreenBuffer( PCSRSS_SCREEN_BUFFER Console ) /* initialize buffer to be empty with default attributes */ for( ; Console->CurrentY < Console->MaxY; Console->CurrentY++ ) { - ClearLineBuffer (Console, 0, Console->MaxX); + ClearLineBuffer (Console, 0); } Console->CursorInfo.bVisible = TRUE; Console->CursorInfo.dwSize = 5; -- 2.17.1