Reactos
at master 169 lines 4.3 kB view raw
1/* 2 * PROJECT: input.dll 3 * FILE: dll/cpl/input/input.c 4 * PURPOSE: input.dll 5 * PROGRAMMER: Dmitry Chapyshev (lentind@yandex.ru) 6 * Colin Finck 7 * UPDATE HISTORY: 8 * 06-09-2007 Created 9 */ 10 11#include "input.h" 12 13#define NUM_APPLETS (1) 14 15static LONG CALLBACK SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2); 16 17HINSTANCE hApplet = NULL; 18BOOL g_bRebootNeeded = FALSE; 19 20/* Applets */ 21static APPLET Applets[NUM_APPLETS] = 22{ 23 {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet} 24}; 25 26 27static VOID 28InitPropSheetPage(PROPSHEETPAGEW *page, WORD idDlg, DLGPROC DlgProc) 29{ 30 ZeroMemory(page, sizeof(*page)); 31 32 page->dwSize = sizeof(*page); 33 page->dwFlags = PSP_DEFAULT; 34 page->hInstance = hApplet; 35 page->pszTemplate = MAKEINTRESOURCEW(idDlg); 36 page->pfnDlgProc = DlgProc; 37} 38 39static BOOL AskForReboot(HWND hwndDlg) 40{ 41 WCHAR szText[128], szCaption[64]; 42 LoadStringW(hApplet, IDS_REBOOT_NOW, szText, _countof(szText)); 43 LoadStringW(hApplet, IDS_LANGUAGE, szCaption, _countof(szCaption)); 44 return (MessageBoxW(hwndDlg, szText, szCaption, MB_ICONINFORMATION | MB_YESNO) == IDYES); 45} 46 47static int CALLBACK 48PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam) 49{ 50 switch (uMsg) 51 { 52 case PSCB_INITIALIZED: 53 { 54 /* Set large icon correctly */ 55 HICON hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM)); 56 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); 57 break; 58 } 59 60 case PSCB_BUTTONPRESSED: 61 { 62 switch (lParam) 63 { 64 case PSBTN_OK: 65 case PSBTN_APPLYNOW: 66 { 67 if (g_bRebootNeeded && AskForReboot(hwndDlg)) 68 { 69 EnableProcessPrivileges(SE_SHUTDOWN_NAME, TRUE); 70 ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); 71 } 72 break; 73 } 74 } 75 break; 76 } 77 } 78 return 0; 79} 80 81/* First Applet */ 82static LONG CALLBACK 83SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2) 84{ 85 PROPSHEETPAGEW page[2]; 86 PROPSHEETHEADERW header; 87 88 ZeroMemory(&header, sizeof(header)); 89 90 header.dwSize = sizeof(header); 91 header.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK; 92 header.hwndParent = hwnd; 93 header.hInstance = hApplet; 94 header.pszIcon = MAKEINTRESOURCEW(IDI_CPLSYSTEM); 95 header.pszCaption = MAKEINTRESOURCEW(IDS_CPLSYSTEMNAME); 96 header.nPages = ARRAYSIZE(page); 97 header.nStartPage = 0; 98 header.ppsp = page; 99 header.pfnCallback = PropSheetProc; 100 101 /* Settings */ 102 InitPropSheetPage(&page[0], IDD_PROPPAGESETTINGS, SettingsPageProc); 103 104 /* Advanced Settings */ 105 InitPropSheetPage(&page[1], IDD_PROPPAGEADVANCEDSETTINGS, AdvancedSettingsPageProc); 106 107 return (LONG)(PropertySheetW(&header) != -1); 108} 109 110 111/* Control Panel Callback */ 112LONG CALLBACK 113CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) 114{ 115 CPLINFO *CPlInfo; 116 UINT i = (UINT)lParam1; 117 118 switch (uMsg) 119 { 120 case CPL_INIT: 121 return TRUE; 122 123 case CPL_GETCOUNT: 124 return NUM_APPLETS; 125 126 case CPL_INQUIRE: 127 if (i < NUM_APPLETS) 128 { 129 CPlInfo = (CPLINFO*)lParam2; 130 CPlInfo->lData = 0; 131 CPlInfo->idIcon = Applets[i].idIcon; 132 CPlInfo->idName = Applets[i].idName; 133 CPlInfo->idInfo = Applets[i].idDescription; 134 } 135 else 136 { 137 return TRUE; 138 } 139 break; 140 141 case CPL_DBLCLK: 142 if (i < NUM_APPLETS) 143 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); 144 else 145 return TRUE; 146 break; 147 } 148 149 return FALSE; 150} 151 152 153BOOL WINAPI 154DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) 155{ 156 UNREFERENCED_PARAMETER(lpvReserved); 157 158 switch (dwReason) 159 { 160 case DLL_PROCESS_ATTACH: 161 case DLL_THREAD_ATTACH: 162 hApplet = hinstDLL; 163 break; 164 } 165 166 return TRUE; 167} 168 169/* EOF */