mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
268 lines
5 KiB
C
268 lines
5 KiB
C
/* $Id$
|
|
*
|
|
* notevil.c
|
|
*
|
|
* --------------------------------------------------------------------
|
|
*
|
|
* This software is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this software; see the file COPYING.LIB. If
|
|
* not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
|
* Cambridge, MA 02139, USA.
|
|
*
|
|
* --------------------------------------------------------------------
|
|
* ReactOS Coders Console Parade
|
|
*
|
|
* 19990411 EA
|
|
* 19990515 EA
|
|
*/
|
|
//#define UNICODE
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include "resource.h"
|
|
|
|
LPCTSTR app_name = _TEXT("notevil");
|
|
|
|
HANDLE myself;
|
|
HANDLE ScreenBuffer;
|
|
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
|
|
HANDLE WaitableTimer;
|
|
|
|
void
|
|
WriteStringAt(
|
|
LPTSTR lpString,
|
|
COORD xy,
|
|
WORD wColor
|
|
)
|
|
{
|
|
DWORD cWritten = 0;
|
|
WORD wLen = lstrlen(lpString);
|
|
|
|
if (0 == wLen)
|
|
return;
|
|
// don't bother writing text when erasing
|
|
if( wColor )
|
|
WriteConsoleOutputCharacter( ScreenBuffer,
|
|
lpString,
|
|
wLen,
|
|
xy,
|
|
& cWritten
|
|
);
|
|
FillConsoleOutputAttribute(
|
|
ScreenBuffer,
|
|
wColor,
|
|
wLen,
|
|
xy,
|
|
& cWritten
|
|
);
|
|
}
|
|
|
|
|
|
#ifdef DISPLAY_COORD
|
|
void
|
|
WriteCoord(COORD c)
|
|
{
|
|
COORD xy = {0,0};
|
|
TCHAR buf [40];
|
|
|
|
wsprintf(
|
|
buf,
|
|
_TEXT("x=%02d y=%02d"),
|
|
c.X,
|
|
c.Y
|
|
);
|
|
WriteStringAt(
|
|
buf,
|
|
xy,
|
|
(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE)
|
|
);
|
|
}
|
|
#endif /* def DISPLAY_COORD */
|
|
|
|
|
|
INT
|
|
GetNextString(
|
|
LPTSTR Buffer,
|
|
INT BufferSize,
|
|
DWORD *Index
|
|
)
|
|
{
|
|
if (RES_LAST_INDEX == *Index)
|
|
{
|
|
*Index = RES_FIRST_INDEX;
|
|
}
|
|
else
|
|
{
|
|
++*Index;
|
|
}
|
|
LoadString(
|
|
myself,
|
|
*Index,
|
|
Buffer,
|
|
BufferSize
|
|
);
|
|
return 0;
|
|
}
|
|
|
|
|
|
VOID
|
|
DisplayTitle(VOID)
|
|
{
|
|
LPTSTR szTitle = _TEXT("ReactOS Coders Console Parade");
|
|
COORD xy;
|
|
|
|
xy.X = (ScreenBufferInfo.dwSize.X - lstrlen(szTitle)) / 2;
|
|
xy.Y = ScreenBufferInfo.dwSize.Y / 2;
|
|
|
|
WriteStringAt(
|
|
szTitle,
|
|
xy,
|
|
(FOREGROUND_GREEN | FOREGROUND_INTENSITY)
|
|
);
|
|
}
|
|
|
|
|
|
#define RES_DELAY_CHANGE 12
|
|
#define RES_BUFFER_SIZE 1024
|
|
void
|
|
MainLoop(void)
|
|
{
|
|
TCHAR NameString [RES_BUFFER_SIZE];
|
|
DWORD NameIndex = 1;
|
|
INT NameLength = 0;
|
|
COORD xy;
|
|
INT n = RES_DELAY_CHANGE;
|
|
INT dir_y = 1;
|
|
INT dir_x = 1;
|
|
WORD wColor = 1;
|
|
|
|
xy.X = ScreenBufferInfo.dwSize.X / 2;
|
|
xy.Y = ScreenBufferInfo.dwSize.Y / 2;
|
|
|
|
for ( ; 1; ++n )
|
|
{
|
|
if (n == RES_DELAY_CHANGE)
|
|
{
|
|
n = GetNextString(
|
|
NameString,
|
|
RES_BUFFER_SIZE,
|
|
& NameIndex
|
|
);
|
|
NameLength = lstrlen(NameString);
|
|
wColor++;
|
|
if ((wColor & 0x000F) == 0)
|
|
wColor = 1;
|
|
}
|
|
if (xy.X == 0)
|
|
{
|
|
if (dir_x == -1)
|
|
dir_x = 1;
|
|
}
|
|
else if (xy.X >= ScreenBufferInfo.dwSize.X - NameLength - 1)
|
|
{
|
|
if (dir_x == 1)
|
|
dir_x = -1;
|
|
}
|
|
xy.X += dir_x;
|
|
|
|
if (xy.Y == 0)
|
|
{
|
|
if (dir_y == -1)
|
|
dir_y = 1;
|
|
}
|
|
else if (xy.Y >= ScreenBufferInfo.dwSize.Y - 1)
|
|
{
|
|
if (dir_y == 1)
|
|
dir_y = -1;
|
|
}
|
|
xy.Y += dir_y;
|
|
#ifdef DISPLAY_COORD
|
|
WriteCoord(xy);
|
|
#endif /* def DISPLAY_COORD */
|
|
DisplayTitle();
|
|
WriteStringAt(
|
|
NameString,
|
|
xy,
|
|
wColor
|
|
);
|
|
WaitForSingleObject( WaitableTimer, INFINITE );
|
|
WriteStringAt(
|
|
NameString,
|
|
xy,
|
|
0
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
main(
|
|
int argc,
|
|
char *argv []
|
|
)
|
|
{
|
|
LARGE_INTEGER lint;
|
|
DWORD Written;
|
|
COORD Coord = { 0, 0 };
|
|
|
|
myself = GetModuleHandle(NULL);
|
|
|
|
GetConsoleScreenBufferInfo (GetStdHandle(STD_OUTPUT_HANDLE),
|
|
&ScreenBufferInfo);
|
|
ScreenBufferInfo.dwSize.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
|
|
ScreenBufferInfo.dwSize.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;
|
|
ScreenBuffer = CreateConsoleScreenBuffer(
|
|
GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
CONSOLE_TEXTMODE_BUFFER,
|
|
NULL
|
|
);
|
|
if (INVALID_HANDLE_VALUE == ScreenBuffer)
|
|
{
|
|
_ftprintf(
|
|
stderr,
|
|
_TEXT("%s: could not create a new screen buffer\n"),
|
|
app_name
|
|
);
|
|
return EXIT_FAILURE;
|
|
}
|
|
// Fill buffer with black background
|
|
FillConsoleOutputAttribute( ScreenBuffer,
|
|
0,
|
|
ScreenBufferInfo.dwSize.X * ScreenBufferInfo.dwSize.Y,
|
|
Coord,
|
|
&Written );
|
|
|
|
WaitableTimer = CreateWaitableTimer( NULL, FALSE, NULL );
|
|
if( WaitableTimer == INVALID_HANDLE_VALUE )
|
|
{
|
|
printf( "CreateWaitabletimer() failed\n" );
|
|
return 1;
|
|
}
|
|
lint.QuadPart = -2000000;
|
|
if( SetWaitableTimer( WaitableTimer, &lint, 200, NULL, NULL, FALSE ) == FALSE )
|
|
{
|
|
printf( "SetWaitableTimer() failed: 0x%lx\n", GetLastError() );
|
|
return 2;
|
|
}
|
|
SetConsoleActiveScreenBuffer(ScreenBuffer);
|
|
MainLoop();
|
|
CloseHandle(ScreenBuffer);
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
|
|
/* EOF */
|