3 * PROJECT: ReactOS Power Configuration Applet
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: dll/cpl/powercfg/advanced.c
6 * PURPOSE: advanced tab of applet
7 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net)
8 * Johannes Anderwald (johannes.anderwald@student.tugraz.at)
10 * Dmitry Chapyshev (lentind@yandex.ru)
14 //typedef long NTSTATUS;
18 #define WIN32_NO_STATUS
27 static POWER_ACTION g_SystemBatteries
[3];
28 static POWER_ACTION g_PowerButton
[5];
29 static POWER_ACTION g_SleepButton
[5];
33 AddItem(HWND hDlgCtrl
, INT ResourceId
, LPARAM lParam
, POWER_ACTION
* lpAction
)
35 TCHAR szBuffer
[MAX_PATH
];
37 if (LoadString(hApplet
, ResourceId
, szBuffer
, MAX_PATH
) < MAX_PATH
)
39 Index
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
42 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)Index
, lParam
);
43 lpAction
[Index
] = (POWER_ACTION
)lParam
;
49 FindActionIndex(POWER_ACTION
* lpAction
, DWORD dwActionSize
, POWER_ACTION poAction
)
53 for (Index
= 0; Index
< (INT
)dwActionSize
; Index
++)
55 if (lpAction
[Index
] == poAction
)
65 SYSTEM_BATTERY_STATE sbs
;
67 if (CallNtPowerInformation(SystemBatteryState
,NULL
, (ULONG
)0, &sbs
, sizeof(SYSTEM_BATTERY_STATE
)) == STATUS_SUCCESS
)
69 if (sbs
.BatteryPresent
)
83 GetPowerActionFromPolicy(POWER_ACTION_POLICY
*Policy
)
85 POWER_ACTION poAction
= PowerActionNone
;
88 TCHAR szBuffer[MAX_PATH];
90 // Note: Windows XP SP2+ does not return the PowerAction code
91 // for PowerActionWarmEject + PowerActionShutdown but sets it
92 // to PowerActionNone and sets the Flags & EventCode
95 _stprintf(szBuffer, L"Action: %x EventCode %x Flags %x",Policy->Action, Policy->EventCode, Policy->Flags);
96 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
100 if (Policy
->Action
== PowerActionNone
)
102 if (Policy
->Flags
== (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
))
104 if (Policy
->EventCode
== POWER_FORCE_TRIGGER_RESET
)
106 poAction
= PowerActionNone
;
108 else if (Policy
->EventCode
== POWER_USER_NOTIFY_BUTTON
)
110 poAction
= PowerActionWarmEject
;
112 else if (Policy
->EventCode
== POWER_USER_NOTIFY_SHUTDOWN
)
114 poAction
= PowerActionShutdown
;
120 poAction
= Policy
->Action
;
127 ShowCurrentPowerActionPolicy(HWND hDlgCtrl
,
128 POWER_ACTION
*lpAction
,
130 POWER_ACTION_POLICY
*Policy
)
133 POWER_ACTION poAction
;
135 poAction
= GetPowerActionFromPolicy(Policy
);
136 poActionIndex
= FindActionIndex(lpAction
, dwActionSize
, poAction
);
138 if (poActionIndex
< 0)
143 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)poActionIndex
, (LPARAM
)0);
147 SaveCurrentPowerActionPolicy(IN HWND hDlgCtrl
,
148 OUT POWER_ACTION_POLICY
*Policy
)
153 Index
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
157 ItemData
= SendMessage(hDlgCtrl
, CB_GETITEMDATA
, (WPARAM
)Index
, 0);
158 if (ItemData
== CB_ERR
)
163 case PowerActionNone
:
164 Policy
->Action
= PowerActionNone
;
165 Policy
->EventCode
= POWER_FORCE_TRIGGER_RESET
;
167 case PowerActionWarmEject
:
168 Policy
->Action
= PowerActionNone
;
169 Policy
->EventCode
= POWER_USER_NOTIFY_BUTTON
;
171 case PowerActionShutdown
:
172 Policy
->Action
= PowerActionNone
;
173 Policy
->EventCode
= POWER_USER_NOTIFY_SHUTDOWN
;
175 case PowerActionSleep
:
176 case PowerActionHibernate
:
177 Policy
->Action
= (POWER_ACTION
)ItemData
;
178 Policy
->EventCode
= 0;
183 Policy
->Flags
= (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
);
191 //-------------------------------------------------------------------
194 ShowCurrentPowerActionPolicies(HWND hwndDlg
)
196 TCHAR szAction
[MAX_PATH
];
198 if (!IsBatteryUsed())
201 /* expiremental code */
202 // ShowCurrentPowerButtonAcAction(hList2,
203 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
205 sizeof(g_SystemBatteries
) / sizeof(POWER_ACTION
),
206 &gGPP
.user
.LidCloseAc
);
208 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseAc
.Action
, szAction
, MAX_PATH
))
210 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
216 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
218 sizeof(g_PowerButton
) / sizeof(POWER_ACTION
),
219 &gGPP
.user
.PowerButtonAc
);
222 /* expiremental code */
223 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
225 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
226 &gGPP
.user
.SleepButtonAc
);
228 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonAc
.Action
, szAction
, MAX_PATH
))
230 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
241 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
),
243 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
244 &gGPP
.user
.LidCloseDc
);
246 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
248 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
249 &gGPP
.user
.PowerButtonDc
);
251 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
253 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
254 &gGPP
.user
.SleepButtonDc
);
256 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseDc
.Action
, szAction
, MAX_PATH
))
258 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
263 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.PowerButtonDc
.Action
, szAction
, MAX_PATH
))
265 SendDlgItemMessage(hwndDlg
, IDC_POWERBUTTON
,
270 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonDc
.Action
, szAction
, MAX_PATH
))
272 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
288 BOOLEAN bSuspend
= FALSE
;
292 SYSTEM_POWER_CAPABILITIES spc
;
295 IDC_SYSTRAYBATTERYMETER
,
296 gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
? BST_CHECKED
: BST_UNCHECKED
);
299 gGPP
.user
.GlobalFlags
& EnablePasswordLogon
? BST_CHECKED
: BST_UNCHECKED
);
302 gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
? BST_CHECKED
: BST_UNCHECKED
);
304 GetPwrCapabilities(&spc
);
306 if (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
)
309 bHibernate
= spc
.HiberFilePresent
;
310 bShutdown
= spc
.SystemS5
;
312 hList1
= GetDlgItem(hAdv
, IDC_LIDCLOSE
);
313 SendMessage(hList1
, CB_RESETCONTENT
, 0, 0);
315 memset(g_SystemBatteries
, 0x0, sizeof(g_SystemBatteries
));
316 if (spc
.SystemBatteriesPresent
)
318 AddItem(hList1
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SystemBatteries
);
322 AddItem(hList1
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SystemBatteries
);
327 AddItem(hList1
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SystemBatteries
);
332 ShowWindow(GetDlgItem(hAdv
, IDC_VIDEODIMDISPLAY
), FALSE
);
333 ShowWindow(GetDlgItem(hAdv
, IDC_SLIDCLOSE
), FALSE
);
334 ShowWindow(hList1
, FALSE
);
337 hList2
= GetDlgItem(hAdv
, IDC_POWERBUTTON
);
338 SendMessage(hList2
, CB_RESETCONTENT
, 0, 0);
340 memset(g_PowerButton
, 0x0, sizeof(g_PowerButton
));
341 if (spc
.PowerButtonPresent
)
343 AddItem(hList2
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_PowerButton
);
344 AddItem(hList2
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_PowerButton
);
348 AddItem(hList2
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_PowerButton
);
353 AddItem(hList2
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_PowerButton
);
358 AddItem(hList2
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_PowerButton
);
363 ShowWindow(GetDlgItem(hAdv
, IDC_SPOWERBUTTON
), FALSE
);
364 ShowWindow(hList2
, FALSE
);
367 hList3
=GetDlgItem(hAdv
, IDC_SLEEPBUTTON
);
368 SendMessage(hList3
, CB_RESETCONTENT
, 0, 0);
369 memset(g_SleepButton
, 0x0, sizeof(g_SleepButton
));
371 if (spc
.SleepButtonPresent
)
373 AddItem(hList3
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SleepButton
);
374 AddItem(hList3
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_SleepButton
);
378 AddItem(hList3
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SleepButton
);
383 AddItem(hList3
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SleepButton
);
388 AddItem(hList3
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_SleepButton
);
393 ShowWindow(GetDlgItem(hAdv
, IDC_SSLEEPBUTTON
), FALSE
);
394 ShowWindow(hList3
, FALSE
);
397 if (ReadGlobalPwrPolicy(&gGPP
))
399 ShowCurrentPowerActionPolicies(hAdv
);
405 Adv_SaveData(HWND hwndDlg
)
407 BOOL bSystrayBatteryMeter
;
409 BOOL bVideoDimDisplay
;
411 bSystrayBatteryMeter
=
412 (IsDlgButtonChecked(hwndDlg
, IDC_SYSTRAYBATTERYMETER
) == BST_CHECKED
);
415 (IsDlgButtonChecked(hwndDlg
, IDC_PASSWORDLOGON
) == BST_CHECKED
);
418 (IsDlgButtonChecked(hwndDlg
, IDC_VIDEODIMDISPLAY
) == BST_CHECKED
);
420 if (bSystrayBatteryMeter
)
422 if (!(gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
424 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableSysTrayBatteryMeter
;
429 if ((gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
431 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableSysTrayBatteryMeter
;
437 if (!(gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
439 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnablePasswordLogon
;
444 if ((gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
446 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnablePasswordLogon
;
450 if (bVideoDimDisplay
)
452 if (!(gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
454 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableVideoDimDisplay
;
459 if ((gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
461 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableVideoDimDisplay
;
465 if (!IsBatteryUsed())
467 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonAc
);
469 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseAc
);
470 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonAc
);
476 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonDc
);
477 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseDc
);
478 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonDc
);
482 if (!WriteGlobalPwrPolicy(&gGPP
))
484 MessageBox(hwndDlg
, L
"WriteGlobalPwrPolicy failed", NULL
, MB_OK
);
490 /* Property page dialog callback */
492 AdvancedDlgProc(HWND hwndDlg
,
505 switch(LOWORD(wParam
))
507 case IDC_SYSTRAYBATTERYMETER
:
508 case IDC_PASSWORDLOGON
:
509 case IDC_VIDEODIMDISPLAY
:
510 if (HIWORD(wParam
) == BN_CLICKED
)
512 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
516 case IDC_POWERBUTTON
:
517 case IDC_SLEEPBUTTON
:
518 if (HIWORD(wParam
) == CBN_SELCHANGE
)
520 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
527 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
528 if (lpnm
->code
== (UINT
)PSN_APPLY
)
530 Adv_SaveData(hwndDlg
);