1 /* 2 * PROJECT: ReactOS Power Configuration Applet 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: dll/cpl/powercfg/powercfg.c 5 * PURPOSE: initialization of applet 6 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net) 7 * Johannes Anderwald (johannes.anderwald@reactos.org) 8 * Martin Rottensteiner 9 * Dmitry Chapyshev (lentind@yandex.ru) 10 */ 11 12 #include "powercfg.h" 13 14 #include <winreg.h> 15 #include <regstr.h> 16 17 #define NUM_APPLETS (1) 18 19 static LONG APIENTRY Applet1(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam); 20 21 22 HINSTANCE hApplet = 0; 23 GLOBAL_POWER_POLICY gGPP; 24 TCHAR langSel[255]; 25 26 /* Applets */ 27 APPLET Applets[NUM_APPLETS] = 28 { 29 {IDC_CPLICON_1, IDS_CPLNAME_1, IDS_CPLDESCRIPTION_1, Applet1} 30 }; 31 32 static BOOL CALLBACK 33 PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam) 34 { 35 PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam; 36 if (ppsh != NULL && ppsh->nPages < MAX_POWER_PAGES) 37 { 38 ppsh->phpage[ppsh->nPages++] = hpage; 39 return TRUE; 40 } 41 42 return FALSE; 43 } 44 45 static BOOL 46 InitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc) 47 { 48 HPROPSHEETPAGE hPage; 49 PROPSHEETPAGE psp; 50 51 if (ppsh->nPages < MAX_POWER_PAGES) 52 { 53 ZeroMemory(&psp, sizeof(psp)); 54 psp.dwSize = sizeof(psp); 55 psp.dwFlags = PSP_DEFAULT; 56 psp.hInstance = hApplet; 57 psp.pszTemplate = MAKEINTRESOURCE(idDlg); 58 psp.pfnDlgProc = DlgProc; 59 60 hPage = CreatePropertySheetPage(&psp); 61 if (hPage != NULL) 62 { 63 return PropSheetAddPage(hPage, (LPARAM)ppsh); 64 } 65 } 66 67 return FALSE; 68 } 69 70 static int CALLBACK 71 PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam) 72 { 73 // NOTE: This callback is needed to set large icon correctly. 74 HICON hIcon; 75 76 switch (uMsg) 77 { 78 case PSCB_INITIALIZED: 79 { 80 hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDC_CPLICON_1)); 81 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); 82 break; 83 } 84 } 85 return 0; 86 } 87 88 /* First Applet */ 89 static LONG APIENTRY 90 Applet1(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam) 91 { 92 HPROPSHEETPAGE hpsp[MAX_POWER_PAGES]; 93 PROPSHEETHEADER psh; 94 HPSXA hpsxa = NULL; 95 SYSTEM_POWER_CAPABILITIES spc; 96 LONG ret; 97 98 UNREFERENCED_PARAMETER(uMsg); 99 UNREFERENCED_PARAMETER(wParam); 100 UNREFERENCED_PARAMETER(lParam); 101 102 ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); 103 psh.dwSize = sizeof(PROPSHEETHEADER); 104 psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK; 105 psh.hwndParent = hwnd; 106 psh.hInstance = hApplet; 107 psh.pszIcon = MAKEINTRESOURCEW(IDC_CPLICON_1); 108 psh.pszCaption = MAKEINTRESOURCEW(IDS_CPLNAME_1); 109 psh.nPages = 0; 110 psh.nStartPage = 0; 111 psh.phpage = hpsp; 112 psh.pfnCallback = PropSheetProc; 113 114 if (!GetPwrCapabilities(&spc)) 115 { 116 return GetLastError(); 117 } 118 119 if (spc.SystemBatteriesPresent) 120 { 121 InitPropSheetPage(&psh, IDD_POWERSCHEMESPAGE_ACDC, PowerSchemesDlgProc); 122 InitPropSheetPage(&psh, IDD_PROPPAGEALARMS, AlarmsDlgProc); 123 124 /* FIXME: Add battery page */ 125 } 126 else 127 { 128 InitPropSheetPage(&psh, IDD_POWERSCHEMESPAGE_AC, PowerSchemesDlgProc); 129 } 130 InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, AdvancedDlgProc); 131 if (spc.SystemS4) 132 { 133 InitPropSheetPage(&psh, IDD_PROPPAGEHIBERNATE, HibernateDlgProc); 134 } 135 136 /* FIXME: Add UPS page */ 137 138 /* Load additional pages provided by shell extensions */ 139 hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\Power"), MAX_POWER_PAGES - psh.nPages); 140 if (hpsxa != NULL) 141 SHAddFromPropSheetExtArray(hpsxa, PropSheetAddPage, (LPARAM)&psh); 142 143 ret = (LONG)(PropertySheet(&psh) != -1); 144 145 if (hpsxa != NULL) 146 SHDestroyPropSheetExtArray(hpsxa); 147 148 return ret; 149 } 150 151 /* Control Panel Callback */ 152 LONG CALLBACK 153 CPlApplet(HWND hwndCPl, 154 UINT uMsg, 155 LPARAM lParam1, 156 LPARAM lParam2) 157 { 158 UINT i = (UINT)lParam1; 159 160 switch (uMsg) 161 { 162 case CPL_INIT: 163 { 164 return TRUE; 165 } 166 167 case CPL_GETCOUNT: 168 { 169 return NUM_APPLETS; 170 } 171 172 case CPL_INQUIRE: 173 if (i < NUM_APPLETS) 174 { 175 CPLINFO *CPlInfo = (CPLINFO*)lParam2; 176 CPlInfo->lData = 0; 177 CPlInfo->idIcon = Applets[i].idIcon; 178 CPlInfo->idName = Applets[i].idName; 179 CPlInfo->idInfo = Applets[i].idDescription; 180 } 181 else 182 { 183 return TRUE; 184 } 185 break; 186 187 case CPL_DBLCLK: 188 if (i < NUM_APPLETS) 189 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); 190 else 191 return TRUE; 192 break; 193 } 194 195 return FALSE; 196 } 197 198 199 BOOLEAN WINAPI 200 DllMain(HINSTANCE hinstDLL, 201 DWORD dwReason, 202 LPVOID lpvReserved) 203 { 204 UNREFERENCED_PARAMETER(lpvReserved); 205 206 switch (dwReason) 207 { 208 case DLL_PROCESS_ATTACH: 209 DisableThreadLibraryCalls(hinstDLL); 210 hApplet = hinstDLL; 211 break; 212 } 213 214 return TRUE; 215 } 216