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
)
81 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
82 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
83 HeapFree(GetProcessHeap(), 0, pScheme
);
88 _tcscpy(pScheme
->pszName
, pszName
);
89 _tcscpy(pScheme
->pszDescription
, pszDescription
);
91 CopyMemory(&pScheme
->PowerPolicy
, pp
, sizeof(POWER_POLICY
));
93 InsertTailList(&pPageData
->PowerSchemesList
, &pScheme
->ListEntry
);
102 PPOWER_SCHEME pScheme
)
104 RemoveEntryList(&pScheme
->ListEntry
);
106 HeapFree(GetProcessHeap(), 0, pScheme
->pszName
);
107 HeapFree(GetProcessHeap(), 0, pScheme
->pszDescription
);
108 HeapFree(GetProcessHeap(), 0, pScheme
);
115 EnumPowerSchemeCallback(
124 if (ValidatePowerPolicies(0, pp
))
126 AddPowerScheme((PPOWER_SCHEMES_PAGE_DATA
)lParam
,
141 PPOWER_SCHEMES_PAGE_DATA pPageData
)
143 InitializeListHead(&pPageData
->PowerSchemesList
);
145 EnumPwrSchemes(EnumPowerSchemeCallback
, (LPARAM
)pPageData
);
152 PPOWER_SCHEMES_PAGE_DATA pPageData
)
154 PLIST_ENTRY ListEntry
;
155 PPOWER_SCHEME pScheme
;
157 while (!IsListEmpty(&pPageData
->PowerSchemesList
))
159 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
160 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
161 DeletePowerScheme(pScheme
);
164 pPageData
->pActivePowerScheme
= NULL
;
172 SYSTEM_POWER_CAPABILITIES spc
;
174 RECT rectCtl, rectDlg, rectCtl2;
178 if (GetWindowRect(hwndDlg,&rectDlg))
180 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_SAT),&rectCtl2))
182 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITOR),&rectCtl))
184 movetop=rectCtl.top - rectCtl2.top;
185 MoveWindow(GetDlgItem(hwndDlg, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
186 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISK),&rectCtl))
188 MoveWindow(GetDlgItem(hwndDlg, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
190 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBY),&rectCtl))
192 MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
194 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HYBERNATE),&rectCtl))
196 MoveWindow(GetDlgItem(hwndDlg, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
198 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORDCLIST),&rectCtl2))
201 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORACLIST),&rectCtl))
203 moveright=rectCtl.right - rectCtl2.right;
204 MoveWindow(GetDlgItem(hwndDlg, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
205 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISKACLIST),&rectCtl))
207 MoveWindow(GetDlgItem(hwndDlg, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
209 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),&rectCtl))
211 MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
213 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST),&rectCtl))
215 MoveWindow(GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
218 if (GetWindowRect(GetDlgItem(hwndDlg, IDC_GRPDETAIL),&rectCtl))
220 MoveWindow(GetDlgItem(hwndDlg, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
229 if (!GetPwrCapabilities(&spc
))
234 if (!spc
.SystemBatteriesPresent
)
236 ShowWindow(GetDlgItem(hwndDlg
, IDC_SAT
), FALSE
);
237 ShowWindow(GetDlgItem(hwndDlg
, IDC_IAC
), FALSE
);
238 ShowWindow(GetDlgItem(hwndDlg
, IDC_SAC
), FALSE
);
239 ShowWindow(GetDlgItem(hwndDlg
, IDC_IDC
), FALSE
);
240 ShowWindow(GetDlgItem(hwndDlg
, IDC_SDC
), FALSE
);
241 ShowWindow(GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
), FALSE
);
242 ShowWindow(GetDlgItem(hwndDlg
, IDC_DISKDCLIST
), FALSE
);
243 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
), FALSE
);
244 ShowWindow(GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
), FALSE
);
245 ShowWindow(GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
), spc
.HiberFilePresent
);
250 ShowWindow(GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
), spc
.HiberFilePresent
);
251 ShowWindow(GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
), FALSE
);
255 if (!(spc
.SystemS1
||spc
.SystemS2
|| spc
.SystemS3
))
257 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
), TRUE
);
258 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
), TRUE
);
259 ShowWindow(GetDlgItem(hwndDlg
, IDC_STANDBY
), TRUE
);
262 ShowWindow(GetDlgItem(hwndDlg
, IDC_HYBERNATE
), spc
.HiberFilePresent
);
273 PPOWER_SCHEME pScheme
;
274 INT i
= 0, iCurSel
= 0;
275 TCHAR szTemp
[MAX_PATH
];
276 TCHAR szConfig
[MAX_PATH
];
279 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
,
284 if (iCurSel
== CB_ERR
)
287 pScheme
= (PPOWER_SCHEME
)SendDlgItemMessage(hwndDlg
,
292 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
295 if (LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
297 _stprintf(szConfig
, szTemp
, pScheme
->pszName
);
298 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
), szConfig
);
301 pp
= &pScheme
->PowerPolicy
;
303 for (i
= 0; i
< 16; i
++)
305 if (Sec
[i
] == pp
->user
.VideoTimeoutAc
)
307 SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
313 if (Sec
[i
] == pp
->user
.VideoTimeoutDc
)
315 SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
321 if (Sec
[i
] == pp
->user
.SpindownTimeoutAc
)
323 SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
329 if (Sec
[i
] == pp
->user
.SpindownTimeoutDc
)
331 SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
337 if (Sec
[i
] == pp
->user
.IdleTimeoutAc
)
339 SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
345 if (Sec
[i
] == pp
->user
.IdleTimeoutDc
)
347 SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
353 if (Sec
[i
] == pp
->mach
.DozeS4TimeoutAc
)
355 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
361 if (Sec
[i
] == pp
->mach
.DozeS4TimeoutDc
)
363 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
373 Pos_InitPage(HWND hwndDlg
)
375 int ifrom
= 0, i
= 0, imin
= 0;
377 TCHAR szName
[MAX_PATH
];
380 for (i
= 1; i
< 9; i
++)
385 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
390 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
395 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
400 hwnd
= GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
);
405 hwnd
= GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
410 hwnd
= GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
415 hwnd
= GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
420 hwnd
= GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
);
428 for (ifrom
= imin
; ifrom
< (IDS_TIMEOUT15
+ 1); ifrom
++)
430 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
432 index
= SendMessage(hwnd
,
442 (LPARAM
)Sec
[ifrom
- IDS_TIMEOUT16
]);
446 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
448 index
= SendMessage(hwnd
,
465 Pos_SaveData(HWND hwndDlg
)
467 PPOWER_SCHEME pScheme
;
470 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
,
475 if (iCurSel
== CB_ERR
)
478 pScheme
= (PPOWER_SCHEME
)SendDlgItemMessage(hwndDlg
,
483 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
486 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
490 if (tmp
> 0 && tmp
< 16)
492 pScheme
->PowerPolicy
.user
.VideoTimeoutAc
= Sec
[tmp
];
495 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
499 if (tmp
> 0 && tmp
< 16)
501 pScheme
->PowerPolicy
.user
.VideoTimeoutDc
= Sec
[tmp
];
504 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
508 if (tmp
> 0 && tmp
< 16)
510 pScheme
->PowerPolicy
.user
.SpindownTimeoutAc
= Sec
[tmp
+ 2];
513 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
517 if (tmp
> 0 && tmp
< 16)
519 pScheme
->PowerPolicy
.user
.SpindownTimeoutDc
= Sec
[tmp
+ 2];
522 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
526 if (tmp
> 0 && tmp
< 16)
528 pScheme
->PowerPolicy
.user
.IdleTimeoutAc
= Sec
[tmp
];
531 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
535 if (tmp
> 0 && tmp
< 16)
537 pScheme
->PowerPolicy
.user
.IdleTimeoutDc
= Sec
[tmp
];
540 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
544 if (tmp
> 0 && tmp
< 16)
546 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutAc
= Sec
[tmp
];
549 tmp
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
553 if (tmp
> 0 && tmp
< 16)
555 pScheme
->PowerPolicy
.mach
.DozeS4TimeoutDc
= Sec
[tmp
];
558 SetActivePwrScheme(iCurSel
, NULL
, &pScheme
->PowerPolicy
);
568 TCHAR szBuf
[1024], szBufT
[1024];
569 PPOWER_SCHEME pScheme
;
571 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
573 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
574 if (iCurSel
== CB_ERR
)
577 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
579 pScheme
= (PPOWER_SCHEME
)SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
580 if (pScheme
== (PPOWER_SCHEME
)CB_ERR
)
583 LoadString(hApplet
, IDS_DEL_SCHEME_TITLE
, szBufT
, sizeof(szBufT
) / sizeof(TCHAR
));
584 LoadString(hApplet
, IDS_DEL_SCHEME
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
586 if (MessageBox(hwnd
, szBuf
, szBufT
, MB_YESNO
| MB_ICONQUESTION
) == IDYES
)
590 if (GetActivePwrScheme(&Current
))
592 SendMessage(hList
, CB_SETCURSEL
, (WPARAM
)0, 0);
593 SendMessage(hList
, CB_DELETESTRING
, (WPARAM
)iCurSel
, 0);
594 if (Current
== pScheme
->uId
)
598 if (DeletePwrScheme(pScheme
->uId
) != 0)
609 PPOWER_SCHEMES_PAGE_DATA pPageData
)
611 PLIST_ENTRY ListEntry
;
612 PPOWER_SCHEME pScheme
;
615 SYSTEM_POWER_CAPABILITIES spc
;
619 hwndList
= GetDlgItem(hwndDlg
, IDC_ENERGYLIST
);
621 if (!GetActivePwrScheme(&aps
))
624 if (!ReadGlobalPwrPolicy(&gGPP
))
627 if (!ReadPwrScheme(aps
, &pp
))
630 if (!ValidatePowerPolicies(&gGPP
, 0))
634 if (!SetActivePwrScheme(aps, &gGPP, &pp))
638 if (!GetPwrCapabilities(&spc
))
641 if (CanUserWritePwrScheme())
644 // Enable write / delete powerscheme button
647 Pos_InitPage(hwndDlg
);
649 if (!GetActivePwrScheme(&aps
))
652 ListEntry
= pPageData
->PowerSchemesList
.Flink
;
653 while (ListEntry
!= &pPageData
->PowerSchemesList
)
655 pScheme
= CONTAINING_RECORD(ListEntry
, POWER_SCHEME
, ListEntry
);
657 index
= (int)SendMessage(hwndList
,
660 (LPARAM
)pScheme
->pszName
);
664 SendMessage(hwndList
,
669 if (aps
== pScheme
->uId
)
671 SendMessage(hwndList
,
674 (LPARAM
)pScheme
->pszName
);
679 ListEntry
= ListEntry
->Flink
;
682 if (SendMessage(hwndList
, CB_GETCOUNT
, 0, 0) > 0)
684 EnableWindow(GetDlgItem(hwndDlg
, IDC_DELETE_BTN
), TRUE
);
685 EnableWindow(GetDlgItem(hwndDlg
, IDC_SAVEAS_BTN
), TRUE
);
692 /* Property page dialog callback */
700 PPOWER_SCHEMES_PAGE_DATA pPageData
;
702 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
707 pPageData
= (PPOWER_SCHEMES_PAGE_DATA
)HeapAlloc(GetProcessHeap(),
709 sizeof(PPOWER_SCHEMES_PAGE_DATA
));
710 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPageData
);
712 BuildSchemesList(pPageData
);
714 if (!Pos_InitData(hwndDlg
))
717 // Initialization failed
719 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
722 if (!CreateEnergyList(hwndDlg
, pPageData
))
725 // Initialization failed
727 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
734 DestroySchemesList(pPageData
);
735 HeapFree(GetProcessHeap(), 0, pPageData
);
736 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)NULL
);
741 switch(LOWORD(wParam
))
744 if (HIWORD(wParam
) == CBN_SELCHANGE
)
747 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
758 case IDC_MONITORACLIST
:
759 case IDC_MONITORDCLIST
:
762 case IDC_STANDBYACLIST
:
763 case IDC_STANDBYDCLIST
:
764 case IDC_HYBERNATEACLIST
:
765 case IDC_HYBERNATEDCLIST
:
766 if (HIWORD(wParam
) == CBN_SELCHANGE
)
768 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
776 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
777 if (lpnm
->code
== (UINT
)PSN_APPLY
)
779 Pos_SaveData(hwndDlg
);