2 * PROJECT: ReactOS Power Configuration Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/powercfg/powershemes.c
5 * PURPOSE: powerschemes 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)
15 typedef struct _POWER_SCHEME
20 LPTSTR pszDescription
;
21 POWER_POLICY PowerPolicy
;
22 } POWER_SCHEME
, *PPOWER_SCHEME
;
25 typedef struct _POWER_SCHEMES_PAGE_DATA
27 LIST_ENTRY PowerSchemesList
;
28 PPOWER_SCHEME pActivePowerScheme
;
29 PPOWER_SCHEME pSelectedPowerScheme
;
30 } POWER_SCHEMES_PAGE_DATA
, *PPOWER_SCHEMES_PAGE_DATA
;
33 typedef struct _SAVE_POWER_SCHEME_DATA
35 PPOWER_SCHEMES_PAGE_DATA pPageData
;
36 PPOWER_SCHEME pNewScheme
;
38 } SAVE_POWER_SCHEME_DATA
, *PSAVE_POWER_SCHEME_DATA
;
65 PPOWER_SCHEMES_PAGE_DATA pPageData
,
70 LPWSTR pszDescription
,
73 PPOWER_SCHEME pScheme
;
76 pScheme
= HeapAlloc(GetProcessHeap(),
78 sizeof(POWER_SCHEME
));
83 CopyMemory(&pScheme
->PowerPolicy
, pp
, sizeof(POWER_POLICY
));
87 pScheme
->pszName
= HeapAlloc(GetProcessHeap(),
90 if (pScheme
->pszName
== NULL
)
93 _tcscpy(pScheme
->pszName
, pszName
);
96 if (dwDescription
!= 0)
98 pScheme
->pszDescription
= HeapAlloc(GetProcessHeap(),
101 if (pScheme
->pszDescription
== NULL
)
104 _tcscpy(pScheme
->pszDescription
, pszDescription
);
107 InsertTailList(&pPageData
->PowerSchemesList
, &pScheme
->ListEntry
);
111 if (bResult
== FALSE
)
113 if (pScheme
->pszName
)
114 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
116 if (pScheme
->pszDescription
)
117 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
119 HeapFree(GetProcessHeap(), 0, pScheme
);
130 PPOWER_SCHEME pScheme
)
132 RemoveEntryList(&pScheme
->ListEntry
);
134 if (pScheme
->pszName
)
135 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
137 if (pScheme
->pszDescription
)
138 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
140 HeapFree(GetProcessHeap(), 0, pScheme
);
147 EnumPowerSchemeCallback(
156 if (ValidatePowerPolicies(0, pp
))
158 AddPowerScheme((PPOWER_SCHEMES_PAGE_DATA
)lParam
,
173 PPOWER_SCHEMES_PAGE_DATA pPageData
)
175 InitializeListHead(&pPageData
->PowerSchemesList
);
177 EnumPwrSchemes(EnumPowerSchemeCallback
, (LPARAM
)pPageData
);
184 PPOWER_SCHEMES_PAGE_DATA pPageData
)
186 PLIST_ENTRY ListEntry
;
187 PPOWER_SCHEME pScheme
;
191 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
192 if (ListEntry
== &pPageData
->PowerSchemesList
)
195 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
196 DeletePowerScheme(pScheme
);
199 pPageData
->pActivePowerScheme
= NULL
;
200 pPageData
->pSelectedPowerScheme
= NULL
;
208 SYSTEM_POWER_CAPABILITIES spc
;
210 if (!GetPwrCapabilities(&spc
))
215 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBY
),
216 (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
) ? SW_SHOW
: SW_HIDE
);
217 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
),
218 (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
) ? SW_SHOW
: SW_HIDE
);
219 if (spc
.SystemBatteriesPresent
)
220 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
),
221 (spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
) ? SW_SHOW
: SW_HIDE
);
223 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATE
),
224 (spc
.HiberFilePresent
) ? SW_SHOW
: SW_HIDE
);
225 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
),
226 (spc
.HiberFilePresent
) ? SW_SHOW
: SW_HIDE
);
227 if (spc
.SystemBatteriesPresent
)
228 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
),
229 (spc
.HiberFilePresent
) ? SW_SHOW
: SW_HIDE
);
239 PPOWER_SCHEMES_PAGE_DATA pPageData
,
240 PPOWER_SCHEME pScheme
)
242 INT i
= 0, iCurSel
= 0;
243 TCHAR szTemp
[MAX_PATH
];
244 TCHAR szConfig
[MAX_PATH
];
250 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
,
255 if (iCurSel
== CB_ERR
)
258 pScheme
= (PPOWER_SCHEME
)SendDlgItemMessage(hwndDlg
,
263 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
267 pPageData
->pSelectedPowerScheme
= pScheme
;
269 if (LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
271 _stprintf(szConfig
, szTemp
, pScheme
->pszName
);
272 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
), szConfig
);
275 pp
= &pScheme
->PowerPolicy
;
277 for (i
= 0; i
< 16; i
++)
279 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
280 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.VideoTimeoutAc
)
282 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
285 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
286 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.VideoTimeoutDc
)
288 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
291 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
292 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.SpindownTimeoutAc
)
294 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
- 2, 0);
297 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
298 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.SpindownTimeoutDc
)
300 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
- 2, 0);
303 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
304 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.IdleTimeoutAc
)
306 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
309 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
310 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->user
.IdleTimeoutDc
)
312 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
315 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
);
316 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->mach
.DozeS4TimeoutAc
)
318 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
321 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
);
322 if (hwndCtrl
!= NULL
&& Sec
[i
] == pp
->mach
.DozeS4TimeoutDc
)
324 SendMessage(hwndCtrl
, CB_SETCURSEL
, i
, 0);
328 EnableWindow(GetDlgItem(hwndDlg
, IDC_DELETE_BTN
),
329 (pScheme
!= pPageData
->pActivePowerScheme
));
334 Pos_InitPage(HWND hwndDlg
)
336 int ifrom
= 0, i
= 0, imin
= 0;
338 TCHAR szName
[MAX_PATH
];
341 for (i
= 1; i
< 9; i
++)
346 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
351 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
356 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
361 hwnd
= GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
);
366 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
371 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
376 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
381 hwnd
= GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
);
393 for (ifrom
= imin
; ifrom
< (IDS_TIMEOUT15
+ 1); ifrom
++)
395 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
397 index
= SendMessage(hwnd
,
407 (LPARAM
)Sec
[ifrom
- IDS_TIMEOUT16
]);
411 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
413 index
= SendMessage(hwnd
,
432 PPOWER_SCHEMES_PAGE_DATA pPageData
)
434 PPOWER_SCHEME pScheme
;
438 pScheme
= pPageData
->pSelectedPowerScheme
;
440 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
441 if (hwndCtrl
!= NULL
)
443 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
444 if (tmp
> 0 && tmp
< 16)
446 pScheme
->PowerPolicy
.user
.VideoTimeoutAc
= Sec
[tmp
];
450 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
451 if (hwndCtrl
!= NULL
)
453 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
454 if (tmp
> 0 && tmp
< 16)
456 pScheme
->PowerPolicy
.user
.VideoTimeoutDc
= Sec
[tmp
];
460 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
461 if (hwndCtrl
!= NULL
)
463 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
464 if (tmp
> 0 && tmp
< 16)
466 pScheme
->PowerPolicy
.user
.SpindownTimeoutAc
= Sec
[tmp
+ 2];
470 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
471 if (hwndCtrl
!= NULL
)
473 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
474 if (tmp
> 0 && tmp
< 16)
476 pScheme
->PowerPolicy
.user
.SpindownTimeoutDc
= Sec
[tmp
+ 2];
480 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
481 if (hwndCtrl
!= NULL
)
483 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
484 if (tmp
> 0 && tmp
< 16)
486 pScheme
->PowerPolicy
.user
.IdleTimeoutAc
= Sec
[tmp
];
490 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
491 if (hwndCtrl
!= NULL
)
493 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
494 if (tmp
> 0 && tmp
< 16)
496 pScheme
->PowerPolicy
.user
.IdleTimeoutDc
= Sec
[tmp
];
500 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
);
501 if (hwndCtrl
!= NULL
)
503 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
504 if (tmp
> 0 && tmp
< 16)
506 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutAc
= Sec
[tmp
];
510 hwndCtrl
= GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
);
511 if (hwndCtrl
!= NULL
)
513 tmp
= (INT
)SendMessage(hwndCtrl
, CB_GETCURSEL
, 0, 0);
514 if (tmp
> 0 && tmp
< 16)
516 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutDc
= Sec
[tmp
];
520 if (SetActivePwrScheme(pScheme
->uId
, NULL
, &pScheme
->PowerPolicy
))
522 pPageData
->pActivePowerScheme
= pScheme
;
523 EnableWindow(GetDlgItem(hwndDlg
, IDC_DELETE_BTN
), FALSE
);
532 PPOWER_SCHEMES_PAGE_DATA pPageData
)
534 WCHAR szTitleBuffer
[256];
535 WCHAR szRawBuffer
[256], szCookedBuffer
[512];
538 PPOWER_SCHEME pScheme
;
540 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
542 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
543 if (iCurSel
== CB_ERR
)
546 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
548 pScheme
= (PPOWER_SCHEME
)SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
549 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
552 LoadStringW(hApplet
, IDS_DEL_SCHEME_TITLE
, szTitleBuffer
, ARRAYSIZE(szTitleBuffer
));
553 LoadStringW(hApplet
, IDS_DEL_SCHEME
, szRawBuffer
, ARRAYSIZE(szRawBuffer
));
554 StringCchPrintfW(szCookedBuffer
, ARRAYSIZE(szCookedBuffer
), szRawBuffer
, pScheme
->pszName
);
556 if (MessageBoxW(hwnd
, szCookedBuffer
, szTitleBuffer
, MB_YESNO
| MB_ICONQUESTION
| MB_DEFBUTTON2
) == IDYES
)
558 if (!DeletePwrScheme(pScheme
->uId
))
560 // FIXME: Show an error message box
564 iCurSel
= SendMessage(hList
, CB_FINDSTRING
, -1, (LPARAM
)pScheme
->pszName
);
565 if (iCurSel
!= CB_ERR
)
566 SendMessage(hList
, CB_DELETESTRING
, iCurSel
, 0);
568 DeletePowerScheme(pScheme
);
570 iCurSel
= SendMessage(hList
, CB_FINDSTRING
, -1, (LPARAM
)pPageData
->pActivePowerScheme
->pszName
);
571 if (iCurSel
!= CB_ERR
)
572 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
574 LoadConfig(hwnd
, pPageData
, NULL
);
586 PSAVE_POWER_SCHEME_DATA pSaveSchemeData
)
588 PPOWER_SCHEMES_PAGE_DATA pPageData
;
589 PPOWER_SCHEME pScheme
;
590 TCHAR szSchemeName
[512];
593 pPageData
= pSaveSchemeData
->pPageData
;
595 GetDlgItemText(hwndDlg
, IDC_SCHEMENAME
, szSchemeName
, ARRAYSIZE(szSchemeName
));
597 pScheme
= AddPowerScheme(pPageData
,
599 (_tcslen(szSchemeName
) + 1) * sizeof(TCHAR
),
603 &pPageData
->pSelectedPowerScheme
->PowerPolicy
);
606 if (WritePwrScheme(&pScheme
->uId
,
608 pScheme
->pszDescription
,
609 &pScheme
->PowerPolicy
))
611 pSaveSchemeData
->pNewScheme
= pScheme
;
616 DeletePowerScheme(pScheme
);
632 PSAVE_POWER_SCHEME_DATA pSaveSchemeData
;
634 pSaveSchemeData
= (PSAVE_POWER_SCHEME_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
639 pSaveSchemeData
= (PSAVE_POWER_SCHEME_DATA
)lParam
;
640 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSaveSchemeData
);
642 SetDlgItemText(hwndDlg
,
644 pSaveSchemeData
->pPageData
->pSelectedPowerScheme
->pszName
);
648 switch(LOWORD(wParam
))
651 EndDialog(hwndDlg
, SavePowerScheme(hwndDlg
, pSaveSchemeData
));
655 EndDialog(hwndDlg
, FALSE
);
669 PPOWER_SCHEMES_PAGE_DATA pPageData
)
671 SAVE_POWER_SCHEME_DATA SaveSchemeData
;
672 POWER_POLICY BackupPowerPolicy
;
676 SaveSchemeData
.pPageData
= pPageData
;
677 SaveSchemeData
.pNewScheme
= NULL
;
678 SaveSchemeData
.hwndPage
= hwndDlg
;
680 CopyMemory(&BackupPowerPolicy
,
681 &pPageData
->pSelectedPowerScheme
->PowerPolicy
,
682 sizeof(POWER_POLICY
));
684 Pos_SaveData(hwndDlg
, pPageData
);
686 if (DialogBoxParam(hApplet
,
687 MAKEINTRESOURCE(IDD_SAVEPOWERSCHEME
),
690 (LPARAM
)&SaveSchemeData
))
692 if (SaveSchemeData
.pNewScheme
)
694 hwndList
= GetDlgItem(hwndDlg
, IDC_ENERGYLIST
);
696 index
= (INT
)SendMessage(hwndList
,
699 (LPARAM
)SaveSchemeData
.pNewScheme
->pszName
);
702 SendMessage(hwndList
,
705 (LPARAM
)SaveSchemeData
.pNewScheme
);
707 SendMessage(hwndList
, CB_SETCURSEL
, (WPARAM
)index
, 0);
709 LoadConfig(hwndDlg
, pPageData
, SaveSchemeData
.pNewScheme
);
714 CopyMemory(&pPageData
->pSelectedPowerScheme
->PowerPolicy
,
716 sizeof(POWER_POLICY
));
723 PPOWER_SCHEMES_PAGE_DATA pPageData
)
725 PLIST_ENTRY ListEntry
;
726 PPOWER_SCHEME pScheme
;
729 SYSTEM_POWER_CAPABILITIES spc
;
733 hwndList
= GetDlgItem(hwndDlg
, IDC_ENERGYLIST
);
735 if (!GetActivePwrScheme(&aps
))
738 if (!ReadGlobalPwrPolicy(&gGPP
))
741 if (!ReadPwrScheme(aps
, &pp
))
744 if (!ValidatePowerPolicies(&gGPP
, 0))
748 if (!SetActivePwrScheme(aps, &gGPP, &pp))
752 if (!GetPwrCapabilities(&spc
))
755 if (CanUserWritePwrScheme())
758 // Enable write / delete powerscheme button
761 Pos_InitPage(hwndDlg
);
763 if (!GetActivePwrScheme(&aps
))
766 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
767 while (ListEntry
!= &pPageData
->PowerSchemesList
)
769 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
771 index
= (int)SendMessage(hwndList
,
774 (LPARAM
)pScheme
->pszName
);
778 SendMessage(hwndList
,
783 if (aps
== pScheme
->uId
)
785 SendMessage(hwndList
,
788 (LPARAM
)pScheme
->pszName
);
790 pPageData
->pActivePowerScheme
= pScheme
;
791 LoadConfig(hwndDlg
, pPageData
, pScheme
);
794 ListEntry
= ListEntry
->Flink
;
797 if (SendMessage(hwndList
, CB_GETCOUNT
, 0, 0) > 0)
799 EnableWindow(GetDlgItem(hwndDlg
, IDC_SAVEAS_BTN
), TRUE
);
806 /* Property page dialog callback */
814 PPOWER_SCHEMES_PAGE_DATA pPageData
;
816 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
821 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)HeapAlloc(GetProcessHeap(),
823 sizeof(POWER_SCHEMES_PAGE_DATA
));
824 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPageData
);
826 BuildSchemesList(pPageData
);
828 if (!Pos_InitData(hwndDlg
))
831 // Initialization failed
833 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
836 if (!CreateEnergyList(hwndDlg
, pPageData
))
839 // Initialization failed
841 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
848 DestroySchemesList(pPageData
);
849 HeapFree(GetProcessHeap(), 0, pPageData
);
850 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)NULL
);
855 switch(LOWORD(wParam
))
858 if (HIWORD(wParam
) == CBN_SELCHANGE
)
860 LoadConfig(hwndDlg
, pPageData
, NULL
);
861 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
866 DelScheme(hwndDlg
, pPageData
);
870 SaveScheme(hwndDlg
, pPageData
);
873 case IDC_MONITORACLIST
:
874 case IDC_MONITORDCLIST
:
877 case IDC_STANDBYACLIST
:
878 case IDC_STANDBYDCLIST
:
879 case IDC_HIBERNATEACLIST
:
880 case IDC_HIBERNATEDCLIST
:
881 if (HIWORD(wParam
) == CBN_SELCHANGE
)
883 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
890 switch (((LPNMHDR
)lParam
)->code
)
893 Pos_SaveData(hwndDlg
, pPageData
);
897 Pos_InitData(hwndDlg
);