2 * PROJECT: ReactOS Power Configuration Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/powercfg/advanced.c
5 * PURPOSE: advanced tab of applet
6 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net)
7 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 * Dmitry Chapyshev (lentind@yandex.ru)
16 static POWER_ACTION g_SystemBatteries
[3];
17 static POWER_ACTION g_PowerButton
[5];
18 static POWER_ACTION g_SleepButton
[5];
22 AddItem(HWND hDlgCtrl
, INT ResourceId
, LPARAM lParam
, POWER_ACTION
* lpAction
)
24 TCHAR szBuffer
[MAX_PATH
];
26 if (LoadString(hApplet
, ResourceId
, szBuffer
, MAX_PATH
) < MAX_PATH
)
28 Index
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
31 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)Index
, lParam
);
32 lpAction
[Index
] = (POWER_ACTION
)lParam
;
38 FindActionIndex(POWER_ACTION
* lpAction
, DWORD dwActionSize
, POWER_ACTION poAction
)
42 for (Index
= 0; Index
< (INT
)dwActionSize
; Index
++)
44 if (lpAction
[Index
] == poAction
)
54 SYSTEM_BATTERY_STATE sbs
;
56 if (CallNtPowerInformation(SystemBatteryState
,NULL
, (ULONG
)0, &sbs
, sizeof(SYSTEM_BATTERY_STATE
)) == STATUS_SUCCESS
)
58 if (sbs
.BatteryPresent
)
72 GetPowerActionFromPolicy(POWER_ACTION_POLICY
*Policy
)
74 POWER_ACTION poAction
= PowerActionNone
;
77 TCHAR szBuffer[MAX_PATH];
79 // Note: Windows XP SP2+ does not return the PowerAction code
80 // for PowerActionWarmEject + PowerActionShutdown but sets it
81 // to PowerActionNone and sets the Flags & EventCode
84 _stprintf(szBuffer, L"Action: %x EventCode %x Flags %x",Policy->Action, Policy->EventCode, Policy->Flags);
85 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
89 if (Policy
->Action
== PowerActionNone
)
91 if (Policy
->Flags
== (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
))
93 if (Policy
->EventCode
== POWER_FORCE_TRIGGER_RESET
)
95 poAction
= PowerActionNone
;
97 else if (Policy
->EventCode
== POWER_USER_NOTIFY_BUTTON
)
99 poAction
= PowerActionWarmEject
;
101 else if (Policy
->EventCode
== POWER_USER_NOTIFY_SHUTDOWN
)
103 poAction
= PowerActionShutdown
;
109 poAction
= Policy
->Action
;
116 ShowCurrentPowerActionPolicy(HWND hDlgCtrl
,
117 POWER_ACTION
*lpAction
,
119 POWER_ACTION_POLICY
*Policy
)
122 POWER_ACTION poAction
;
124 poAction
= GetPowerActionFromPolicy(Policy
);
125 poActionIndex
= FindActionIndex(lpAction
, dwActionSize
, poAction
);
127 if (poActionIndex
< 0)
132 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)poActionIndex
, (LPARAM
)0);
136 SaveCurrentPowerActionPolicy(IN HWND hDlgCtrl
,
137 OUT POWER_ACTION_POLICY
*Policy
)
142 Index
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
146 ItemData
= SendMessage(hDlgCtrl
, CB_GETITEMDATA
, (WPARAM
)Index
, 0);
147 if (ItemData
== CB_ERR
)
152 case PowerActionNone
:
153 Policy
->Action
= PowerActionNone
;
154 Policy
->EventCode
= POWER_FORCE_TRIGGER_RESET
;
156 case PowerActionWarmEject
:
157 Policy
->Action
= PowerActionNone
;
158 Policy
->EventCode
= POWER_USER_NOTIFY_BUTTON
;
160 case PowerActionShutdown
:
161 Policy
->Action
= PowerActionNone
;
162 Policy
->EventCode
= POWER_USER_NOTIFY_SHUTDOWN
;
164 case PowerActionSleep
:
165 case PowerActionHibernate
:
166 Policy
->Action
= (POWER_ACTION
)ItemData
;
167 Policy
->EventCode
= 0;
172 Policy
->Flags
= (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
);
178 //-------------------------------------------------------------------
181 ShowCurrentPowerActionPolicies(HWND hwndDlg
)
183 TCHAR szAction
[MAX_PATH
];
185 if (!IsBatteryUsed())
188 /* expiremental code */
189 // ShowCurrentPowerButtonAcAction(hList2,
190 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
192 sizeof(g_SystemBatteries
) / sizeof(POWER_ACTION
),
193 &gGPP
.user
.LidCloseAc
);
195 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseAc
.Action
, szAction
, MAX_PATH
))
197 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
203 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
205 sizeof(g_PowerButton
) / sizeof(POWER_ACTION
),
206 &gGPP
.user
.PowerButtonAc
);
209 /* expiremental code */
210 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
212 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
213 &gGPP
.user
.SleepButtonAc
);
215 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonAc
.Action
, szAction
, MAX_PATH
))
217 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
228 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
),
230 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
231 &gGPP
.user
.LidCloseDc
);
233 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
235 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
236 &gGPP
.user
.PowerButtonDc
);
238 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
240 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
241 &gGPP
.user
.SleepButtonDc
);
243 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseDc
.Action
, szAction
, MAX_PATH
))
245 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
250 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.PowerButtonDc
.Action
, szAction
, MAX_PATH
))
252 SendDlgItemMessage(hwndDlg
, IDC_POWERBUTTON
,
257 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonDc
.Action
, szAction
, MAX_PATH
))
259 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
275 BOOLEAN bSuspend
= FALSE
;
279 SYSTEM_POWER_CAPABILITIES spc
;
282 IDC_SYSTRAYBATTERYMETER
,
283 gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
? BST_CHECKED
: BST_UNCHECKED
);
286 gGPP
.user
.GlobalFlags
& EnablePasswordLogon
? BST_CHECKED
: BST_UNCHECKED
);
289 gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
? BST_CHECKED
: BST_UNCHECKED
);
291 GetPwrCapabilities(&spc
);
293 if (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
)
296 bHibernate
= spc
.HiberFilePresent
;
297 bShutdown
= spc
.SystemS5
;
299 hList1
= GetDlgItem(hAdv
, IDC_LIDCLOSE
);
300 SendMessage(hList1
, CB_RESETCONTENT
, 0, 0);
302 memset(g_SystemBatteries
, 0x0, sizeof(g_SystemBatteries
));
303 if (spc
.SystemBatteriesPresent
)
305 AddItem(hList1
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SystemBatteries
);
309 AddItem(hList1
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SystemBatteries
);
314 AddItem(hList1
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SystemBatteries
);
319 ShowWindow(GetDlgItem(hAdv
, IDC_VIDEODIMDISPLAY
), FALSE
);
320 ShowWindow(GetDlgItem(hAdv
, IDC_SLIDCLOSE
), FALSE
);
321 ShowWindow(hList1
, FALSE
);
324 hList2
= GetDlgItem(hAdv
, IDC_POWERBUTTON
);
325 SendMessage(hList2
, CB_RESETCONTENT
, 0, 0);
327 memset(g_PowerButton
, 0x0, sizeof(g_PowerButton
));
328 if (spc
.PowerButtonPresent
)
330 AddItem(hList2
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_PowerButton
);
331 AddItem(hList2
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_PowerButton
);
335 AddItem(hList2
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_PowerButton
);
340 AddItem(hList2
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_PowerButton
);
345 AddItem(hList2
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_PowerButton
);
350 ShowWindow(GetDlgItem(hAdv
, IDC_SPOWERBUTTON
), FALSE
);
351 ShowWindow(hList2
, FALSE
);
354 hList3
=GetDlgItem(hAdv
, IDC_SLEEPBUTTON
);
355 SendMessage(hList3
, CB_RESETCONTENT
, 0, 0);
356 memset(g_SleepButton
, 0x0, sizeof(g_SleepButton
));
358 if (spc
.SleepButtonPresent
)
360 AddItem(hList3
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SleepButton
);
361 AddItem(hList3
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_SleepButton
);
365 AddItem(hList3
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SleepButton
);
370 AddItem(hList3
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SleepButton
);
375 AddItem(hList3
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_SleepButton
);
380 ShowWindow(GetDlgItem(hAdv
, IDC_SSLEEPBUTTON
), FALSE
);
381 ShowWindow(hList3
, FALSE
);
384 if (ReadGlobalPwrPolicy(&gGPP
))
386 ShowCurrentPowerActionPolicies(hAdv
);
391 Adv_SaveData(HWND hwndDlg
)
393 BOOL bSystrayBatteryMeter
;
395 BOOL bVideoDimDisplay
;
397 bSystrayBatteryMeter
=
398 (IsDlgButtonChecked(hwndDlg
, IDC_SYSTRAYBATTERYMETER
) == BST_CHECKED
);
401 (IsDlgButtonChecked(hwndDlg
, IDC_PASSWORDLOGON
) == BST_CHECKED
);
404 (IsDlgButtonChecked(hwndDlg
, IDC_VIDEODIMDISPLAY
) == BST_CHECKED
);
406 if (bSystrayBatteryMeter
)
408 if (!(gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
410 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableSysTrayBatteryMeter
;
415 if ((gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
417 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableSysTrayBatteryMeter
;
423 if (!(gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
425 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnablePasswordLogon
;
430 if ((gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
432 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnablePasswordLogon
;
436 if (bVideoDimDisplay
)
438 if (!(gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
440 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableVideoDimDisplay
;
445 if ((gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
447 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableVideoDimDisplay
;
451 if (!IsBatteryUsed())
453 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonAc
);
455 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseAc
);
456 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonAc
);
462 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonDc
);
463 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseDc
);
464 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonDc
);
468 if (!WriteGlobalPwrPolicy(&gGPP
))
470 MessageBox(hwndDlg
, L
"WriteGlobalPwrPolicy failed", NULL
, MB_OK
);
476 /* Property page dialog callback */
478 AdvancedDlgProc(HWND hwndDlg
,
491 switch(LOWORD(wParam
))
493 case IDC_SYSTRAYBATTERYMETER
:
494 case IDC_PASSWORDLOGON
:
495 case IDC_VIDEODIMDISPLAY
:
496 if (HIWORD(wParam
) == BN_CLICKED
)
498 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
502 case IDC_POWERBUTTON
:
503 case IDC_SLEEPBUTTON
:
504 if (HIWORD(wParam
) == CBN_SELCHANGE
)
506 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
513 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
514 if (lpnm
->code
== (UINT
)PSN_APPLY
)
516 Adv_SaveData(hwndDlg
);