Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenscrnsave.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Screen Saver Library 00003 * LICENSE: GPL v2 or any later version 00004 * FILE: lib/sdk/scrnsave/scrnsave.c 00005 * PURPOSE: Library for writing screen savers, compatible with MS' scrnsave.lib 00006 * PROGRAMMERS: Anders Norlander <anorland@hem2.passagen.se> 00007 * Colin Finck <mail@colinfinck.de> 00008 */ 00009 00010 #include <windows.h> 00011 #include <tchar.h> 00012 #include <scrnsave.h> 00013 00014 // Screen Saver window class 00015 #define CLASS_SCRNSAVE TEXT("WindowsScreenSaverClass") 00016 00017 // Globals 00018 HWND hMainWindow = NULL; 00019 BOOL fChildPreview = FALSE; 00020 HINSTANCE hMainInstance; 00021 TCHAR szName[TITLEBARNAMELEN]; 00022 TCHAR szAppName[APPNAMEBUFFERLEN]; 00023 TCHAR szIniFile[MAXFILELEN]; 00024 TCHAR szScreenSaver[22]; 00025 TCHAR szHelpFile[MAXFILELEN]; 00026 TCHAR szNoHelpMemory[BUFFLEN]; 00027 UINT MyHelpMessage; 00028 00029 // Local house keeping 00030 static POINT pt_orig; 00031 00032 static int ISSPACE(TCHAR c) 00033 { 00034 return (c == ' ' || c == '\t'); 00035 } 00036 00037 #define ISNUM(c) ((c) >= '0' && c <= '9') 00038 00039 static ULONG_PTR _toulptr(const TCHAR *s) 00040 { 00041 ULONG_PTR res; 00042 ULONG_PTR n; 00043 const TCHAR *p; 00044 00045 for (p = s; *p; p++) 00046 if (!ISNUM(*p)) 00047 break; 00048 00049 p--; 00050 res = 0; 00051 00052 for (n = 1; p >= s; p--, n *= 10) 00053 res += (*p - '0') * n; 00054 00055 return res; 00056 } 00057 00058 // This function takes care of *must* do tasks, like terminating screen saver 00059 static LRESULT WINAPI SysScreenSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 00060 { 00061 switch(uMsg) 00062 { 00063 case WM_CREATE: 00064 // Mouse is not supposed to move from this position 00065 GetCursorPos(&pt_orig); 00066 break; 00067 00068 case WM_DESTROY: 00069 PostQuitMessage(0); 00070 break; 00071 00072 case WM_SYSCOMMAND: 00073 if (!fChildPreview) 00074 { 00075 switch (wParam) 00076 { 00077 case SC_CLOSE: 00078 case SC_SCREENSAVE: 00079 return FALSE; 00080 } 00081 } 00082 break; 00083 } 00084 00085 return ScreenSaverProc(hWnd, uMsg, wParam, lParam); 00086 } 00087 00088 LRESULT WINAPI DefScreenSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 00089 { 00090 // Don't do any special processing when in preview mode 00091 if (fChildPreview) 00092 return DefWindowProc(hWnd, uMsg, wParam, lParam); 00093 00094 switch (uMsg) 00095 { 00096 case WM_NCACTIVATE: 00097 case WM_ACTIVATE: 00098 case WM_ACTIVATEAPP: 00099 if (!wParam) 00100 { 00101 // wParam is FALSE, so the screensaver is losing the focus. 00102 PostMessage(hWnd, WM_CLOSE, 0, 0); 00103 } 00104 break; 00105 00106 case WM_MOUSEMOVE: 00107 { 00108 POINT pt; 00109 GetCursorPos(&pt); 00110 if (pt.x == pt_orig.x && pt.y == pt_orig.y) 00111 break; 00112 00113 // Fall through 00114 } 00115 00116 case WM_LBUTTONDOWN: 00117 case WM_RBUTTONDOWN: 00118 case WM_MBUTTONDOWN: 00119 case WM_KEYDOWN: 00120 case WM_KEYUP: 00121 // Send a WM_CLOSE to close the screen saver (allows the screensaver author to do clean-up tasks) 00122 PostMessage(hWnd, WM_CLOSE, 0, 0); 00123 break; 00124 00125 case WM_SETCURSOR: 00126 SetCursor(NULL); 00127 return TRUE; 00128 } 00129 00130 return DefWindowProc(hWnd, uMsg, wParam, lParam); 00131 } 00132 00133 // Registers the screen saver window class 00134 static BOOL RegisterScreenSaverClass(void) 00135 { 00136 WNDCLASS cls = {0,}; 00137 00138 cls.hIcon = LoadIcon(hMainInstance, MAKEINTATOM(ID_APP)); 00139 cls.lpszClassName = CLASS_SCRNSAVE; 00140 cls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 00141 cls.hInstance = hMainInstance; 00142 cls.style = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS | CS_PARENTDC; 00143 cls.lpfnWndProc = (WNDPROC)SysScreenSaverProc; 00144 00145 return RegisterClass(&cls) != 0; 00146 } 00147 00148 static void LaunchConfig(void) 00149 { 00150 // Only show the dialog if the RegisterDialogClasses function succeeded. 00151 // This is the same behaviour as MS' scrnsave.lib. 00152 if( RegisterDialogClasses(hMainInstance) ) 00153 DialogBox(hMainInstance, MAKEINTRESOURCE(DLG_SCRNSAVECONFIGURE), GetForegroundWindow(), (DLGPROC) ScreenSaverConfigureDialog); 00154 } 00155 00156 static int LaunchScreenSaver(HWND hParent) 00157 { 00158 UINT style; 00159 RECT rc; 00160 MSG msg; 00161 00162 if (!RegisterScreenSaverClass()) 00163 { 00164 MessageBox(NULL, TEXT("RegisterClass() failed"), NULL, MB_ICONHAND); 00165 return 1; 00166 } 00167 00168 // A slightly different approach needs to be used when displaying in a preview window 00169 if (hParent) 00170 { 00171 style = WS_CHILD; 00172 GetClientRect(hParent, &rc); 00173 } 00174 else 00175 { 00176 style = WS_POPUP; 00177 rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN); 00178 rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN); 00179 style |= WS_VISIBLE; 00180 } 00181 00182 // Create the main screen saver window 00183 hMainWindow = CreateWindowEx(hParent ? 0 : WS_EX_TOPMOST, CLASS_SCRNSAVE, 00184 TEXT("SCREENSAVER"), style, 00185 0, 0, rc.right, rc.bottom, hParent, NULL, 00186 hMainInstance, NULL); 00187 00188 if(!hMainWindow) 00189 return 1; 00190 00191 // Display window and start pumping messages 00192 ShowWindow(hMainWindow, SW_SHOW); 00193 if (!hParent) 00194 SetCursor(NULL); 00195 00196 while (GetMessage(&msg, NULL, 0, 0)) 00197 DispatchMessage(&msg); 00198 00199 return msg.wParam; 00200 } 00201 00202 // Screen Saver entry point 00203 int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR CmdLine, int nCmdShow) 00204 { 00205 LPTSTR p; 00206 00207 UNREFERENCED_PARAMETER(nCmdShow); 00208 UNREFERENCED_PARAMETER(hPrevInst); 00209 00210 hMainInstance = hInst; 00211 00212 // Parse the arguments 00213 for (p = CmdLine; *p; p++) 00214 { 00215 switch (*p) 00216 { 00217 case 'S': 00218 case 's': 00219 // Start the screen saver 00220 return LaunchScreenSaver(NULL); 00221 00222 case 'P': 00223 case 'p': 00224 { 00225 // Start the screen saver in preview mode 00226 HWND hParent; 00227 fChildPreview = TRUE; 00228 00229 while (ISSPACE(*++p)); 00230 hParent = (HWND) _toulptr(p); 00231 00232 if (hParent && IsWindow(hParent)) 00233 return LaunchScreenSaver(hParent); 00234 } 00235 return 0; 00236 00237 case 'C': 00238 case 'c': 00239 // Display the configuration dialog 00240 LaunchConfig(); 00241 return 0; 00242 00243 case '-': 00244 case '/': 00245 case ' ': 00246 default: 00247 break; 00248 } 00249 } 00250 00251 LaunchConfig(); 00252 00253 return 0; 00254 } Generated on Sun May 27 2012 04:36:53 for ReactOS by
1.7.6.1
|