ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

scrnsave.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.