From 270493f197c9f6e944eb17be9f0960ddde3c96a0 Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Mon, 6 Aug 2007 14:56:17 +0000 Subject: [PATCH] Starfield Screensaver by Marc Piulachs (marc DOT piulachs AT codexchange DOT net) I committed the latest attachment (the C version) from bug #2510 See issue #2510 for more details. svn path=/trunk/; revision=28195 --- .../screensavers/screensavers.rbuild | 4 + .../screensavers/starfield/resource.h | 1 + .../screensavers/starfield/screensaver.c | 352 ++++++++++++++++++ .../screensavers/starfield/starfield.rbuild | 13 + .../screensavers/starfield/starfield.rc | 19 + reactos/boot/bootdata/packages/reactos.dff | 73 ++-- 6 files changed, 426 insertions(+), 36 deletions(-) create mode 100644 reactos/base/applications/screensavers/starfield/resource.h create mode 100644 reactos/base/applications/screensavers/starfield/screensaver.c create mode 100644 reactos/base/applications/screensavers/starfield/starfield.rbuild create mode 100644 reactos/base/applications/screensavers/starfield/starfield.rc diff --git a/reactos/base/applications/screensavers/screensavers.rbuild b/reactos/base/applications/screensavers/screensavers.rbuild index d522418ba82..405c6ac13af 100644 --- a/reactos/base/applications/screensavers/screensavers.rbuild +++ b/reactos/base/applications/screensavers/screensavers.rbuild @@ -18,4 +18,8 @@ + + + + \ No newline at end of file diff --git a/reactos/base/applications/screensavers/starfield/resource.h b/reactos/base/applications/screensavers/starfield/resource.h new file mode 100644 index 00000000000..dae01eed217 --- /dev/null +++ b/reactos/base/applications/screensavers/starfield/resource.h @@ -0,0 +1 @@ +#define IDS_DESCRIPTION 1 diff --git a/reactos/base/applications/screensavers/starfield/screensaver.c b/reactos/base/applications/screensavers/starfield/screensaver.c new file mode 100644 index 00000000000..73d7567dac3 --- /dev/null +++ b/reactos/base/applications/screensavers/starfield/screensaver.c @@ -0,0 +1,352 @@ +/* + * Copyright 2003 J Brown + * Copyright 2006 Eric Kohl + * Copyright 2007 Marc Piulachs (marc.piulachs@codexchange.net) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include "resource.h" + +#define RANDOM( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min)) + +#define MAX_LOADSTRING 100 +#define MAX_STARS 1000 + +#define APPNAME _T("Starfield") +#define APP_TIMER 1 +#define APP_TIMER_INTERVAL 20 + +#define MAX_STARS 1000 + +// Details of each individual star +typedef struct star +{ + int m_nXPos, m_nYPos, m_nZPos; + int m_nOldX, m_nOldY; +} STAR; + +HINSTANCE hInstance; +BOOL fullscreen = FALSE; + +STAR *stars; + +int m_nTotStars; +int m_nCenterX, m_nCenterY; + +void DrawStarField (HDC pDC) +{ + int nX, nY; + int i; + for (i = 0; i < m_nTotStars; i++) + { + // Clear last position of this star + SetPixel ( + pDC, + stars[i].m_nOldX, + stars[i].m_nOldY, + RGB (0, 0, 0)); + + nX = (int)((((long)stars[i].m_nXPos << 7) / (long)stars[i].m_nZPos) + m_nCenterX); + nY = (int)((((long)stars[i].m_nYPos << 7) / (long)stars[i].m_nZPos) + m_nCenterY); + + // Draw star + SetPixel ( + pDC, + nX, + nY, + RGB (255, 255, 255)); + + // Remember current position for clearing later + stars[i].m_nOldX = nX; + stars[i].m_nOldY = nY; + } +} + +BOOL SetUpStars (int nNumStars) +{ + int i; + if (nNumStars > MAX_STARS) + { + MessageBox (0, + _T("Too many stars! Aborting!"), + _T("Error"), + MB_OK | MB_ICONWARNING); + return FALSE; + } + + if (stars) + free (stars); + + m_nTotStars = nNumStars; + + stars = (STAR*)malloc(nNumStars * sizeof(STAR)); + + if (!stars) + { + MessageBox (0, + _T("Unable to allocate memory! Aborting!"), + _T("Error"), + MB_OK | MB_ICONWARNING); + return FALSE; + } + + for (i = 0; i < m_nTotStars; i++) + { + do + { + stars[i].m_nXPos = RANDOM (-320, 320); + stars[i].m_nYPos = RANDOM (-200, 200); + stars[i].m_nZPos = i+1; + stars[i].m_nOldX = -1; + stars[i].m_nOldY = -1; + } while ((stars[i].m_nXPos == 0) || (stars[i].m_nYPos == 0)); + } + + return TRUE; +} + +void MoveStarField (int nXofs, int nYofs, int nZofs) +{ + int i; + for (i = 0; i < m_nTotStars; i++) + { + stars[i].m_nXPos += nXofs; + stars[i].m_nYPos += nYofs; + stars[i].m_nZPos += nZofs; + + if (stars[i].m_nZPos > m_nTotStars) + stars[i].m_nZPos -= m_nTotStars; + if (stars[i].m_nZPos < 1) + stars[i].m_nZPos += m_nTotStars; + } +} + +void SetDimensions (int nWidth, int nHeight) +{ + m_nCenterX = nWidth / 2; + m_nCenterY = nHeight / 2; +} + +LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static POINT ptLast; + static POINT ptCursor; + static BOOL fFirstTime = TRUE; + static HDC pDC; + + switch (msg) + { + case WM_CREATE : + { + SetTimer ( + hwnd, + APP_TIMER, + APP_TIMER_INTERVAL, + NULL); + } + break; + case WM_PAINT : + { + PAINTSTRUCT PtStr; + HDC pDC = BeginPaint (hwnd, &PtStr); + DrawStarField (pDC); + EndPaint (hwnd, &PtStr); + return (0); + } + break; + case WM_TIMER : + { + if (wParam == APP_TIMER) + { + MoveStarField (0, 0, -3); + pDC = GetDC(hwnd); + DrawStarField (pDC); + ReleaseDC(hwnd, pDC); + } + } + break; + case WM_SIZE : + { + // Change the center point of the starfield + SetDimensions ( + LOWORD(lParam), + HIWORD(lParam)); + } + break; + case WM_DESTROY : + { + KillTimer (hwnd, APP_TIMER); + free(stars); + PostQuitMessage (0); + return 0; + } + break; + // break out of screen-saver if any keyboard activity + case WM_NOTIFY: + case WM_SYSKEYDOWN: + { + PostMessage(hwnd, WM_CLOSE, 0, 0); + break; + } + // break out of screen-saver if any mouse activity + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MOUSEMOVE: + { + // If we've got a parent then we must be a preview + if(GetParent(hwnd) != 0) + return 0; + + if(fFirstTime) + { + GetCursorPos(&ptLast); + fFirstTime = FALSE; + } + + GetCursorPos(&ptCursor); + + // if the mouse has moved more than 3 pixels then exit + if( (abs(ptCursor.x - ptLast.x) >= 3) || + (abs(ptCursor.y - ptLast.y) >= 3)) + { + PostMessage(hwnd, WM_CLOSE, 0, 0); + } + + ptLast = ptCursor; + return 0; + } + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + + +void InitSaver(HWND hwndParent) +{ + WNDCLASS wc; + ZeroMemory(&wc, sizeof(wc)); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = WndProc; + wc.lpszClassName = APPNAME; + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + RegisterClass(&wc); + + if (hwndParent != 0) + { + RECT rect; + GetClientRect(hwndParent, &rect); + CreateWindow(APPNAME, APPNAME, + WS_VISIBLE | WS_CHILD, + 0, 0, + rect.right, + rect.bottom, + hwndParent, 0, + hInstance, NULL); + fullscreen = FALSE; + } + else + { + HWND hwnd; + hwnd = CreateWindow(APPNAME, APPNAME, + WS_VISIBLE | WS_POPUP | WS_EX_TOPMOST, + 0, 0, + GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), + HWND_DESKTOP, 0, + hInstance, NULL); + ShowWindow(hwnd, SW_SHOWMAXIMIZED); + ShowCursor(FALSE); + fullscreen = TRUE; + } + + SetUpStars(250); +} + +void ParseCommandLine(PSTR szCmdLine, int *chOption, HWND *hwndParent) +{ + int ch = *szCmdLine++; + + if(ch == '-' || ch == '/') + ch = *szCmdLine++; + + if(ch >= 'A' && ch <= 'Z') + ch += 'a' - 'A'; + + *chOption = ch; + ch = *szCmdLine++; + + if(ch == ':') + ch = *szCmdLine++; + + while(ch == ' ' || ch == '\t') + ch = *szCmdLine++; + + if(isdigit(ch)) + { + unsigned int i = atoi(szCmdLine - 1); + *hwndParent = (HWND)i; + } + else + *hwndParent = 0; +} + +int WINAPI WinMain (HINSTANCE hInst, + HINSTANCE hPrev, + LPSTR lpCmdLine, + int iCmdShow) +{ + HWND hwndParent; + UINT nPreviousState; + int chOption; + MSG Message; + + hInstance = hInst; + + ParseCommandLine(lpCmdLine, &chOption, &hwndParent); + + SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &nPreviousState, 0); + + switch (chOption) + { + case 's': + InitSaver(0); + break; + + case 'p': + InitSaver(hwndParent); + break; + + case 'c': + default: + MessageBox(0, + _T("No options need to be set."), + _T("About"), + MB_OK | MB_ICONWARNING); + return 0; + } + + while (GetMessage(&Message, 0, 0, 0)) + DispatchMessage(&Message); + + SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &nPreviousState, 0); + + return Message.wParam; +} diff --git a/reactos/base/applications/screensavers/starfield/starfield.rbuild b/reactos/base/applications/screensavers/starfield/starfield.rbuild new file mode 100644 index 00000000000..383feba8b12 --- /dev/null +++ b/reactos/base/applications/screensavers/starfield/starfield.rbuild @@ -0,0 +1,13 @@ + + + + + + + kernel32 + user32 + gdi32 + + screensaver.c + starfield.rc + diff --git a/reactos/base/applications/screensavers/starfield/starfield.rc b/reactos/base/applications/screensavers/starfield/starfield.rc new file mode 100644 index 00000000000..c42ada3dcd5 --- /dev/null +++ b/reactos/base/applications/screensavers/starfield/starfield.rc @@ -0,0 +1,19 @@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Starfield ScreenSaver\0" +#define REACTOS_STR_INTERNAL_NAME "starfield\0" +#define REACTOS_STR_ORIGINAL_FILENAME "starfield.scr\0" + +#include + + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DESCRIPTION "Starfield ScreenSaver" +END diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index c5c9e64c224..65072e31303 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -30,42 +30,43 @@ Signature = "$ReactOS$" ; Base files -base\applications\cacls\cacls.exe 1 -base\applications\calc\calc.exe 1 -base\applications\charmap\charmap.exe 1 -base\applications\cmdutils\find\find.exe 1 -base\applications\cmdutils\more\more.exe 1 -base\applications\control\control.exe 1 -base\applications\mscutils\devmgmt\devmgmt.exe 1 -base\applications\games\solitaire\sol.exe 1 -base\applications\games\winemine\winemine.exe 1 -base\applications\hh\hh.exe 1 -base\applications\hostname\hostname.exe 1 -base\applications\logoff\logoff.exe 1 -base\applications\msconfig\msconfig.exe 1 -base\applications\network\arp\arp.exe 1 -base\applications\network\route\route.exe 1 -base\applications\network\finger\finger.exe 1 -base\applications\network\ftp\ftp.exe 1 -base\applications\network\ipconfig\ipconfig.exe 1 -base\applications\network\netstat\netstat.exe 1 -base\applications\network\ping\ping.exe 1 -base\applications\network\telnet\telnet.exe 1 -base\applications\network\tracert\tracert.exe 1 -base\applications\network\whois\whois.exe 1 -base\applications\notepad\notepad.exe 1 -base\applications\regedit\regedit.exe 4 -base\applications\regedit\clb\clb.dll 1 -base\applications\sc\sc.exe 1 -base\applications\screensavers\cylfrac\cylfrac.scr 1 -base\applications\screensavers\logon\logon.scr 1 -base\applications\screensavers\matrix\matrix.scr 1 -base\applications\screensavers\scrnsave\scrnsave.scr 1 -base\applications\mscutils\servman\servman.exe 1 -base\applications\shutdown\shutdown.exe 1 -base\applications\sndvol32\sndvol32.exe 1 -base\applications\taskmgr\taskmgr.exe 1 -base\applications\wordpad\wordpad.exe 1 +base\applications\cacls\cacls.exe 1 +base\applications\calc\calc.exe 1 +base\applications\charmap\charmap.exe 1 +base\applications\cmdutils\find\find.exe 1 +base\applications\cmdutils\more\more.exe 1 +base\applications\control\control.exe 1 +base\applications\mscutils\devmgmt\devmgmt.exe 1 +base\applications\games\solitaire\sol.exe 1 +base\applications\games\winemine\winemine.exe 1 +base\applications\hh\hh.exe 1 +base\applications\hostname\hostname.exe 1 +base\applications\logoff\logoff.exe 1 +base\applications\msconfig\msconfig.exe 1 +base\applications\network\arp\arp.exe 1 +base\applications\network\route\route.exe 1 +base\applications\network\finger\finger.exe 1 +base\applications\network\ftp\ftp.exe 1 +base\applications\network\ipconfig\ipconfig.exe 1 +base\applications\network\netstat\netstat.exe 1 +base\applications\network\ping\ping.exe 1 +base\applications\network\telnet\telnet.exe 1 +base\applications\network\tracert\tracert.exe 1 +base\applications\network\whois\whois.exe 1 +base\applications\notepad\notepad.exe 1 +base\applications\regedit\regedit.exe 4 +base\applications\regedit\clb\clb.dll 1 +base\applications\sc\sc.exe 1 +base\applications\screensavers\cylfrac\cylfrac.scr 1 +base\applications\screensavers\logon\logon.scr 1 +base\applications\screensavers\matrix\matrix.scr 1 +base\applications\screensavers\scrnsave\scrnsave.scr 1 +base\applications\screensavers\starfield\starfield.scr 1 +base\applications\mscutils\servman\servman.exe 1 +base\applications\shutdown\shutdown.exe 1 +base\applications\sndvol32\sndvol32.exe 1 +base\applications\taskmgr\taskmgr.exe 1 +base\applications\wordpad\wordpad.exe 1 base\services\dhcp\dhcp.exe 1 base\services\eventlog\eventlog.exe 1