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)
13 //typedef long NTSTATUS;
17 #define WIN32_NO_STATUS
26 void Adv_InitDialog();
27 void Adv_SaveData(HWND hwndDlg
);
29 static POWER_ACTION g_SystemBatteries
[3];
30 static POWER_ACTION g_PowerButton
[5];
31 static POWER_ACTION g_SleepButton
[5];
33 /* Property page dialog callback */
50 switch(LOWORD(wParam
))
52 case IDC_SYSTRAYBATTERYMETER
:
53 case IDC_PASSWORDLOGON
:
54 case IDC_VIDEODIMDISPLAY
:
55 if (HIWORD(wParam
) == BN_CLICKED
)
57 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
63 if (HIWORD(wParam
) == CBN_SELCHANGE
)
65 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
72 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
73 if (lpnm
->code
== (UINT
)PSN_APPLY
)
75 Adv_SaveData(hwndDlg
);
83 static void AddItem(HWND hDlgCtrl
, int ResourceId
, LPARAM lParam
, POWER_ACTION
* lpAction
)
85 TCHAR szBuffer
[MAX_PATH
];
87 if (LoadString(hApplet
, ResourceId
, szBuffer
, MAX_PATH
) < MAX_PATH
)
89 Index
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, 0, (LPARAM
)szBuffer
);
92 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)Index
, lParam
);
93 lpAction
[Index
] = (POWER_ACTION
)lParam
;
98 static int FindActionIndex(POWER_ACTION
* lpAction
, DWORD dwActionSize
, POWER_ACTION poAction
)
102 for (Index
= 0; Index
< (int) dwActionSize
; Index
++)
104 if (lpAction
[Index
] == poAction
)
111 static BOOLEAN
IsBatteryUsed()
113 SYSTEM_BATTERY_STATE sbs
;
115 if (CallNtPowerInformation(SystemBatteryState
,NULL
, (ULONG
)0, &sbs
, sizeof(SYSTEM_BATTERY_STATE
)) == STATUS_SUCCESS
)
117 if (sbs
.BatteryPresent
)
130 POWER_ACTION
GetPowerActionFromPolicy(POWER_ACTION_POLICY
* Policy
)
132 POWER_ACTION poAction
= PowerActionNone
;
135 TCHAR szBuffer[MAX_PATH];
137 // Note: Windows XP SP2+ does not return the PowerAction code
138 // for PowerActionWarmEject + PowerActionShutdown but sets it
139 // to PowerActionNone and sets the Flags & EventCode
142 _stprintf(szBuffer, L"Action: %x EventCode %x Flags %x",Policy->Action, Policy->EventCode, Policy->Flags);
143 MessageBoxW(NULL, szBuffer, NULL, MB_OK);
147 if (Policy
->Action
== PowerActionNone
)
149 if (Policy
->Flags
== (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
))
151 if (Policy
->EventCode
== POWER_FORCE_TRIGGER_RESET
)
153 poAction
= PowerActionNone
;
155 else if (Policy
->EventCode
== POWER_USER_NOTIFY_BUTTON
)
157 poAction
= PowerActionWarmEject
;
159 else if (Policy
->EventCode
== POWER_USER_NOTIFY_SHUTDOWN
)
161 poAction
= PowerActionShutdown
;
167 poAction
= Policy
->Action
;
173 void ShowCurrentPowerActionPolicy(HWND hDlgCtrl
,
174 POWER_ACTION
* lpAction
,
176 POWER_ACTION_POLICY
* Policy
)
179 POWER_ACTION poAction
;
181 poAction
= GetPowerActionFromPolicy(Policy
);
182 poActionIndex
= FindActionIndex(lpAction
, dwActionSize
, poAction
);
184 if (poActionIndex
< 0)
189 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)poActionIndex
, (LPARAM
)0);
192 BOOLEAN
SaveCurrentPowerActionPolicy(IN HWND hDlgCtrl
,
193 OUT POWER_ACTION_POLICY
* Policy
)
198 Index
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
202 ItemData
= SendMessage(hDlgCtrl
, CB_GETITEMDATA
, (WPARAM
)Index
, 0);
203 if (ItemData
== CB_ERR
)
208 case PowerActionNone
:
209 Policy
->Action
= PowerActionNone
;
210 Policy
->EventCode
= POWER_FORCE_TRIGGER_RESET
;
212 case PowerActionWarmEject
:
213 Policy
->Action
= PowerActionNone
;
214 Policy
->EventCode
= POWER_USER_NOTIFY_BUTTON
;
216 case PowerActionShutdown
:
217 Policy
->Action
= PowerActionNone
;
218 Policy
->EventCode
= POWER_USER_NOTIFY_SHUTDOWN
;
220 case PowerActionSleep
:
221 case PowerActionHibernate
:
222 Policy
->Action
= (POWER_ACTION
)ItemData
;
223 Policy
->EventCode
= 0;
228 Policy
->Flags
= (POWER_ACTION_UI_ALLOWED
| POWER_ACTION_QUERY_ALLOWED
);
236 //-------------------------------------------------------------------
238 void ShowCurrentPowerActionPolicies(HWND hwndDlg
)
240 TCHAR szAction
[MAX_PATH
];
242 if (!IsBatteryUsed())
245 /* expiremental code */
246 // ShowCurrentPowerButtonAcAction(hList2,
247 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
249 sizeof(g_SystemBatteries
) / sizeof(POWER_ACTION
),
250 &gGPP
.user
.LidCloseAc
);
252 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseAc
.Action
, szAction
, MAX_PATH
))
254 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
260 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
262 sizeof(g_PowerButton
) / sizeof(POWER_ACTION
),
263 &gGPP
.user
.PowerButtonAc
);
266 /* expiremental code */
267 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
269 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
270 &gGPP
.user
.SleepButtonAc
);
272 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonAc
.Action
, szAction
, MAX_PATH
))
274 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
285 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
),
287 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
288 &gGPP
.user
.LidCloseDc
);
290 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
),
292 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
293 &gGPP
.user
.PowerButtonDc
);
295 ShowCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
),
297 sizeof(g_SleepButton
) / sizeof(POWER_ACTION
),
298 &gGPP
.user
.SleepButtonDc
);
300 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.LidCloseDc
.Action
, szAction
, MAX_PATH
))
302 SendDlgItemMessage(hwndDlg
, IDC_LIDCLOSE
,
307 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.PowerButtonDc
.Action
, szAction
, MAX_PATH
))
309 SendDlgItemMessage(hwndDlg
, IDC_POWERBUTTON
,
314 if (LoadString(hApplet
, IDS_PowerActionNone1
+gGPP
.user
.SleepButtonDc
.Action
, szAction
, MAX_PATH
))
316 SendDlgItemMessage(hwndDlg
, IDC_SLEEPBUTTON
,
325 void Adv_InitDialog()
331 BOOLEAN bSuspend
= FALSE
;
335 SYSTEM_POWER_CAPABILITIES spc
;
338 IDC_SYSTRAYBATTERYMETER
,
339 gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
? BST_CHECKED
: BST_UNCHECKED
);
342 gGPP
.user
.GlobalFlags
& EnablePasswordLogon
? BST_CHECKED
: BST_UNCHECKED
);
345 gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
? BST_CHECKED
: BST_UNCHECKED
);
347 GetPwrCapabilities(&spc
);
349 if (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
)
352 bHibernate
= spc
.HiberFilePresent
;
353 bShutdown
= spc
.SystemS5
;
355 hList1
= GetDlgItem(hAdv
, IDC_LIDCLOSE
);
356 SendMessage(hList1
, CB_RESETCONTENT
, 0, 0);
358 memset(g_SystemBatteries
, 0x0, sizeof(g_SystemBatteries
));
359 if (spc
.SystemBatteriesPresent
)
361 AddItem(hList1
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SystemBatteries
);
365 AddItem(hList1
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SystemBatteries
);
370 AddItem(hList1
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SystemBatteries
);
375 ShowWindow(GetDlgItem(hAdv
, IDC_VIDEODIMDISPLAY
), FALSE
);
376 ShowWindow(GetDlgItem(hAdv
, IDC_SLIDCLOSE
), FALSE
);
377 ShowWindow(hList1
, FALSE
);
380 hList2
= GetDlgItem(hAdv
, IDC_POWERBUTTON
);
381 SendMessage(hList2
, CB_RESETCONTENT
, 0, 0);
383 memset(g_PowerButton
, 0x0, sizeof(g_PowerButton
));
384 if (spc
.PowerButtonPresent
)
386 AddItem(hList2
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_PowerButton
);
387 AddItem(hList2
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_PowerButton
);
391 AddItem(hList2
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_PowerButton
);
396 AddItem(hList2
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_PowerButton
);
401 AddItem(hList2
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_PowerButton
);
406 ShowWindow(GetDlgItem(hAdv
, IDC_SPOWERBUTTON
), FALSE
);
407 ShowWindow(hList2
, FALSE
);
410 hList3
=GetDlgItem(hAdv
, IDC_SLEEPBUTTON
);
411 SendMessage(hList3
, CB_RESETCONTENT
, 0, 0);
412 memset(g_SleepButton
, 0x0, sizeof(g_SleepButton
));
414 if (spc
.SleepButtonPresent
)
416 AddItem(hList3
, IDS_PowerActionNone1
, (LPARAM
)PowerActionNone
, g_SleepButton
);
417 AddItem(hList3
, IDS_PowerActionWarmEject
, (LPARAM
)PowerActionWarmEject
, g_SleepButton
);
421 AddItem(hList3
, IDS_PowerActionSleep
, (LPARAM
)PowerActionSleep
, g_SleepButton
);
426 AddItem(hList3
, IDS_PowerActionHibernate
, (LPARAM
)PowerActionHibernate
, g_SleepButton
);
431 AddItem(hList3
, IDS_PowerActionShutdown
, (LPARAM
)PowerActionShutdown
, g_SleepButton
);
436 ShowWindow(GetDlgItem(hAdv
, IDC_SSLEEPBUTTON
), FALSE
);
437 ShowWindow(hList3
, FALSE
);
440 if (ReadGlobalPwrPolicy(&gGPP
))
442 ShowCurrentPowerActionPolicies(hAdv
);
447 void Adv_SaveData(HWND hwndDlg
)
449 BOOL bSystrayBatteryMeter
;
451 BOOL bVideoDimDisplay
;
453 bSystrayBatteryMeter
=
454 (IsDlgButtonChecked(hwndDlg
, IDC_SYSTRAYBATTERYMETER
) == BST_CHECKED
);
457 (IsDlgButtonChecked(hwndDlg
, IDC_PASSWORDLOGON
) == BST_CHECKED
);
460 (IsDlgButtonChecked(hwndDlg
, IDC_VIDEODIMDISPLAY
) == BST_CHECKED
);
462 if (bSystrayBatteryMeter
)
464 if (!(gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
466 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableSysTrayBatteryMeter
;
471 if ((gGPP
.user
.GlobalFlags
& EnableSysTrayBatteryMeter
))
473 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableSysTrayBatteryMeter
;
479 if (!(gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
481 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnablePasswordLogon
;
486 if ((gGPP
.user
.GlobalFlags
& EnablePasswordLogon
))
488 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnablePasswordLogon
;
492 if (bVideoDimDisplay
)
494 if (!(gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
496 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
+ EnableVideoDimDisplay
;
501 if ((gGPP
.user
.GlobalFlags
& EnableVideoDimDisplay
))
503 gGPP
.user
.GlobalFlags
= gGPP
.user
.GlobalFlags
- EnableVideoDimDisplay
;
507 if (!IsBatteryUsed())
509 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonAc
);
511 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseAc
);
512 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonAc
);
518 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_POWERBUTTON
), &gGPP
.user
.PowerButtonDc
);
519 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_LIDCLOSE
), &gGPP
.user
.LidCloseDc
);
520 SaveCurrentPowerActionPolicy(GetDlgItem(hwndDlg
, IDC_SLEEPBUTTON
), &gGPP
.user
.SleepButtonDc
);
524 if (!WriteGlobalPwrPolicy(&gGPP
))
526 MessageBox(hwndDlg
, L
"WriteGlobalPwrPolicy failed", NULL
, MB_OK
);