/*
* 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);
}
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:
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;
}
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
hApplet = hinstDLL;
- hProcessHeap = GetProcessHeap();
break;
}