[CRT] crtdefs.h: Wrap localeinfo_struct in ifdef
[reactos.git] / dll / cpl / input / input.c
index c5c6b5f..de64edf 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * PROJECT:         input.dll
- * FILE:            dll/win32/input/input.c
+ * FILE:            dll/cpl/input/input.c
  * PURPOSE:         input.dll
  * PROGRAMMER:      Dmitry Chapyshev (lentind@yandex.ru)
  *                  Colin Finck
 
 #include "input.h"
 
-#include <cpl.h>
-
 #define NUM_APPLETS    (1)
 
-LONG CALLBACK SystemApplet(VOID);
-HINSTANCE hApplet = 0;
-HANDLE hProcessHeap;
-HWND hCPLWindow;
+static LONG CALLBACK SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
+
+HINSTANCE hApplet = NULL;
+BOOL g_bRebootNeeded = FALSE;
 
 /* Applets */
-APPLET Applets[NUM_APPLETS] =
+static APPLET Applets[NUM_APPLETS] =
 {
     {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
 };
 
 
-VOID
-InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
+static VOID
+InitPropSheetPage(PROPSHEETPAGEW *page, WORD idDlg, DLGPROC DlgProc)
 {
-    ZeroMemory(psp, sizeof(PROPSHEETPAGE));
-    psp->dwSize = sizeof(PROPSHEETPAGE);
-    psp->dwFlags = PSP_DEFAULT;
-    psp->hInstance = hApplet;
-    psp->pszTemplate = MAKEINTRESOURCE(idDlg);
-    psp->pfnDlgProc = DlgProc;
+    ZeroMemory(page, sizeof(*page));
+
+    page->dwSize      = sizeof(*page);
+    page->dwFlags     = PSP_DEFAULT;
+    page->hInstance   = hApplet;
+    page->pszTemplate = MAKEINTRESOURCEW(idDlg);
+    page->pfnDlgProc  = DlgProc;
 }
 
+static BOOL AskForReboot(HWND hwndDlg)
+{
+    WCHAR szText[128], szCaption[64];
+    LoadStringW(hApplet, IDS_REBOOT_NOW, szText, _countof(szText));
+    LoadStringW(hApplet, IDS_LANGUAGE, szCaption, _countof(szCaption));
+    return (MessageBoxW(hwndDlg, szText, szCaption, MB_ICONINFORMATION | MB_YESNO) == IDYES);
+}
 
-/* First Applet */
+static int CALLBACK
+PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
+{
+    switch (uMsg)
+    {
+        case PSCB_INITIALIZED:
+        {
+            /* Set large icon correctly */
+            HICON hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM));
+            SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
+            break;
+        }
+
+        case PSCB_BUTTONPRESSED:
+        {
+            switch (lParam)
+            {
+                case PSBTN_OK:
+                case PSBTN_APPLYNOW:
+                {
+                    if (g_bRebootNeeded && AskForReboot(hwndDlg))
+                    {
+                        EnableProcessPrivileges(SE_SHUTDOWN_NAME, TRUE);
+                        ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
+                    }
+                    break;
+                }
+            }
+            break;
+        }
+    }
+    return 0;
+}
 
-LONG CALLBACK
-SystemApplet(VOID)
+/* First Applet */
+static LONG CALLBACK
+SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 {
-    PROPSHEETPAGE psp[2];
-    PROPSHEETHEADER psh;
-    TCHAR Caption[1024];
-
-    LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
-
-    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
-    psh.dwSize = sizeof(PROPSHEETHEADER);
-    psh.dwFlags =  PSH_PROPSHEETPAGE;
-    psh.hwndParent = hCPLWindow;
-    psh.hInstance = hApplet;
-    psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
-    psh.pszCaption = Caption;
-    psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
-    psh.nStartPage = 0;
-    psh.ppsp = psp;
-    psh.pfnCallback = NULL;
+    PROPSHEETPAGEW page[2];
+    PROPSHEETHEADERW header;
+
+    ZeroMemory(&header, sizeof(header));
+
+    header.dwSize      = sizeof(header);
+    header.dwFlags     = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK;
+    header.hwndParent  = hwnd;
+    header.hInstance   = hApplet;
+    header.pszIcon     = MAKEINTRESOURCEW(IDI_CPLSYSTEM);
+    header.pszCaption  = MAKEINTRESOURCEW(IDS_CPLSYSTEMNAME);
+    header.nPages      = ARRAYSIZE(page);
+    header.nStartPage  = 0;
+    header.ppsp        = page;
+    header.pfnCallback = PropSheetProc;
 
     /* Settings */
-    InitPropSheetPage(&psp[0], IDD_PROPPAGESETTINGS, (DLGPROC)SettingsPageProc);
+    InitPropSheetPage(&page[0], IDD_PROPPAGESETTINGS, SettingsPageProc);
 
     /* Advanced Settings */
-    InitPropSheetPage(&psp[1], IDD_PROPPAGEADVANCEDSETTINGS, (DLGPROC)AdvancedSettingsPageProc);
+    InitPropSheetPage(&page[1], IDD_PROPPAGEADVANCEDSETTINGS, AdvancedSettingsPageProc);
 
-    return (LONG)(PropertySheet(&psh) != -1);
+    return (LONG)(PropertySheetW(&header) != -1);
 }
 
 
@@ -76,9 +113,8 @@ LONG CALLBACK
 CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 {
     CPLINFO *CPlInfo;
-    DWORD i;
+    UINT i = (UINT)lParam1;
 
-    i = (DWORD)lParam1;
     switch (uMsg)
     {
         case CPL_INIT:
@@ -88,16 +124,25 @@ CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
             return NUM_APPLETS;
 
         case CPL_INQUIRE:
-            CPlInfo = (CPLINFO*)lParam2;
-            CPlInfo->lData = 0;
-            CPlInfo->idIcon = Applets[i].idIcon;
-            CPlInfo->idName = Applets[i].idName;
-            CPlInfo->idInfo = Applets[i].idDescription;
+            if (i < NUM_APPLETS)
+            {
+                CPlInfo = (CPLINFO*)lParam2;
+                CPlInfo->lData = 0;
+                CPlInfo->idIcon = Applets[i].idIcon;
+                CPlInfo->idName = Applets[i].idName;
+                CPlInfo->idInfo = Applets[i].idDescription;
+            }
+            else
+            {
+                return TRUE;
+            }
             break;
 
         case CPL_DBLCLK:
-            hCPLWindow = hwndCPl;
-            Applets[i].AppletProc();
+            if (i < NUM_APPLETS)
+                Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
+            else
+                return TRUE;
             break;
     }
 
@@ -115,7 +160,6 @@ DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
         case DLL_PROCESS_ATTACH:
         case DLL_THREAD_ATTACH:
             hApplet = hinstDLL;
-            hProcessHeap = GetProcessHeap();
             break;
     }