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];
23 SetSystrayPowerIconState(BOOL bEnabled
)
27 hwndTaskBar
= FindWindowW(L
"SystemTray_Main", NULL
);
28 if (hwndTaskBar
== NULL
)
31 SendMessageW(hwndTaskBar
, WM_USER
+ 220, 1, bEnabled
);
36 GetSystrayPowerIconState(VOID
)
40 hwndTaskBar
= FindWindowW(L
"SystemTray_Main", NULL
);
41 if (hwndTaskBar
== NULL
)
44 return (BOOL
)SendMessageW(hwndTaskBar
, WM_USER
+ 221, 1, 0);
48 AddItem(HWND hDlgCtrl
, INT ResourceId
, LPARAM lParam
, POWER_ACTION
* lpAction
)
50 TCHAR szBuffer
[MAX_PATH
];
53 if (LoadString(hApplet
, ResourceId
, szBuffer
, MAX_PATH
) < MAX_PATH
)
55 Index
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
58 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)Index
, lParam
);
59 lpAction
[Index
] = (POWER_ACTION
)lParam
;
65 FindActionIndex(POWER_ACTION
* lpAction
, DWORD dwActionSize
, POWER_ACTION poAction
)
69 for (Index
= 0; Index
< (INT
)dwActionSize
; Index
++)
71 if (lpAction
[Index
] == poAction
)
81 SYSTEM_BATTERY_STATE sbs
;
83 if (CallNtPowerInformation(SystemBatteryState
,NULL
, (ULONG
)0, &sbs
, sizeof(SYSTEM_BATTERY_STATE
)) == STATUS_SUCCESS
)
85 if (sbs
.BatteryPresent
)
99 GetPowerActionFromPolicy(POWER_ACTION_POLICY
*Policy
)
101 POWER_ACTION poAction
= PowerActionNone
;
104 TCHAR szBuffer[MAX_PATH];
106 // Note: Windows XP SP2+ does not return the PowerAction code
107 // for PowerActionWarmEject + PowerActionShutdown but sets it
108 // to PowerActionNone and sets the Flags & EventCode
111 _stprintf(szBuffer, L"Action: %x EventCode %x Flags %x",Policy->Action, Policy->EventCode, Policy->Flags);
112 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
116 if (Policy
->Action
== PowerActionNone
)
118 if (Policy
->Flags
== (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
))
120 if (Policy
->EventCode
== POWER_FORCE_TRIGGER_RESET
)
122 poAction
= PowerActionNone
;
124 else if (Policy
->EventCode
== POWER_USER_NOTIFY_BUTTON
)
126 poAction
= PowerActionWarmEject
;
128 else if (Policy
->EventCode
== POWER_USER_NOTIFY_SHUTDOWN
)
130 poAction
= PowerActionShutdown
;
136 poAction
= Policy
->Action
;
143 ShowCurrentPowerActionPolicy(HWND hDlgCtrl
,
144 POWER_ACTION
*lpAction
,
146 POWER_ACTION_POLICY
*Policy
)
149 POWER_ACTION poAction
;
151 poAction
= GetPowerActionFromPolicy(Policy
);
152 poActionIndex
= FindActionIndex(lpAction
, dwActionSize
, poAction
);
154 if (poActionIndex
< 0)
159 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)poActionIndex
, (LPARAM
)0);
163 SaveCurrentPowerActionPolicy(IN HWND hDlgCtrl
,
164 OUT POWER_ACTION_POLICY
*Policy
)
169 Index
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
173 ItemData
= SendMessage(hDlgCtrl
, CB_GETITEMDATA
, (WPARAM
)Index
, 0);
174 if (ItemData
== CB_ERR
)
179 case PowerActionNone
:
180 Policy
->Action
= PowerActionNone
;
181 Policy
->EventCode
= POWER_FORCE_TRIGGER_RESET
;
184 case PowerActionWarmEject
:
185 Policy
->Action
= PowerActionNone
;
186 Policy
->EventCode
= POWER_USER_NOTIFY_BUTTON
;
189 case PowerActionShutdown
:
190 Policy
->Action
= PowerActionNone
;
191 Policy
->EventCode
= POWER_USER_NOTIFY_SHUTDOWN
;
194 case PowerActionSleep
:
195 case PowerActionHibernate
:
196 Policy
->Action
= (POWER_ACTION
)ItemData
;
197 Policy
->EventCode
= 0;
204 Policy
->Flags
= (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
);
210 //-------------------------------------------------------------------
213 ShowCurrentPowerActionPolicies(HWND hwndDlg
)
215 TCHAR szAction
[MAX_PATH
];
217 if (!IsBatteryUsed())
220 /* experimental code */
221 // ShowCurrentPowerButtonAcAction(hList2,
222 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
224 sizeof(g_SystemBatteries
) / sizeof(POWER_ACTION
),
225 &gGPP
.user
.LidCloseAc
);
227 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseAc
.Action
, szAction
, MAX_PATH
))
229 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
235 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
237 sizeof(g_PowerButton
) / sizeof(POWER_ACTION
),
238 &gGPP
.user
.PowerButtonAc
);
241 /* experimental code */
242 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
244 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
245 &gGPP
.user
.SleepButtonAc
);
247 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonAc
.Action
, szAction
, MAX_PATH
))
249 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
260 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
),
262 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
263 &gGPP
.user
.LidCloseDc
);
265 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
267 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
268 &gGPP
.user
.PowerButtonDc
);
270 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
272 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
273 &gGPP
.user
.SleepButtonDc
);
275 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseDc
.Action
, szAction
, MAX_PATH
))
277 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
282 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.PowerButtonDc
.Action
, szAction
, MAX_PATH
))
284 SendDlgItemMessage(hwndDlg
, IDC_POWERBUTTON
,
289 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonDc
.Action
, szAction
, MAX_PATH
))
291 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
307 BOOLEAN bSuspend
= FALSE
;
312 SYSTEM_POWER_CAPABILITIES spc
;
314 bEnabled
= GetSystrayPowerIconState();
317 gGPP
.user
.GlobalFlags
|= EnableSysTrayBatteryMeter
;
319 gGPP
.user
.GlobalFlags
&= ~EnableSysTrayBatteryMeter
;
322 IDC_SYSTRAYBATTERYMETER
,
323 bEnabled
? BST_CHECKED
: BST_UNCHECKED
);
326 gGPP
.user
.GlobalFlags
& EnablePasswordLogon
? BST_CHECKED
: BST_UNCHECKED
);
329 gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
? BST_CHECKED
: BST_UNCHECKED
);
331 GetPwrCapabilities(&spc
);
333 if (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
)
336 bHibernate
= spc
.HiberFilePresent
;
337 bShutdown
= spc
.SystemS5
;
339 hList1
= GetDlgItem(hAdv
, IDC_LIDCLOSE
);
340 SendMessage(hList1
, CB_RESETCONTENT
, 0, 0);
342 memset(g_SystemBatteries
, 0x0, sizeof(g_SystemBatteries
));
343 if (spc
.SystemBatteriesPresent
)
345 AddItem(hList1
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SystemBatteries
);
349 AddItem(hList1
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SystemBatteries
);
354 AddItem(hList1
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SystemBatteries
);
359 ShowWindow(GetDlgItem(hAdv
, IDC_VIDEODIMDISPLAY
), FALSE
);
360 ShowWindow(GetDlgItem(hAdv
, IDC_SLIDCLOSE
), FALSE
);
361 ShowWindow(hList1
, FALSE
);
364 hList2
= GetDlgItem(hAdv
, IDC_POWERBUTTON
);
365 SendMessage(hList2
, CB_RESETCONTENT
, 0, 0);
367 memset(g_PowerButton
, 0x0, sizeof(g_PowerButton
));
368 if (spc
.PowerButtonPresent
)
370 AddItem(hList2
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_PowerButton
);
371 AddItem(hList2
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_PowerButton
);
375 AddItem(hList2
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_PowerButton
);
380 AddItem(hList2
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_PowerButton
);
385 AddItem(hList2
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_PowerButton
);
390 ShowWindow(GetDlgItem(hAdv
, IDC_SPOWERBUTTON
), FALSE
);
391 ShowWindow(hList2
, FALSE
);
394 hList3
= GetDlgItem(hAdv
, IDC_SLEEPBUTTON
);
395 SendMessage(hList3
, CB_RESETCONTENT
, 0, 0);
396 memset(g_SleepButton
, 0x0, sizeof(g_SleepButton
));
398 if (spc
.SleepButtonPresent
)
400 AddItem(hList3
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SleepButton
);
401 AddItem(hList3
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_SleepButton
);
405 AddItem(hList3
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SleepButton
);
410 AddItem(hList3
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SleepButton
);
415 AddItem(hList3
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_SleepButton
);
420 ShowWindow(GetDlgItem(hAdv
, IDC_SSLEEPBUTTON
), FALSE
);
421 ShowWindow(hList3
, FALSE
);
424 if (ReadGlobalPwrPolicy(&gGPP
))
426 ShowCurrentPowerActionPolicies(hAdv
);
431 Adv_SaveData(HWND hwndDlg
)
433 BOOL bSystrayBatteryMeter
;
435 BOOL bVideoDimDisplay
;
437 bSystrayBatteryMeter
=
438 (IsDlgButtonChecked(hwndDlg
, IDC_SYSTRAYBATTERYMETER
) == BST_CHECKED
);
441 (IsDlgButtonChecked(hwndDlg
, IDC_PASSWORDLOGON
) == BST_CHECKED
);
444 (IsDlgButtonChecked(hwndDlg
, IDC_VIDEODIMDISPLAY
) == BST_CHECKED
);
446 if (bSystrayBatteryMeter
)
448 if (!(gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
450 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableSysTrayBatteryMeter
;
455 if ((gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
457 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableSysTrayBatteryMeter
;
463 if (!(gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
465 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnablePasswordLogon
;
470 if ((gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
472 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnablePasswordLogon
;
476 if (bVideoDimDisplay
)
478 if (!(gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
480 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableVideoDimDisplay
;
485 if ((gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
487 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableVideoDimDisplay
;
491 if (!IsBatteryUsed())
493 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonAc
);
495 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseAc
);
496 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonAc
);
502 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonDc
);
503 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseDc
);
504 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonDc
);
508 if (!WriteGlobalPwrPolicy(&gGPP
))
510 MessageBox(hwndDlg
, L
"WriteGlobalPwrPolicy failed", NULL
, MB_OK
);
513 SetSystrayPowerIconState(bSystrayBatteryMeter
);
518 /* Property page dialog callback */
520 AdvancedDlgProc(HWND hwndDlg
,
533 switch (LOWORD(wParam
))
535 case IDC_SYSTRAYBATTERYMETER
:
536 case IDC_PASSWORDLOGON
:
537 case IDC_VIDEODIMDISPLAY
:
538 if (HIWORD(wParam
) == BN_CLICKED
)
540 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
545 case IDC_POWERBUTTON
:
546 case IDC_SLEEPBUTTON
:
547 if (HIWORD(wParam
) == CBN_SELCHANGE
)
549 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
557 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
558 if (lpnm
->code
== (UINT
)PSN_APPLY
)
560 Adv_SaveData(hwndDlg
);