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 TCHAR Caption[1024]; 96 SYSTEM_POWER_CAPABILITIES spc; 97 LONG ret; 98 99 UNREFERENCED_PARAMETER(uMsg); 100 UNREFERENCED_PARAMETER(wParam); 101 UNREFERENCED_PARAMETER(lParam); 102 103 memset(Caption, 0x0, sizeof(Caption)); 104 LoadString(hApplet, IDS_CPLNAME_1, Caption, sizeof(Caption) / sizeof(TCHAR)); 105 106 ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); 107 psh.dwSize = sizeof(PROPSHEETHEADER); 108 psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK; 109 psh.hwndParent = hwnd; 110 psh.hInstance = hApplet; 111 psh.pszIcon = MAKEINTRESOURCEW(IDC_CPLICON_1); 112 psh.pszCaption = Caption; 113 psh.nPages = 0; 114 psh.nStartPage = 0; 115 psh.phpage = hpsp; 116 psh.pfnCallback = PropSheetProc; 117 118 if (!GetPwrCapabilities(&spc)) 119 { 120 return GetLastError(); 121 } 122 123 if (spc.SystemBatteriesPresent) 124 { 125 InitPropSheetPage(&psh, IDD_POWERSCHEMESPAGE_ACDC, PowerSchemesDlgProc); 126 InitPropSheetPage(&psh, IDD_PROPPAGEALARMS, AlarmsDlgProc); 127 } 128 else 129 { 130 InitPropSheetPage(&psh, IDD_POWERSCHEMESPAGE_AC, PowerSchemesDlgProc); 131 } 132 InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, AdvancedDlgProc); 133 if (spc.SystemS4) 134 { 135 InitPropSheetPage(&psh, IDD_PROPPAGEHIBERNATE, HibernateDlgProc); 136 } 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 int i = (int)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 { 174 CPLINFO *CPlInfo = (CPLINFO*)lParam2; 175 CPlInfo->lData = 0; 176 CPlInfo->idIcon = Applets[i].idIcon; 177 CPlInfo->idName = Applets[i].idName; 178 CPlInfo->idInfo = Applets[i].idDescription; 179 break; 180 } 181 182 case CPL_DBLCLK: 183 { 184 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); 185 break; 186 } 187 } 188 189 return FALSE; 190 } 191 192 193 BOOLEAN WINAPI 194 DllMain(HINSTANCE hinstDLL, 195 DWORD dwReason, 196 LPVOID lpvReserved) 197 { 198 UNREFERENCED_PARAMETER(lpvReserved); 199 200 switch (dwReason) 201 { 202 case DLL_PROCESS_ATTACH: 203 DisableThreadLibraryCalls(hinstDLL); 204 hApplet = hinstDLL; 205 break; 206 } 207 208 return TRUE; 209 } 210