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 } POWER_SCHEMES_PAGE_DATA
, *PPOWER_SCHEMES_PAGE_DATA
;
56 PPOWER_SCHEMES_PAGE_DATA pPageData
,
61 LPWSTR pszDescription
,
64 PPOWER_SCHEME pScheme
;
66 pScheme
= HeapAlloc(GetProcessHeap(),
68 sizeof(POWER_SCHEME
));
72 pScheme
->pszName
= HeapAlloc(GetProcessHeap(),
74 dwName
+ sizeof(TCHAR
));
76 pScheme
->pszDescription
= HeapAlloc(GetProcessHeap(),
78 dwDescription
+ sizeof(TCHAR
));
79 if (pScheme
->pszName
== NULL
|| pScheme
->pszDescription
== NULL
)
82 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
84 if (pScheme
->pszDescription
)
85 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
87 HeapFree(GetProcessHeap(), 0, pScheme
);
92 _tcscpy(pScheme
->pszName
, pszName
);
93 _tcscpy(pScheme
->pszDescription
, pszDescription
);
95 CopyMemory(&pScheme
->PowerPolicy
, pp
, sizeof(POWER_POLICY
));
97 InsertTailList(&pPageData
->PowerSchemesList
, &pScheme
->ListEntry
);
106 PPOWER_SCHEME pScheme
)
108 RemoveEntryList(&pScheme
->ListEntry
);
110 if (pScheme
->pszName
)
111 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
113 if (pScheme
->pszDescription
)
114 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
116 HeapFree(GetProcessHeap(), 0, pScheme
);
123 EnumPowerSchemeCallback(
132 if (ValidatePowerPolicies(0, pp
))
134 AddPowerScheme((PPOWER_SCHEMES_PAGE_DATA
)lParam
,
149 PPOWER_SCHEMES_PAGE_DATA pPageData
)
151 InitializeListHead(&pPageData
->PowerSchemesList
);
153 EnumPwrSchemes(EnumPowerSchemeCallback
, (LPARAM
)pPageData
);
160 PPOWER_SCHEMES_PAGE_DATA pPageData
)
162 PLIST_ENTRY ListEntry
;
163 PPOWER_SCHEME pScheme
;
167 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
168 if (ListEntry
== &pPageData
->PowerSchemesList
)
171 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
172 DeletePowerScheme(pScheme
);
175 pPageData
->pActivePowerScheme
= NULL
;
183 SYSTEM_POWER_CAPABILITIES spc
;
185 RECT rectCtl, rectDlg, rectCtl2;
189 if (GetWindowRect(hwndDlg,&rectDlg))
191 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_SAT),&rectCtl2))
193 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITOR),&rectCtl))
195 movetop=rectCtl.top - rectCtl2.top;
196 MoveWindow(GetDlgItem(hwndDlg, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
197 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISK),&rectCtl))
199 MoveWindow(GetDlgItem(hwndDlg, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
201 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBY),&rectCtl))
203 MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
205 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HIBERNATE),&rectCtl))
207 MoveWindow(GetDlgItem(hwndDlg, IDC_HIBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
209 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORDCLIST),&rectCtl2))
212 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORACLIST),&rectCtl))
214 moveright=rectCtl.right - rectCtl2.right;
215 MoveWindow(GetDlgItem(hwndDlg, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
216 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISKACLIST),&rectCtl))
218 MoveWindow(GetDlgItem(hwndDlg, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
220 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),&rectCtl))
222 MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
224 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HIBERNATEACLIST),&rectCtl))
226 MoveWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
229 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_GRPDETAIL),&rectCtl))
231 MoveWindow(GetDlgItem(hwndDlg, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
240 if (!GetPwrCapabilities(&spc
))
245 if (!spc
.SystemBatteriesPresent
)
247 ShowWindow(GetDlgItem(hwndDlg
, IDC_SAT
), SW_HIDE
);
248 ShowWindow(GetDlgItem(hwndDlg
, IDC_IAC
), SW_HIDE
);
249 ShowWindow(GetDlgItem(hwndDlg
, IDC_SAC
), SW_HIDE
);
250 ShowWindow(GetDlgItem(hwndDlg
, IDC_IDC
), SW_HIDE
);
251 ShowWindow(GetDlgItem(hwndDlg
, IDC_SDC
), SW_HIDE
);
252 ShowWindow(GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
), SW_HIDE
);
253 ShowWindow(GetDlgItem(hwndDlg
, IDC_DISKDCLIST
), SW_HIDE
);
254 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
), SW_HIDE
);
255 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
), SW_HIDE
);
258 if (!(spc
.SystemS1
|| spc
.SystemS2
|| spc
.SystemS3
))
260 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBY
), SW_HIDE
);
261 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
), SW_HIDE
);
262 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
), SW_HIDE
);
265 if (!spc
.HiberFilePresent
)
267 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATE
), SW_HIDE
);
268 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
), SW_HIDE
);
269 ShowWindow(GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
), SW_HIDE
);
281 PPOWER_SCHEME pScheme
;
282 INT i
= 0, iCurSel
= 0;
283 TCHAR szTemp
[MAX_PATH
];
284 TCHAR szConfig
[MAX_PATH
];
287 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
,
292 if (iCurSel
== CB_ERR
)
295 pScheme
= (PPOWER_SCHEME
)SendDlgItemMessage(hwndDlg
,
300 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
303 if (LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
305 _stprintf(szConfig
, szTemp
, pScheme
->pszName
);
306 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
), szConfig
);
309 pp
= &pScheme
->PowerPolicy
;
311 for (i
= 0; i
< 16; i
++)
313 if (Sec
[i
] == pp
->user
.VideoTimeoutAc
)
315 SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
321 if (Sec
[i
] == pp
->user
.VideoTimeoutDc
)
323 SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
329 if (Sec
[i
] == pp
->user
.SpindownTimeoutAc
)
331 SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
337 if (Sec
[i
] == pp
->user
.SpindownTimeoutDc
)
339 SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
345 if (Sec
[i
] == pp
->user
.IdleTimeoutAc
)
347 SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
353 if (Sec
[i
] == pp
->user
.IdleTimeoutDc
)
355 SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
361 if (Sec
[i
] == pp
->mach
.DozeS4TimeoutAc
)
363 SendDlgItemMessage(hwndDlg
, IDC_HIBERNATEACLIST
,
369 if (Sec
[i
] == pp
->mach
.DozeS4TimeoutDc
)
371 SendDlgItemMessage(hwndDlg
, IDC_HIBERNATEDCLIST
,
381 Pos_InitPage(HWND hwndDlg
)
383 int ifrom
= 0, i
= 0, imin
= 0;
385 TCHAR szName
[MAX_PATH
];
388 for (i
= 1; i
< 9; i
++)
393 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
398 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
403 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
408 hwnd
= GetDlgItem(hwndDlg
, IDC_HIBERNATEACLIST
);
413 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
418 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
423 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
428 hwnd
= GetDlgItem(hwndDlg
, IDC_HIBERNATEDCLIST
);
436 for (ifrom
= imin
; ifrom
< (IDS_TIMEOUT15
+ 1); ifrom
++)
438 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
440 index
= SendMessage(hwnd
,
450 (LPARAM
)Sec
[ifrom
- IDS_TIMEOUT16
]);
454 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
456 index
= SendMessage(hwnd
,
473 Pos_SaveData(HWND hwndDlg
)
475 PPOWER_SCHEME pScheme
;
478 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
,
483 if (iCurSel
== CB_ERR
)
486 pScheme
= (PPOWER_SCHEME
)SendDlgItemMessage(hwndDlg
,
491 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
494 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
498 if (tmp
> 0 && tmp
< 16)
500 pScheme
->PowerPolicy
.user
.VideoTimeoutAc
= Sec
[tmp
];
503 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
507 if (tmp
> 0 && tmp
< 16)
509 pScheme
->PowerPolicy
.user
.VideoTimeoutDc
= Sec
[tmp
];
512 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
516 if (tmp
> 0 && tmp
< 16)
518 pScheme
->PowerPolicy
.user
.SpindownTimeoutAc
= Sec
[tmp
+ 2];
521 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
525 if (tmp
> 0 && tmp
< 16)
527 pScheme
->PowerPolicy
.user
.SpindownTimeoutDc
= Sec
[tmp
+ 2];
530 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
534 if (tmp
> 0 && tmp
< 16)
536 pScheme
->PowerPolicy
.user
.IdleTimeoutAc
= Sec
[tmp
];
539 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
543 if (tmp
> 0 && tmp
< 16)
545 pScheme
->PowerPolicy
.user
.IdleTimeoutDc
= Sec
[tmp
];
548 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_HIBERNATEACLIST
,
552 if (tmp
> 0 && tmp
< 16)
554 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutAc
= Sec
[tmp
];
557 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_HIBERNATEDCLIST
,
561 if (tmp
> 0 && tmp
< 16)
563 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutDc
= Sec
[tmp
];
566 SetActivePwrScheme(pScheme
->uId
, NULL
, &pScheme
->PowerPolicy
);
574 WCHAR szTitleBuffer
[256];
575 WCHAR szRawBuffer
[256], szCookedBuffer
[512];
578 PPOWER_SCHEME pScheme
;
580 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
582 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
583 if (iCurSel
== CB_ERR
)
586 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
588 pScheme
= (PPOWER_SCHEME
)SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
589 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
592 LoadStringW(hApplet
, IDS_DEL_SCHEME_TITLE
, szTitleBuffer
, ARRAYSIZE(szTitleBuffer
));
593 LoadStringW(hApplet
, IDS_DEL_SCHEME
, szRawBuffer
, ARRAYSIZE(szRawBuffer
));
594 StringCchPrintfW(szCookedBuffer
, ARRAYSIZE(szCookedBuffer
), szRawBuffer
, pScheme
->pszName
);
596 if (MessageBoxW(hwnd
, szCookedBuffer
, szTitleBuffer
, MB_YESNO
| MB_ICONQUESTION
| MB_DEFBUTTON2
) == IDYES
)
600 if (GetActivePwrScheme(&Current
))
602 SendMessage(hList
, CB_SETCURSEL
, (WPARAM
)0, 0);
603 SendMessage(hList
, CB_DELETESTRING
, (WPARAM
)iCurSel
, 0);
604 if (Current
== pScheme
->uId
)
608 if (DeletePwrScheme(pScheme
->uId
) != 0)
619 PPOWER_SCHEMES_PAGE_DATA pPageData
)
621 PLIST_ENTRY ListEntry
;
622 PPOWER_SCHEME pScheme
;
625 SYSTEM_POWER_CAPABILITIES spc
;
629 hwndList
= GetDlgItem(hwndDlg
, IDC_ENERGYLIST
);
631 if (!GetActivePwrScheme(&aps
))
634 if (!ReadGlobalPwrPolicy(&gGPP
))
637 if (!ReadPwrScheme(aps
, &pp
))
640 if (!ValidatePowerPolicies(&gGPP
, 0))
644 if (!SetActivePwrScheme(aps, &gGPP, &pp))
648 if (!GetPwrCapabilities(&spc
))
651 if (CanUserWritePwrScheme())
654 // Enable write / delete powerscheme button
657 Pos_InitPage(hwndDlg
);
659 if (!GetActivePwrScheme(&aps
))
662 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
663 while (ListEntry
!= &pPageData
->PowerSchemesList
)
665 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
667 index
= (int)SendMessage(hwndList
,
670 (LPARAM
)pScheme
->pszName
);
674 SendMessage(hwndList
,
679 if (aps
== pScheme
->uId
)
681 SendMessage(hwndList
,
684 (LPARAM
)pScheme
->pszName
);
689 ListEntry
= ListEntry
->Flink
;
692 if (SendMessage(hwndList
, CB_GETCOUNT
, 0, 0) > 0)
694 EnableWindow(GetDlgItem(hwndDlg
, IDC_DELETE_BTN
), TRUE
);
695 EnableWindow(GetDlgItem(hwndDlg
, IDC_SAVEAS_BTN
), TRUE
);
702 /* Property page dialog callback */
710 PPOWER_SCHEMES_PAGE_DATA pPageData
;
712 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
717 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)HeapAlloc(GetProcessHeap(),
719 sizeof(PPOWER_SCHEMES_PAGE_DATA
));
720 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPageData
);
722 BuildSchemesList(pPageData
);
724 if (!Pos_InitData(hwndDlg
))
727 // Initialization failed
729 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
732 if (!CreateEnergyList(hwndDlg
, pPageData
))
735 // Initialization failed
737 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
744 DestroySchemesList(pPageData
);
745 HeapFree(GetProcessHeap(), 0, pPageData
);
746 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)NULL
);
751 switch(LOWORD(wParam
))
754 if (HIWORD(wParam
) == CBN_SELCHANGE
)
757 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
768 case IDC_MONITORACLIST
:
769 case IDC_MONITORDCLIST
:
772 case IDC_STANDBYACLIST
:
773 case IDC_STANDBYDCLIST
:
774 case IDC_HIBERNATEACLIST
:
775 case IDC_HIBERNATEDCLIST
:
776 if (HIWORD(wParam
) == CBN_SELCHANGE
)
778 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
786 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
787 if (lpnm
->code
== (UINT
)PSN_APPLY
)
789 Pos_SaveData(hwndDlg
);