xref: /reactos/dll/cpl/powercfg/powercfg.c (revision e944dfa7)
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