/* * 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 #include #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 */