- Compile screensavers as UNICODE applications + minor fixes (Part 1/2)
authorMarc Piulachs <marc.piulachs@live.com>
Mon, 29 Oct 2007 22:49:31 +0000 (22:49 +0000)
committerMarc Piulachs <marc.piulachs@live.com>
Mon, 29 Oct 2007 22:49:31 +0000 (22:49 +0000)
svn path=/trunk/; revision=29965

reactos/base/applications/screensavers/3dtext/3dtext.c
reactos/base/applications/screensavers/3dtext/3dtext.rbuild
reactos/base/applications/screensavers/3dtext/settings.c
reactos/base/applications/screensavers/logon/logon.c
reactos/base/applications/screensavers/logon/logon.rbuild

index d85c08a..4abce9d 100644 (file)
@@ -53,12 +53,12 @@ GLvoid BuildFont(GLvoid)                                                            // Build Our Bitmap Font
                                                FALSE,                                                  // Italic
                                                FALSE,                                                  // Underline
                                                FALSE,                                                  // Strikeout
-                                               ANSI_CHARSET,                                   // Character Set Identifier
+                                               DEFAULT_CHARSET,                                // Character Set Identifier
                                                OUT_TT_PRECIS,                                  // Output Precision
                                                CLIP_DEFAULT_PRECIS,                    // Clipping Precision
                                                ANTIALIASED_QUALITY,                    // Output Quality
                                                FF_DONTCARE|DEFAULT_PITCH,              // Family And Pitch
-                                               "Tahoma");                              // Font Name
+                                               _T("Tahoma"));                          // Font Name
 
        SelectObject(hDC, font);                                                        // Selects The Font We Created
 
@@ -77,14 +77,14 @@ GLvoid KillFont(GLvoid)                                                                     // Delete The Font
   glDeleteLists(base, 256);                                                            // Delete All 256 Characters
 }
 
-GLvoid glPrint(char *text)                                                             // Custom GL "Print" Routine
+GLvoid glPrint(LPWSTR text)                                                            // Custom GL "Print" Routine
 {
   if (text == NULL)                                                                            // If There's No Text
     return;                                                                                            // Do Nothing
 
   glPushAttrib(GL_LIST_BIT);                                                   // Pushes The Display List Bits
   glListBase(base);                                                                            // Sets The Base Character to 32
-  glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);   // Draws The Display List Text
+  glCallLists(wcslen(text), GL_UNSIGNED_SHORT, text);  // Draws The Display List Text
   glPopAttrib();                                                                               // Pops The Display List Bits
 }
 
@@ -185,14 +185,14 @@ LRESULT CALLBACK WndProc( HWND    hWnd,
 
                        if (!PixelFormat)                                                               // No Matching Pixel Format?
                        {
-                               MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
+                               MessageBox(0,_TEXT("Can't Find A Suitable PixelFormat."),_TEXT("Error"),MB_OK|MB_ICONERROR);
                                PostQuitMessage(0);                     // This Sends A 'Message' Telling The Program To Quit
                                break;                                          // Prevents The Rest Of The Code From Running
                        }
 
                        if(!SetPixelFormat(hDC,PixelFormat,&pfd))               // Can We Set The Pixel Mode?
                        {
-                               MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
+                               MessageBox(0,_TEXT("Can't Set The PixelFormat."),_TEXT("Error"),MB_OK|MB_ICONERROR);
                                PostQuitMessage(0);                     // This Sends A 'Message' Telling The Program To Quit
                                break;                                          // Prevents The Rest Of The Code From Running
                        }
@@ -200,14 +200,14 @@ LRESULT CALLBACK WndProc( HWND    hWnd,
                        hRC = wglCreateContext(hDC);                                    // Grab A Rendering Context
                        if(!hRC)                                                                                // Did We Get One?
                        {
-                               MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
+                               MessageBox(0,_TEXT("Can't Create A GL Rendering Context."),_TEXT("Error"),MB_OK|MB_ICONERROR);
                                PostQuitMessage(0);                     // This Sends A 'Message' Telling The Program To Quit
                                break;                                          // Prevents The Rest Of The Code From Running
                        }
 
                        if(!wglMakeCurrent(hDC, hRC))                                   // Can We Make The RC Active?
                        {
-                               MessageBox(0,"Can't Activate GLRC.","Error",MB_OK|MB_ICONERROR);
+                               MessageBox(0,_TEXT("Can't Activate GLRC."),_TEXT("Error"),MB_OK|MB_ICONERROR);
                                PostQuitMessage(0);                     // This Sends A 'Message' Telling The Program To Quit
                                break;                                          // Prevents The Rest Of The Code From Running
                        }
@@ -312,26 +312,25 @@ void InitSaver(HWND hwndParent)
        }
 }
 
-void ParseCommandLine(PSTR szCmdLine, int *chOption, HWND *hwndParent)
+//
+//     Look for any options Windows has passed to us:
+//
+//     -a <hwnd>               (set password)
+//  -s                         (screensave)
+//  -p <hwnd>          (preview)
+//  -c <hwnd>          (configure)
+//
+VOID ParseCommandLine(LPWSTR szCmdLine, UCHAR *chOption, HWND *hwndParent)
 {
-       int ch;
-       
-       if (!strlen(szCmdLine))
-               return;
-
-       ch = *szCmdLine++;
+       UCHAR ch = *szCmdLine++;
 
        if(ch == '-' || ch == '/')
                ch = *szCmdLine++;
 
        if(ch >= 'A' && ch <= 'Z')
-               ch += 'a' - 'A';
+               ch += 'a' - 'A';                //convert to lower case
 
        *chOption = ch;
-
-       if (ch == 's' || ch == 'c')
-               return;
-
        ch = *szCmdLine++;
 
        if(ch == ':')
@@ -342,11 +341,11 @@ void ParseCommandLine(PSTR szCmdLine, int *chOption, HWND *hwndParent)
 
        if(isdigit(ch))
        {
-               unsigned int i = atoi(szCmdLine - 1);
+               unsigned int i = _wtoi(szCmdLine - 1);
                *hwndParent = (HWND)i;
        }
        else
-               *hwndParent = 0;
+               *hwndParent = NULL;
 }
 
 //
@@ -387,13 +386,13 @@ void Configure(void)
        DialogBox(hInstance, MAKEINTRESOURCE(IDD_CONFIG), NULL , (DLGPROC)ConfigDlgProc);       
 }
 
-int WINAPI WinMain (HINSTANCE hInst,
+int CALLBACK wWinMain (HINSTANCE hInst,
                     HINSTANCE hPrev,
-                    LPSTR lpCmdLine,
+                    LPWSTR lpCmdLine,
                     int iCmdShow)
 {
        HWND    hwndParent = 0;
-       int     chOption = 0;
+       UCHAR   chOption;
        MSG     Message;
 
        hInstance = hInst;
index 7bef701..052641b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
-<module name="3dtext" type="win32scr" installbase="system32" installname="3dtext.scr">
+<module name="3dtext" type="win32scr" installbase="system32" installname="3dtext.scr" unicode="true">
        <define name="__USE_W32API" />
        <library>kernel32</library>
        <library>user32</library>
index d1c0c8d..c00ed5f 100644 (file)
@@ -36,7 +36,7 @@ void LoadSettings()
 
        if(RegQueryValueEx(hkey, _T("DisplayString"),  0, 0, (LPBYTE)m_Text, &len) != ERROR_SUCCESS)
        {
-               strcpy(m_Text  , "ReactOS Rocks!");
+               _tcscpy(m_Text  , _TEXT("ReactOS Rocks!"));
        }
 
        RegCloseKey(hkey);
index 0a0636c..6201c29 100644 (file)
-/*\r
- *  Copyright 2003 J Brown\r
- *  Copyright 2006 Eric Kohl\r
- *  Copyright 2007 Marc Piulachs (marc.piulachs@codexchange.net)\r
- *\r
- *  This program is free software; you can redistribute it and/or modify\r
- *  it under the terms of the GNU General Public License as published by\r
- *  the Free Software Foundation; either version 2 of the License, or\r
- *  (at your option) any later version.\r
- *\r
- *  This program is distributed in the hope that it will be useful,\r
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- *  GNU General Public License for more details.\r
- *\r
- *  You should have received a copy of the GNU General Public License\r
- *  along with this program; if not, write to the Free Software\r
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\r
- */\r
-\r
-#include <windows.h>\r
-#include <tchar.h>\r
-#include "resource.h"\r
-\r
-#define RANDOM( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min))\r
-\r
-#define APPNAME _T("Logon")\r
-#define APP_TIMER                      1\r
-#define APP_TIMER_INTERVAL     2000\r
-\r
-#define BITMAP_HEIGHT   240;\r
-#define BITMAP_WIDTH    340\r
-\r
-HINSTANCE hInstance;\r
-\r
-BOOL fullscreen = FALSE;\r
-\r
-void DrawScreen (HDC hdc, HDC hMemDC , RECT rect)\r
-{\r
-       int x;\r
-       int y;\r
-       int width = BITMAP_WIDTH;\r
-       int height = BITMAP_HEIGHT;\r
-\r
-       if (!fullscreen)\r
-       {\r
-               width =  width / 20;\r
-               height = height / 20;\r
-       }\r
-\r
-       x = RANDOM (0, rect.right - width);\r
-       y = RANDOM (0, rect.bottom - height);\r
-\r
-       BitBlt(\r
-               hdc,\r
-               x,\r
-               y,\r
-               width,\r
-               height,\r
-               hMemDC,\r
-               0,\r
-               0,\r
-               SRCCOPY);\r
-}\r
-\r
-HBITMAP GetScreenSaverBitmap (void)\r
-{\r
-       OSVERSIONINFOEX osvi;\r
-\r
-       ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));\r
-       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\r
-       GetVersionEx ((OSVERSIONINFO *) &osvi);\r
-\r
-       switch(osvi.wProductType)\r
-       {\r
-               case VER_NT_WORKSTATION:\r
-                       return LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_WORKSTATION));\r
-                       break;\r
-               default:\r
-                       return LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SERVER));\r
-                       break;\r
-       }\r
-}\r
-\r
-LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
-       static POINT ptLast;\r
-       static POINT ptCursor;\r
-       static BOOL  fFirstTime = TRUE;\r
-\r
-       static PAINTSTRUCT ps;\r
-       static RECT rect;\r
-       static HDC hDC;\r
-       static HDC hMemDC;\r
-       static HBRUSH hBlkBrush;\r
-       static HBITMAP bitmap;\r
-\r
-       switch (msg)\r
-       {\r
-               case WM_CREATE:\r
-               {\r
-                       hDC = GetDC(hwnd);\r
-                       hBlkBrush = (HBRUSH) GetStockObject(BLACK_BRUSH);\r
-                       hMemDC = CreateCompatibleDC(hDC);\r
-                       GetClientRect(hwnd, &rect);\r
-\r
-                       bitmap = GetScreenSaverBitmap ();\r
-\r
-                       if(bitmap == NULL)\r
-                       {\r
-                               MessageBox(\r
-                                  hwnd,\r
-                                  _T("Fatal Error: Could not load bitmap"),\r
-                                  _T("Error"),\r
-                                  MB_OK | MB_ICONEXCLAMATION);\r
-                       }\r
-\r
-                       SetTimer (\r
-                               hwnd,\r
-                               APP_TIMER,\r
-                               APP_TIMER_INTERVAL,\r
-                               NULL);\r
-\r
-                        break;\r
-                }\r
-               case WM_PAINT:\r
-                       {\r
-                               hDC = BeginPaint(hwnd, &ps);\r
-                               SelectObject(hMemDC, bitmap);\r
-                               DrawScreen (hDC , hMemDC , rect);\r
-                               EndPaint(hwnd, &ps);\r
-                               break;\r
-                       }\r
-               case WM_TIMER :\r
-               {\r
-                       if (wParam == APP_TIMER)\r
-                       {\r
-                               InvalidateRect(hwnd, NULL, 1);\r
-                       }\r
-               }\r
-                 case WM_ERASEBKGND:\r
-                       {\r
-                               SelectObject(hDC, hBlkBrush);\r
-\r
-                               PatBlt(\r
-                                       hDC,\r
-                                       0,\r
-                                       0,\r
-                                       rect.right,\r
-                                       rect.bottom,\r
-                                       PATCOPY);\r
-                               break;\r
-                       }\r
-                       case WM_DESTROY:\r
-                       {\r
-                               KillTimer (hwnd, APP_TIMER);\r
-                               DeleteObject(bitmap);\r
-                               ShowCursor(TRUE);\r
-                               PostQuitMessage(0);\r
-                               break;\r
-                       }\r
-\r
-                       // break out of screen-saver if any keyboard activity\r
-                       case WM_NOTIFY:\r
-                       case WM_SYSKEYDOWN:\r
-                               PostMessage(hwnd, WM_CLOSE, 0, 0);\r
-                               break;\r
-\r
-                       // break out of screen-saver if any mouse activity\r
-                       case WM_LBUTTONDOWN:\r
-                       case WM_LBUTTONUP:\r
-                       case WM_RBUTTONDOWN:\r
-                       case WM_RBUTTONUP:\r
-                       case WM_MBUTTONDOWN:\r
-                       case WM_MBUTTONUP:\r
-                       case WM_MOUSEMOVE:\r
-                               // If we've got a parent then we must be a preview\r
-                               if(GetParent(hwnd) != 0)\r
-                                       return 0;\r
-\r
-                               if(fFirstTime)\r
-                               {\r
-                                       GetCursorPos(&ptLast);\r
-                                       fFirstTime = FALSE;\r
-                               }\r
-\r
-                       GetCursorPos(&ptCursor);\r
-\r
-                       // if the mouse has moved more than 3 pixels then exit\r
-                       if(abs(ptCursor.x - ptLast.x) >= 3 || abs(ptCursor.y - ptLast.y) >= 3)\r
-                               PostMessage(hwnd, WM_CLOSE, 0, 0);\r
-\r
-                       ptLast = ptCursor;\r
-\r
-                       return 0;\r
-               }\r
-\r
-       return DefWindowProc(hwnd, msg, wParam, lParam);\r
-}\r
-\r
-void InitSaver(HWND hwndParent)\r
-{\r
-       WNDCLASS wc;\r
-       ZeroMemory(&wc, sizeof(wc));\r
-       wc.style            = CS_HREDRAW | CS_VREDRAW;\r
-       wc.lpfnWndProc      = WndProc;\r
-       wc.lpszClassName    = APPNAME;\r
-       wc.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);\r
-       RegisterClass(&wc);\r
-\r
-       if (hwndParent != 0)\r
-       {\r
-               RECT rect;\r
-               GetClientRect(hwndParent, &rect);\r
-               CreateWindow(APPNAME, APPNAME,\r
-                            WS_VISIBLE | WS_CHILD,\r
-                            0, 0,\r
-                            rect.right,\r
-                            rect.bottom,\r
-                            hwndParent, 0,\r
-                            hInstance, NULL);\r
-               fullscreen = FALSE;\r
-       }\r
-       else\r
-       {\r
-               HWND hwnd;\r
-               hwnd = CreateWindowEx(WS_EX_TOPMOST,\r
-                          APPNAME,\r
-                          APPNAME,\r
-                          WS_VISIBLE | WS_POPUP,\r
-                          0, 0,\r
-                          GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),\r
-                          HWND_DESKTOP, 0,\r
-                          hInstance, NULL);\r
-\r
-    SetWindowPos(hwnd,\r
-                 0, 0, 0, 0, 0,\r
-                 SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE|SWP_SHOWWINDOW);\r
-\r
-    ShowCursor(FALSE);\r
-               fullscreen = TRUE;\r
-       }\r
-}\r
-\r
-void ParseCommandLine(PSTR szCmdLine, int *chOption, HWND *hwndParent)\r
-{\r
-       int ch = *szCmdLine++;\r
-\r
-       if(ch == '-' || ch == '/')\r
-               ch = *szCmdLine++;\r
-\r
-       if(ch >= 'A' && ch <= 'Z')\r
-               ch += 'a' - 'A';\r
-\r
-       *chOption = ch;\r
-       ch = *szCmdLine++;\r
-\r
-       if(ch == ':')\r
-               ch = *szCmdLine++;\r
-\r
-       while(ch == ' ' || ch == '\t')\r
-               ch = *szCmdLine++;\r
-\r
-       if(isdigit(ch))\r
-       {\r
-               unsigned int i = atoi(szCmdLine - 1);\r
-               *hwndParent = (HWND)i;\r
-       }\r
-       else\r
-               *hwndParent = 0;\r
-}\r
-\r
-void Configure(void)\r
-{\r
-       TCHAR szTitle[256];\r
-       TCHAR szText[256];\r
-\r
-       LoadString(hInstance,\r
-                  IDS_TITLE,\r
-                  szTitle,\r
-                  256);\r
-\r
-       LoadString(hInstance,\r
-                  IDS_TEXT,\r
-                  szText,\r
-                  256);\r
-\r
-       MessageBox(0,\r
-                  szText,\r
-                  szTitle,\r
-                  MB_OK | MB_ICONWARNING);\r
-}\r
-\r
-int WINAPI WinMain (HINSTANCE hInst,\r
-                    HINSTANCE hPrev,\r
-                    LPSTR lpCmdLine,\r
-                    int iCmdShow)\r
-{\r
-       HWND    hwndParent;\r
-       UINT    nPreviousState;\r
-       int     chOption;\r
-       MSG     Message;\r
-\r
-       hInstance = hInst;\r
-\r
-       ParseCommandLine(lpCmdLine, &chOption, &hwndParent);\r
-\r
-       SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &nPreviousState, 0);\r
-\r
-       switch (chOption)\r
-       {\r
-               case 's':\r
-                       InitSaver(0);\r
-                       break;\r
-\r
-               case 'p':\r
-                       InitSaver(hwndParent);\r
-                       break;\r
-\r
-               case 'c':\r
-               default:\r
-                       Configure();\r
-                       return 0;\r
-       }\r
-\r
-       while (GetMessage(&Message, 0, 0, 0))\r
-               DispatchMessage(&Message);\r
-\r
-       SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &nPreviousState, 0);\r
-\r
-       return Message.wParam;\r
-}\r
+/*
+ *  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 <windows.h>
+#include <tchar.h>
+#include "resource.h"
+
+#define RANDOM( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min))
+
+#define APPNAME _T("Logon")
+#define APP_TIMER                      1
+#define APP_TIMER_INTERVAL     2000
+
+#define BITMAP_HEIGHT   240;
+#define BITMAP_WIDTH    340
+
+HINSTANCE hInstance;
+
+BOOL fullscreen = FALSE;
+
+void DrawScreen (HDC hdc, HDC hMemDC , RECT rect)
+{
+       int x;
+       int y;
+       int width = BITMAP_WIDTH;
+       int height = BITMAP_HEIGHT;
+
+       if (!fullscreen)
+       {
+               width =  width / 20;
+               height = height / 20;
+       }
+
+       x = RANDOM (0, rect.right - width);
+       y = RANDOM (0, rect.bottom - height);
+
+       BitBlt(
+               hdc,
+               x,
+               y,
+               width,
+               height,
+               hMemDC,
+               0,
+               0,
+               SRCCOPY);
+}
+
+HBITMAP GetScreenSaverBitmap (void)
+{
+       OSVERSIONINFOEX osvi;
+
+       ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+       osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+       GetVersionEx ((OSVERSIONINFO *) &osvi);
+
+       switch(osvi.wProductType)
+       {
+               case VER_NT_WORKSTATION:
+                       return LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_WORKSTATION));
+                       break;
+               default:
+                       return LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SERVER));
+                       break;
+       }
+}
+
+LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+       static POINT ptLast;
+       static POINT ptCursor;
+       static BOOL  fFirstTime = TRUE;
+
+       static PAINTSTRUCT ps;
+       static RECT rect;
+       static HDC hDC;
+       static HDC hMemDC;
+       static HBRUSH hBlkBrush;
+       static HBITMAP bitmap;
+
+       switch (msg)
+       {
+               case WM_CREATE:
+               {
+                       hDC = GetDC(hwnd);
+                       hBlkBrush = (HBRUSH) GetStockObject(BLACK_BRUSH);
+                       hMemDC = CreateCompatibleDC(hDC);
+                       GetClientRect(hwnd, &rect);
+
+                       bitmap = GetScreenSaverBitmap ();
+
+                       if(bitmap == NULL)
+                       {
+                               MessageBox(
+                                  hwnd,
+                                  _T("Fatal Error: Could not load bitmap"),
+                                  _T("Error"),
+                                  MB_OK | MB_ICONEXCLAMATION);
+                       }
+
+                       SetTimer (
+                               hwnd,
+                               APP_TIMER,
+                               APP_TIMER_INTERVAL,
+                               NULL);
+
+                        break;
+                }
+               case WM_PAINT:
+                       {
+                               hDC = BeginPaint(hwnd, &ps);
+                               SelectObject(hMemDC, bitmap);
+                               DrawScreen (hDC , hMemDC , rect);
+                               EndPaint(hwnd, &ps);
+                               break;
+                       }
+               case WM_TIMER :
+               {
+                       if (wParam == APP_TIMER)
+                       {
+                               InvalidateRect(hwnd, NULL, 1);
+                       }
+               }
+                 case WM_ERASEBKGND:
+                       {
+                               SelectObject(hDC, hBlkBrush);
+
+                               PatBlt(
+                                       hDC,
+                                       0,
+                                       0,
+                                       rect.right,
+                                       rect.bottom,
+                                       PATCOPY);
+                               break;
+                       }
+                       case WM_DESTROY:
+                       {
+                               KillTimer (hwnd, APP_TIMER);
+                               DeleteObject(bitmap);
+                               ShowCursor(TRUE);
+                               PostQuitMessage(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 = CreateWindowEx(WS_EX_TOPMOST,
+                          APPNAME,
+                          APPNAME,
+                          WS_VISIBLE | WS_POPUP,
+                          0, 0,
+                          GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
+                          HWND_DESKTOP, 0,
+                          hInstance, NULL);
+
+    SetWindowPos(hwnd,
+                 0, 0, 0, 0, 0,
+                 SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE|SWP_SHOWWINDOW);
+
+    ShowCursor(FALSE);
+               fullscreen = TRUE;
+       }
+}
+
+VOID ParseCommandLine(LPWSTR szCmdLine, UCHAR *chOption, HWND *hwndParent)
+{
+       UCHAR ch = *szCmdLine++;
+
+       if(ch == '-' || ch == '/')
+               ch = *szCmdLine++;
+
+       if(ch >= 'A' && ch <= 'Z')
+               ch += 'a' - 'A';                //convert to lower case
+
+       *chOption = ch;
+       ch = *szCmdLine++;
+
+       if(ch == ':')
+               ch = *szCmdLine++;
+
+       while(ch == ' ' || ch == '\t')
+               ch = *szCmdLine++;
+
+       if(isdigit(ch))
+       {
+               unsigned int i = _wtoi(szCmdLine - 1);
+               *hwndParent = (HWND)i;
+       }
+       else
+               *hwndParent = NULL;
+}
+
+void Configure(void)
+{
+       TCHAR szTitle[256];
+       TCHAR szText[256];
+
+       LoadString(hInstance,
+                  IDS_TITLE,
+                  szTitle,
+                  256);
+
+       LoadString(hInstance,
+                  IDS_TEXT,
+                  szText,
+                  256);
+
+       MessageBox(0,
+                  szText,
+                  szTitle,
+                  MB_OK | MB_ICONWARNING);
+}
+
+int CALLBACK wWinMain (HINSTANCE hInst,
+                    HINSTANCE hPrev,
+                    LPWSTR lpCmdLine,
+                    int iCmdShow)
+{
+       HWND    hwndParent;
+       UINT    nPreviousState;
+       UCHAR   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:
+                       Configure();
+                       return 0;
+       }
+
+       while (GetMessage(&Message, 0, 0, 0))
+               DispatchMessage(&Message);
+
+       SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, FALSE, &nPreviousState, 0);
+
+       return Message.wParam;
+}
index cea31b0..8ec139e 100644 (file)
@@ -1,16 +1,13 @@
-<?xml version="1.0"?>\r
-<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">\r
-<module name="logon" type="win32scr" installbase="system32" installname="logon.scr">\r
-       <include base="logon">.</include>\r
-       <define name="UNICODE" />\r
-       <define name="_UNICODE" />\r
-\r
-       <library>kernel32</library>\r
-       <library>user32</library>\r
-       <library>gdi32</library>\r
-\r
-       <metadata description = "Default ReactOS Logo screensaver" />\r
-\r
-       <file>logon.c</file>\r
-       <file>logon.rc</file>\r
-</module>\r
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<module name="logon" type="win32scr" installbase="system32" installname="logon.scr" unicode="true">
+       <include base="logon">.</include>
+       <library>kernel32</library>
+       <library>user32</library>
+       <library>gdi32</library>
+
+       <metadata description = "Default ReactOS Logo screensaver" />
+
+       <file>logon.c</file>
+       <file>logon.rc</file>
+</module>