Windows2000/private/ntos/w32/ntcon/client/tscroll.c
2020-09-30 17:12:32 +02:00

473 lines
12 KiB
C

/*
* Copyright (c) 1985 - 1999, Microsoft Corporation
*/
#include "precomp.h"
#pragma hdrstop
#pragma hdrstop
#define FOREGROUND_WHITE (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
typedef
BOOL
(*PTEST_ROUTINE)(
IN HANDLE Handle
);
BOOL
Scroll1(
IN HANDLE Handle
);
BOOL
Scroll2(
IN HANDLE Handle
);
BOOL
Scroll3(
IN HANDLE Handle
);
BOOL
Scroll4(
IN HANDLE Handle
);
BOOL
Scroll5(
IN HANDLE Handle
);
#define NUM_TESTS 5
PTEST_ROUTINE Tests[NUM_TESTS] = {Scroll1,Scroll2,Scroll3,Scroll4,Scroll5};
BOOL
Scroll5(
IN HANDLE Handle
)
{
SMALL_RECT ScrollRectangle;
CHAR_INFO Fill;
COORD DestinationOrigin;
CONSOLE_SCREEN_BUFFER_INFO ScreenInfo;
if (!GetConsoleScreenBufferInfo(Handle,&ScreenInfo)) {
DbgPrint("ERROR: GetConsoleScreenBufferInfo failed\n");
}
ScrollRectangle = ScreenInfo.srWindow;
Fill.Attributes = BACKGROUND_GREEN;
Fill.Char.UnicodeChar = 'T';
DestinationOrigin.X = 0;
DestinationOrigin.Y = -(ScreenInfo.srWindow.Bottom - ScreenInfo.srWindow.Top + 1);
if (!ScrollConsoleScreenBuffer(Handle,
&ScrollRectangle,
NULL,
DestinationOrigin,
&Fill)) {
DbgPrint("ScrollConsoleScreenBuffer failed\n");
return FALSE;
}
DbgPrint("scrolled entire screen\n");
DbgBreakPoint();
return TRUE;
}
BOOL
Scroll4(
IN HANDLE Handle
)
{
CHAR_INFO CharBuffer[20][25];
SMALL_RECT WriteRegion;
COORD BufferSize;
COORD BufferCoord;
CHAR TextAttr;
CHAR BackgroundAttr;
int i,j;
CHAR Char;
SMALL_RECT ScrollRectangle,ClipRectangle;
CHAR_INFO Fill;
COORD DestinationOrigin;
BackgroundAttr = BACKGROUND_BLUE;
TextAttr = FOREGROUND_WHITE;
for (i=0;i<20;i++) {
for (Char='a',j=0;j<25;j++) {
CharBuffer[i][j].Attributes = BackgroundAttr | TextAttr;
CharBuffer[i][j].Char.AsciiChar = Char;
Char++;
if (Char > 'z') Char = 'a';
}
}
// write square to screen
BufferSize.X = 25;
BufferSize.Y = 20;
BufferCoord.X = 0;
BufferCoord.Y = 0;
WriteRegion.Left = 5;
WriteRegion.Right = 15;
WriteRegion.Top = 5;
WriteRegion.Bottom = 15;
if (!WriteConsoleOutput(Handle,
(PCHAR_INFO)CharBuffer,
BufferSize,
BufferCoord,
&WriteRegion
)) {
DbgPrint("WriteConsoleOutput failed\n");
return FALSE;
}
if (WriteRegion.Left != 5 || WriteRegion.Right != 15 ||
WriteRegion.Top != 5 || WriteRegion.Bottom != 15) {
DbgPrint("test 1: regions don't match\n");
DbgPrint("WriteRegion is %ld\n",&WriteRegion);
}
DbgPrint("wrote rectangle to 5,5\n");
DbgBreakPoint();
ScrollRectangle.Left = 5;
ScrollRectangle.Right = 15;
ScrollRectangle.Top = 5;
ScrollRectangle.Bottom = 15;
ClipRectangle.Left = 9;
ClipRectangle.Right = 25;
ClipRectangle.Top = 9;
ClipRectangle.Bottom = 25;
Fill.Attributes = BACKGROUND_GREEN;
Fill.Char.UnicodeChar = 'T';
DestinationOrigin.X = 20;
DestinationOrigin.Y = 20;
if (!ScrollConsoleScreenBuffer(Handle,
&ScrollRectangle,
&ClipRectangle,
DestinationOrigin,
&Fill)) {
DbgPrint("ScrollConsoleScreenBuffer failed\n");
return FALSE;
}
DbgPrint("scrolled region (5,15)(5,15) to (20,20) with clip (9,9)(25,25)\n");
DbgBreakPoint();
return TRUE;
}
BOOL
Scroll3(
IN HANDLE Handle
)
{
CHAR_INFO CharBuffer[20][25];
SMALL_RECT WriteRegion;
COORD BufferSize;
COORD BufferCoord;
CHAR TextAttr;
CHAR BackgroundAttr;
int i,j;
CHAR Char;
SMALL_RECT ScrollRectangle,ClipRectangle;
CHAR_INFO Fill;
COORD DestinationOrigin;
BackgroundAttr = BACKGROUND_BLUE;
TextAttr = FOREGROUND_WHITE;
for (i=0;i<20;i++) {
for (Char='a',j=0;j<25;j++) {
CharBuffer[i][j].Attributes = BackgroundAttr | TextAttr;
CharBuffer[i][j].Char.AsciiChar = Char;
Char++;
if (Char > 'z') Char = 'a';
}
}
// write square to screen
BufferSize.X = 25;
BufferSize.Y = 20;
BufferCoord.X = 0;
BufferCoord.Y = 0;
WriteRegion.Left = 5;
WriteRegion.Right = 15;
WriteRegion.Top = 5;
WriteRegion.Bottom = 15;
if (!WriteConsoleOutput(Handle,
(PCHAR_INFO)CharBuffer,
BufferSize,
BufferCoord,
&WriteRegion
)) {
DbgPrint("WriteConsoleOutput failed\n");
return FALSE;
}
if (WriteRegion.Left != 5 || WriteRegion.Right != 15 ||
WriteRegion.Top != 5 || WriteRegion.Bottom != 15) {
DbgPrint("test 1: regions don't match\n");
DbgPrint("WriteRegion is %ld\n",&WriteRegion);
}
DbgPrint("wrote rectangle to 5,5\n");
DbgBreakPoint();
ScrollRectangle.Left = 5;
ScrollRectangle.Right = 15;
ScrollRectangle.Top = 5;
ScrollRectangle.Bottom = 15;
ClipRectangle.Left = 5;
ClipRectangle.Right = 15;
ClipRectangle.Top = 5;
ClipRectangle.Bottom = 15;
Fill.Attributes = BACKGROUND_GREEN;
Fill.Char.UnicodeChar = 'T';
DestinationOrigin.X = 5;
DestinationOrigin.Y = 4;
if (!ScrollConsoleScreenBuffer(Handle,
&ScrollRectangle,
&ClipRectangle,
DestinationOrigin,
&Fill)) {
DbgPrint("ScrollConsoleScreenBuffer failed\n");
return FALSE;
}
DbgPrint("scrolled region (5,15)(5,15) to (5,4)\n");
DbgBreakPoint();
return TRUE;
}
BOOL
Scroll2(
IN HANDLE Handle
)
{
CHAR_INFO CharBuffer[20][25];
SMALL_RECT WriteRegion;
COORD BufferSize;
COORD BufferCoord;
CHAR TextAttr;
CHAR BackgroundAttr;
int i,j;
CHAR Char;
SMALL_RECT ScrollRectangle,ClipRectangle;
CHAR_INFO Fill;
COORD DestinationOrigin;
BackgroundAttr = BACKGROUND_BLUE;
TextAttr = FOREGROUND_WHITE;
for (i=0;i<20;i++) {
for (Char='a',j=0;j<25;j++) {
CharBuffer[i][j].Attributes = BackgroundAttr | TextAttr;
CharBuffer[i][j].Char.AsciiChar = Char;
Char++;
if (Char > 'z') Char = 'a';
}
}
// write square to screen
BufferSize.X = 25;
BufferSize.Y = 20;
BufferCoord.X = 0;
BufferCoord.Y = 0;
WriteRegion.Left = 5;
WriteRegion.Right = 15;
WriteRegion.Top = 5;
WriteRegion.Bottom = 15;
if (!WriteConsoleOutput(Handle,
(PCHAR_INFO)CharBuffer,
BufferSize,
BufferCoord,
&WriteRegion
)) {
DbgPrint("WriteConsoleOutput failed\n");
return FALSE;
}
if (WriteRegion.Left != 5 || WriteRegion.Right != 15 ||
WriteRegion.Top != 5 || WriteRegion.Bottom != 15) {
DbgPrint("test 1: regions don't match\n");
DbgPrint("WriteRegion is %ld\n",&WriteRegion);
}
DbgPrint("wrote rectangle to 5,5\n");
DbgBreakPoint();
ScrollRectangle.Left = 5;
ScrollRectangle.Right = 15;
ScrollRectangle.Top = 5;
ScrollRectangle.Bottom = 15;
ClipRectangle.Left = 10;
ClipRectangle.Right = 25;
ClipRectangle.Top = 10;
ClipRectangle.Bottom = 25;
Fill.Attributes = BACKGROUND_GREEN;
Fill.Char.UnicodeChar = 'T';
DestinationOrigin.X = 10;
DestinationOrigin.Y = 10;
if (!ScrollConsoleScreenBuffer(Handle,
&ScrollRectangle,
NULL,
DestinationOrigin,
&Fill)) {
DbgPrint("ScrollConsoleScreenBuffer failed\n");
return FALSE;
}
DbgPrint("scrolled region (5,15)(5,15) to (10,10)\n");
DbgBreakPoint();
return TRUE;
}
BOOL
Scroll1(
IN HANDLE Handle
)
{
CHAR_INFO CharBuffer[20][25];
SMALL_RECT WriteRegion;
COORD BufferSize;
COORD BufferCoord;
CHAR TextAttr;
CHAR BackgroundAttr;
int i,j;
CHAR Char;
SMALL_RECT ScrollRectangle,ClipRectangle;
CHAR_INFO Fill;
COORD DestinationOrigin;
BackgroundAttr = BACKGROUND_BLUE;
TextAttr = FOREGROUND_WHITE;
for (i=0;i<20;i++) {
for (Char='a',j=0;j<25;j++) {
CharBuffer[i][j].Attributes = BackgroundAttr | TextAttr;
CharBuffer[i][j].Char.AsciiChar = Char;
Char++;
if (Char > 'z') Char = 'a';
}
}
// write square to screen
BufferSize.X = 25;
BufferSize.Y = 20;
BufferCoord.X = 0;
BufferCoord.Y = 0;
WriteRegion.Left = 0;
WriteRegion.Right = 10;
WriteRegion.Top = 0;
WriteRegion.Bottom = 10;
if (!WriteConsoleOutput(Handle,
(PCHAR_INFO)CharBuffer,
BufferSize,
BufferCoord,
&WriteRegion
)) {
DbgPrint("WriteConsoleOutput failed\n");
return FALSE;
}
if (WriteRegion.Left != 0 || WriteRegion.Right != 10 ||
WriteRegion.Top != 0 || WriteRegion.Bottom != 10) {
DbgPrint("test 1: regions don't match\n");
DbgPrint("WriteRegion is %ld\n",&WriteRegion);
}
DbgPrint("wrote rectangle to 0,0\n");
DbgBreakPoint();
ScrollRectangle.Left = 0;
ScrollRectangle.Right = 10;
ScrollRectangle.Top = 0;
ScrollRectangle.Bottom = 10;
ClipRectangle.Left = 25;
ClipRectangle.Right = 30;
ClipRectangle.Top = 25;
ClipRectangle.Bottom = 30;
Fill.Attributes = BACKGROUND_GREEN;
Fill.Char.UnicodeChar = 'T';
DestinationOrigin.X = 20;
DestinationOrigin.Y = 20;
if (!ScrollConsoleScreenBuffer(Handle,
&ScrollRectangle,
&ClipRectangle,
DestinationOrigin,
&Fill)) {
DbgPrint("ScrollConsoleScreenBuffer failed\n");
return FALSE;
}
DbgPrint("scrolled region (0,10)(0,10) to (20,20)\n");
DbgBreakPoint();
return TRUE;
}
DWORD
main(
int argc,
char *argv[]
)
{
SECURITY_ATTRIBUTES SecurityAttributes;
HANDLE Handle;
int i;
DbgPrint( "TSCROLL: Entering Scrolling Test Program\n" );
for (i=0;i<NUM_TESTS;i++) {
if (argc==2) {
i = atoi(argv[1]);
}
// open a new console
SecurityAttributes.bInheritHandle = FALSE;
SecurityAttributes.lpSecurityDescriptor = NULL;
SecurityAttributes.nLength = sizeof (SECURITY_ATTRIBUTES);
Handle = CreateFile("CONOUT$",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
&SecurityAttributes,
CREATE_ALWAYS,
0,
(HANDLE)-1
);
if (Handle == (HANDLE)-1) {
DbgPrint("CreateFile failed\n");
return FALSE;
}
// make it current
if (!SetConsoleActiveScreenBuffer(Handle)) {
DbgPrint("SetConsoleActiveScreenBuffer failed\n");
return FALSE;
}
if (!Tests[i](Handle)) {
DbgPrint("Scroll%d failed\n",i+1);
}
else {
DbgPrint("Scroll%d succeeded\n",i+1);
}
if (!SetConsoleActiveScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE))) {
DbgPrint("SetConsoleActiveScreenBuffer failed\n");
return FALSE;
}
if (!CloseHandle(Handle)) {
DbgPrint("CloseHandle failed\n");
return FALSE;
}
if (argc==2) {
break;
}
}
DbgPrint( "TCON: Exiting Test Program\n" );
return TRUE;
}