mirror of
https://github.com/reactos/reactos.git
synced 2024-11-01 04:11:30 +00:00
231 lines
5.9 KiB
C
231 lines
5.9 KiB
C
/*
|
|
* 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
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include "resource.h"
|
|
|
|
// #define DISPLAY_COORD
|
|
|
|
LPCWSTR app_name = L"notevil";
|
|
|
|
HANDLE myself;
|
|
HANDLE ScreenBuffer;
|
|
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
|
|
HANDLE WaitableTimer;
|
|
|
|
VOID
|
|
WriteStringAt(LPWSTR lpString,
|
|
COORD xy,
|
|
WORD wColor)
|
|
{
|
|
DWORD cWritten = 0;
|
|
WORD wLen;
|
|
|
|
if (!lpString || *lpString == 0) return;
|
|
|
|
wLen = wcslen(lpString);
|
|
|
|
/* Don't bother writing text when erasing */
|
|
if (wColor)
|
|
{
|
|
WriteConsoleOutputCharacterW(ScreenBuffer,
|
|
lpString,
|
|
wLen,
|
|
xy,
|
|
&cWritten);
|
|
}
|
|
|
|
FillConsoleOutputAttribute(ScreenBuffer,
|
|
wColor,
|
|
wLen,
|
|
xy,
|
|
&cWritten);
|
|
}
|
|
|
|
|
|
#ifdef DISPLAY_COORD
|
|
VOID
|
|
WriteCoord(COORD c)
|
|
{
|
|
COORD xy = {0,0};
|
|
WCHAR buf[40];
|
|
|
|
wsprintf(buf, L"x=%02d y=%02d", c.X, c.Y);
|
|
|
|
WriteStringAt(buf, xy,
|
|
BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
|
|
}
|
|
#endif /* def DISPLAY_COORD */
|
|
|
|
|
|
VOID
|
|
GetNextString(LPWSTR Buffer,
|
|
INT BufferSize,
|
|
PDWORD Index)
|
|
{
|
|
if (RES_LAST_INDEX == *Index)
|
|
*Index = RES_FIRST_INDEX;
|
|
else
|
|
++*Index;
|
|
|
|
LoadStringW(myself, *Index, Buffer, BufferSize);
|
|
}
|
|
|
|
|
|
VOID
|
|
DisplayTitle(VOID)
|
|
{
|
|
LPWSTR szTitle = L"ReactOS Coders Console Parade";
|
|
COORD xy;
|
|
|
|
xy.X = (ScreenBufferInfo.dwSize.X - wcslen(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)
|
|
{
|
|
WCHAR NameString[RES_BUFFER_SIZE];
|
|
DWORD NameIndex = 0;
|
|
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 = 0;
|
|
|
|
GetNextString(NameString,
|
|
RES_BUFFER_SIZE,
|
|
&NameIndex);
|
|
NameLength = wcslen(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 wmain(int argc, WCHAR* 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 (ScreenBuffer == INVALID_HANDLE_VALUE)
|
|
{
|
|
wprintf(L"%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)
|
|
{
|
|
wprintf(L"CreateWaitabletimer() failed\n");
|
|
return 1;
|
|
}
|
|
lint.QuadPart = -2000000;
|
|
if (!SetWaitableTimer(WaitableTimer, &lint, 200, NULL, NULL, FALSE))
|
|
{
|
|
wprintf(L"SetWaitableTimer() failed: 0x%lx\n", GetLastError());
|
|
return 2;
|
|
}
|
|
SetConsoleActiveScreenBuffer(ScreenBuffer);
|
|
MainLoop();
|
|
CloseHandle(ScreenBuffer);
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
/* EOF */
|