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)
14 static POWER_ACTION g_SystemBatteries
[3];
15 static POWER_ACTION g_PowerButton
[5];
16 static POWER_ACTION g_SleepButton
[5];
21 SetSystrayPowerIconState(BOOL bEnabled
)
25 hwndTaskBar
= FindWindowW(L
"SystemTray_Main", NULL
);
26 if (hwndTaskBar
== NULL
)
29 SendMessageW(hwndTaskBar
, WM_USER
+ 220, 1, bEnabled
);
34 GetSystrayPowerIconState(VOID
)
38 hwndTaskBar
= FindWindowW(L
"SystemTray_Main", NULL
);
39 if (hwndTaskBar
== NULL
)
42 return (BOOL
)SendMessageW(hwndTaskBar
, WM_USER
+ 221, 1, 0);
46 AddItem(HWND hDlgCtrl
, INT ResourceId
, LPARAM lParam
, POWER_ACTION
* lpAction
)
48 TCHAR szBuffer
[MAX_PATH
];
51 if (LoadString(hApplet
, ResourceId
, szBuffer
, MAX_PATH
) < MAX_PATH
)
53 Index
= SendMessage(hDlgCtrl
, CB_INSERTSTRING
, -1, (LPARAM
)szBuffer
);
56 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)Index
, lParam
);
57 lpAction
[Index
] = (POWER_ACTION
)lParam
;
63 FindActionIndex(POWER_ACTION
* lpAction
, DWORD dwActionSize
, POWER_ACTION poAction
)
67 for (Index
= 0; Index
< (INT
)dwActionSize
; Index
++)
69 if (lpAction
[Index
] == poAction
)
79 SYSTEM_BATTERY_STATE sbs
;
81 if (CallNtPowerInformation(SystemBatteryState
,NULL
, (ULONG
)0, &sbs
, sizeof(SYSTEM_BATTERY_STATE
)) == STATUS_SUCCESS
)
83 if (sbs
.BatteryPresent
)
97 GetPowerActionFromPolicy(POWER_ACTION_POLICY
*Policy
)
99 POWER_ACTION poAction
= PowerActionNone
;
102 TCHAR szBuffer[MAX_PATH];
104 // Note: Windows XP SP2+ does not return the PowerAction code
105 // for PowerActionWarmEject + PowerActionShutdown but sets it
106 // to PowerActionNone and sets the Flags & EventCode
109 _stprintf(szBuffer, L"Action: %x EventCode %x Flags %x",Policy->Action, Policy->EventCode, Policy->Flags);
110 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
114 if (Policy
->Action
== PowerActionNone
)
116 if (Policy
->Flags
== (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
))
118 if (Policy
->EventCode
== POWER_FORCE_TRIGGER_RESET
)
120 poAction
= PowerActionNone
;
122 else if (Policy
->EventCode
== POWER_USER_NOTIFY_BUTTON
)
124 poAction
= PowerActionWarmEject
;
126 else if (Policy
->EventCode
== POWER_USER_NOTIFY_SHUTDOWN
)
128 poAction
= PowerActionShutdown
;
134 poAction
= Policy
->Action
;
141 ShowCurrentPowerActionPolicy(HWND hDlgCtrl
,
142 POWER_ACTION
*lpAction
,
144 POWER_ACTION_POLICY
*Policy
)
147 POWER_ACTION poAction
;
149 poAction
= GetPowerActionFromPolicy(Policy
);
150 poActionIndex
= FindActionIndex(lpAction
, dwActionSize
, poAction
);
152 if (poActionIndex
< 0)
157 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)poActionIndex
, (LPARAM
)0);
161 SaveCurrentPowerActionPolicy(IN HWND hDlgCtrl
,
162 OUT POWER_ACTION_POLICY
*Policy
)
167 Index
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
171 ItemData
= SendMessage(hDlgCtrl
, CB_GETITEMDATA
, (WPARAM
)Index
, 0);
172 if (ItemData
== CB_ERR
)
177 case PowerActionNone
:
178 Policy
->Action
= PowerActionNone
;
179 Policy
->EventCode
= POWER_FORCE_TRIGGER_RESET
;
182 case PowerActionWarmEject
:
183 Policy
->Action
= PowerActionNone
;
184 Policy
->EventCode
= POWER_USER_NOTIFY_BUTTON
;
187 case PowerActionShutdown
:
188 Policy
->Action
= PowerActionNone
;
189 Policy
->EventCode
= POWER_USER_NOTIFY_SHUTDOWN
;
192 case PowerActionSleep
:
193 case PowerActionHibernate
:
194 Policy
->Action
= (POWER_ACTION
)ItemData
;
195 Policy
->EventCode
= 0;
202 Policy
->Flags
= (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
);
208 //-------------------------------------------------------------------
211 ShowCurrentPowerActionPolicies(HWND hwndDlg
)
213 TCHAR szAction
[MAX_PATH
];
215 if (!IsBatteryUsed())
218 /* experimental code */
219 // ShowCurrentPowerButtonAcAction(hList2,
220 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
222 sizeof(g_SystemBatteries
) / sizeof(POWER_ACTION
),
223 &gGPP
.user
.LidCloseAc
);
225 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseAc
.Action
, szAction
, MAX_PATH
))
227 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
233 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
235 sizeof(g_PowerButton
) / sizeof(POWER_ACTION
),
236 &gGPP
.user
.PowerButtonAc
);
239 /* experimental code */
240 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
242 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
243 &gGPP
.user
.SleepButtonAc
);
245 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonAc
.Action
, szAction
, MAX_PATH
))
247 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
258 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
),
260 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
261 &gGPP
.user
.LidCloseDc
);
263 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
265 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
266 &gGPP
.user
.PowerButtonDc
);
268 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
270 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
271 &gGPP
.user
.SleepButtonDc
);
273 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseDc
.Action
, szAction
, MAX_PATH
))
275 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
280 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.PowerButtonDc
.Action
, szAction
, MAX_PATH
))
282 SendDlgItemMessage(hwndDlg
, IDC_POWERBUTTON
,
287 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonDc
.Action
, szAction
, MAX_PATH
))
289 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
306 BOOLEAN bSuspend
= FALSE
;
311 SYSTEM_POWER_CAPABILITIES spc
;
313 bEnabled
= GetSystrayPowerIconState();
316 gGPP
.user
.GlobalFlags
|= EnableSysTrayBatteryMeter
;
318 gGPP
.user
.GlobalFlags
&= ~EnableSysTrayBatteryMeter
;
320 CheckDlgButton(hwndDlg
,
321 IDC_SYSTRAYBATTERYMETER
,
322 bEnabled
? BST_CHECKED
: BST_UNCHECKED
);
323 CheckDlgButton(hwndDlg
,
325 gGPP
.user
.GlobalFlags
& EnablePasswordLogon
? BST_CHECKED
: BST_UNCHECKED
);
326 CheckDlgButton(hwndDlg
,
328 gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
? BST_CHECKED
: BST_UNCHECKED
);
330 GetPwrCapabilities(&spc
);
332 if (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
)
335 bHibernate
= spc
.HiberFilePresent
;
336 bShutdown
= spc
.SystemS5
;
338 hList1
= GetDlgItem(hwndDlg
, IDC_LIDCLOSE
);
339 SendMessage(hList1
, CB_RESETCONTENT
, 0, 0);
341 memset(g_SystemBatteries
, 0x0, sizeof(g_SystemBatteries
));
342 if (spc
.SystemBatteriesPresent
)
344 AddItem(hList1
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SystemBatteries
);
348 AddItem(hList1
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SystemBatteries
);
353 AddItem(hList1
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SystemBatteries
);
358 ShowWindow(GetDlgItem(hwndDlg
, IDC_VIDEODIMDISPLAY
), FALSE
);
359 ShowWindow(GetDlgItem(hwndDlg
, IDC_SLIDCLOSE
), FALSE
);
360 ShowWindow(hList1
, FALSE
);
363 hList2
= GetDlgItem(hwndDlg
, IDC_POWERBUTTON
);
364 SendMessage(hList2
, CB_RESETCONTENT
, 0, 0);
366 memset(g_PowerButton
, 0x0, sizeof(g_PowerButton
));
367 if (spc
.PowerButtonPresent
)
369 AddItem(hList2
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_PowerButton
);
370 AddItem(hList2
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_PowerButton
);
374 AddItem(hList2
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_PowerButton
);
379 AddItem(hList2
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_PowerButton
);
384 AddItem(hList2
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_PowerButton
);
389 ShowWindow(GetDlgItem(hwndDlg
, IDC_SPOWERBUTTON
), FALSE
);
390 ShowWindow(hList2
, FALSE
);
393 hList3
= GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
);
394 SendMessage(hList3
, CB_RESETCONTENT
, 0, 0);
395 memset(g_SleepButton
, 0x0, sizeof(g_SleepButton
));
397 if (spc
.SleepButtonPresent
)
399 AddItem(hList3
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SleepButton
);
400 AddItem(hList3
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_SleepButton
);
404 AddItem(hList3
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SleepButton
);
409 AddItem(hList3
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SleepButton
);
414 AddItem(hList3
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_SleepButton
);
419 ShowWindow(GetDlgItem(hwndDlg
, IDC_SSLEEPBUTTON
), FALSE
);
420 ShowWindow(hList3
, FALSE
);
423 if (ReadGlobalPwrPolicy(&gGPP
))
425 ShowCurrentPowerActionPolicies(hwndDlg
);
430 Adv_SaveData(HWND hwndDlg
)
432 BOOL bSystrayBatteryMeter
;
434 BOOL bVideoDimDisplay
;
436 bSystrayBatteryMeter
=
437 (IsDlgButtonChecked(hwndDlg
, IDC_SYSTRAYBATTERYMETER
) == BST_CHECKED
);
440 (IsDlgButtonChecked(hwndDlg
, IDC_PASSWORDLOGON
) == BST_CHECKED
);
443 (IsDlgButtonChecked(hwndDlg
, IDC_VIDEODIMDISPLAY
) == BST_CHECKED
);
445 if (bSystrayBatteryMeter
)
447 if (!(gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
449 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableSysTrayBatteryMeter
;
454 if ((gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
456 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableSysTrayBatteryMeter
;
462 if (!(gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
464 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnablePasswordLogon
;
469 if ((gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
471 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnablePasswordLogon
;
475 if (bVideoDimDisplay
)
477 if (!(gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
479 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableVideoDimDisplay
;
484 if ((gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
486 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableVideoDimDisplay
;
490 if (!IsBatteryUsed())
493 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseAc
);
495 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonAc
);
496 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonAc
);
501 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseDc
);
502 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonDc
);
503 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonDc
);
507 if (!WriteGlobalPwrPolicy(&gGPP
))
509 MessageBox(hwndDlg
, L
"WriteGlobalPwrPolicy failed", NULL
, MB_OK
);
512 SetSystrayPowerIconState(bSystrayBatteryMeter
);
514 // Adv_InitDialog(hwndDlg);
517 /* Property page dialog callback */
519 AdvancedDlgProc(HWND hwndDlg
,
527 Adv_InitDialog(hwndDlg
);
531 switch (LOWORD(wParam
))
533 case IDC_SYSTRAYBATTERYMETER
:
534 case IDC_PASSWORDLOGON
:
535 case IDC_VIDEODIMDISPLAY
:
536 if (HIWORD(wParam
) == BN_CLICKED
)
538 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
543 case IDC_POWERBUTTON
:
544 case IDC_SLEEPBUTTON
:
545 if (HIWORD(wParam
) == CBN_SELCHANGE
)
547 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
554 switch (((LPNMHDR
)lParam
)->code
)
557 Adv_SaveData(hwndDlg
);
561 Adv_InitDialog(hwndDlg
);