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
This commit is contained in:
Emanuele Aliberti 2001-07-31 20:28:43 +00:00
parent a44f8b0d7a
commit d87b450266

View file

@ -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 * reactos/subsys/csrss/api/conio.c
* *
@ -224,28 +224,15 @@ NTSTATUS CsrReadConsole(PCSRSS_PROCESS_DATA ProcessData,
(b)->Buffer[(o)++]=(c);\ (b)->Buffer[(o)++]=(c);\
(b)->Buffer[(o)++]=(a); (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 static VOID FASTCALL
ClearLineBuffer ( ClearLineBuffer (
PCSRSS_SCREEN_BUFFER Buff, PCSRSS_SCREEN_BUFFER Buff,
DWORD StartX, DWORD StartX
DWORD StopX
) )
{ {
DWORD LogicalX = StartX; DWORD Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + StartX);
DWORD Offset = ComputeOffsetBuffer (Buff, LogicalX, Buff->CurrentY);
for ( ; LogicalX < StopX; LogicalX ++ ) for ( ; StartX < Buff->MaxX; StartX ++ )
{ {
/* Fill the cell: Offset is incremented by the macro */ /* Fill the cell: Offset is incremented by the macro */
SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib) SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib)
@ -274,10 +261,10 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
{ {
Buff->CurrentY = 0; Buff->CurrentY = 0;
} }
ClearLineBuffer (Buff, 0, Buff->MaxX); ClearLineBuffer (Buff, 0);
break; break;
/* --- BS --- */ /* --- BS --- */
case '\b': { case '\b':
if( Buff->CurrentX == 0 ) if( Buff->CurrentX == 0 )
{ {
/* slide viewable screen up */ /* slide viewable screen up */
@ -297,13 +284,20 @@ NTSTATUS CsrpWriteConsole( PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length
} }
else else
Buff->CurrentX--; Buff->CurrentX--;
Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY); Offset = 2 * ((Buff->CurrentY * Buff->MaxX) + Buff->CurrentX);
SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib); SET_CELL_BUFFER(Buff,Offset,' ',Buff->DefaultAttrib);
break; break;
} /* --- CR --- */
case '\r':
Buff->CurrentX = 0;
break;
/* --- TAB --- */
case '\t':
CsrpWriteConsole(Buff, " ", 8, Attrib);
break;
/* --- */ /* --- */
default: default:
Offset = ComputeOffsetBuffer (Buff, Buff->CurrentX, Buff->CurrentY); Offset = 2 * (((Buff->CurrentY * Buff->MaxX)) + Buff->CurrentX);
Buff->Buffer[Offset ++] = Buffer[ i ]; Buff->Buffer[Offset ++] = Buffer[ i ];
if( Attrib ) if( Attrib )
Buff->Buffer[Offset] = Buff->DefaultAttrib; 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 */ /* if end of buffer, wrap back to beginning */
Buff->CurrentY = 0; Buff->CurrentY = 0;
/* clear new line */ /* clear new line */
ClearLineBuffer (Buff, 0, Buff->MaxX); ClearLineBuffer (Buff, 0);
} }
else { else {
/* clear new line */ /* clear new line */
ClearLineBuffer (Buff, 0, Buff->MaxX); ClearLineBuffer (Buff, 0);
} }
/* slide the viewable screen */ /* slide the viewable screen */
if( (Buff->CurrentY - Buff->ShowY) == PhysicalConsoleSize.Y ) 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 */ /* initialize buffer to be empty with default attributes */
for( ; Console->CurrentY < Console->MaxY; Console->CurrentY++ ) for( ; Console->CurrentY < Console->MaxY; Console->CurrentY++ )
{ {
ClearLineBuffer (Console, 0, Console->MaxX); ClearLineBuffer (Console, 0);
} }
Console->CursorInfo.bVisible = TRUE; Console->CursorInfo.bVisible = TRUE;
Console->CursorInfo.dwSize = 5; Console->CursorInfo.dwSize = 5;