3 * PROJECT: ReactOS Power Configuration Applet
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: dll/cpl/powercfg/powershemes.c
6 * PURPOSE: powerschemes tab of applet
7 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net)
8 * Johannes Anderwald (johannes.anderwald@student.tugraz.at)
10 * Dmitry Chapyshev (lentind@yandex.ru)
40 #define MAX_POWER_POLICY 20
42 POWER_POLICY gPP
[MAX_POWER_POLICY
];
50 SYSTEM_POWER_CAPABILITIES spc
;
52 RECT rectCtl, rectDlg, rectCtl2;
56 if (GetWindowRect(hPos,&rectDlg))
58 if (GetWindowRect(GetDlgItem(hPos, IDC_SAT),&rectCtl2))
60 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITOR),&rectCtl))
62 movetop=rectCtl.top - rectCtl2.top;
63 MoveWindow(GetDlgItem(hPos, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
64 if (GetWindowRect(GetDlgItem(hPos, IDC_DISK),&rectCtl))
66 MoveWindow(GetDlgItem(hPos, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
68 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBY),&rectCtl))
70 MoveWindow(GetDlgItem(hPos, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
72 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATE),&rectCtl))
74 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
76 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORDCLIST),&rectCtl2))
79 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORACLIST),&rectCtl))
81 moveright=rectCtl.right - rectCtl2.right;
82 MoveWindow(GetDlgItem(hPos, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
83 if (GetWindowRect(GetDlgItem(hPos, IDC_DISKACLIST),&rectCtl))
85 MoveWindow(GetDlgItem(hPos, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
87 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBYACLIST),&rectCtl))
89 MoveWindow(GetDlgItem(hPos, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
91 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATEACLIST),&rectCtl))
93 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
96 if (GetWindowRect(GetDlgItem(hPos, IDC_GRPDETAIL),&rectCtl))
98 MoveWindow(GetDlgItem(hPos, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
107 if (!GetPwrCapabilities(&spc
))
112 if (!spc
.SystemBatteriesPresent
)
114 ShowWindow(GetDlgItem(hPos
, IDC_SAT
),FALSE
);
115 ShowWindow(GetDlgItem(hPos
, IDC_IAC
),FALSE
);
116 ShowWindow(GetDlgItem(hPos
, IDC_SAC
),FALSE
);
117 ShowWindow(GetDlgItem(hPos
, IDC_IDC
),FALSE
);
118 ShowWindow(GetDlgItem(hPos
, IDC_SDC
),FALSE
);
119 ShowWindow(GetDlgItem(hPos
, IDC_MONITORDCLIST
),FALSE
);
120 ShowWindow(GetDlgItem(hPos
, IDC_DISKDCLIST
),FALSE
);
121 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
),FALSE
);
122 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
),FALSE
);
123 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), spc
.HiberFilePresent
);
128 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
), spc
.HiberFilePresent
);
129 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), FALSE
);
133 if (!(spc
.SystemS1
||spc
.SystemS2
|| spc
.SystemS3
))
135 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYACLIST
), TRUE
);
136 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
), TRUE
);
137 ShowWindow(GetDlgItem(hPos
, IDC_STANDBY
), TRUE
);
140 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATE
), spc
.HiberFilePresent
);
147 LoadConfig(HWND hwndDlg
)
151 TCHAR szProfile
[MAX_PATH
];
152 TCHAR szTemp
[MAX_PATH
];
153 TCHAR szConfig
[MAX_PATH
];
156 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
160 if (iCurSel
== CB_ERR
)
163 memcpy(&pp
, &gPP
[iCurSel
], sizeof(POWER_POLICY
));
165 uiIndex
= (UINT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETCURSEL
, 0, 0);
166 if(uiIndex
!= (UINT
)CB_ERR
)
168 SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETLBTEXT
, uiIndex
, (LPARAM
)szProfile
);
169 if(LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
171 _stprintf(szConfig
,szTemp
,szProfile
);
172 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
),szConfig
);
178 if (Sec
[i
]==pp
.user
.VideoTimeoutAc
)
180 SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
186 if (Sec
[i
]==pp
.user
.VideoTimeoutDc
)
188 SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
193 if (Sec
[i
]==pp
.user
.SpindownTimeoutAc
)
195 SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
200 if (Sec
[i
]==pp
.user
.SpindownTimeoutDc
)//IdleTimeoutDc)
202 SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
207 if (Sec
[i
]==pp
.user
.IdleTimeoutAc
)
209 SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
214 if (Sec
[i
]==pp
.user
.IdleTimeoutDc
)
216 SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
222 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutAc
)
224 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
229 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutDc
)
231 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
241 callback_EnumPwrScheme(UINT uiIndex
, DWORD dwName
, LPTSTR sName
, DWORD dwDesc
,
242 LPWSTR sDesc
, PPOWER_POLICY pp
,LPARAM lParam
)
246 UNREFERENCED_PARAMETER(lParam
);
247 UNREFERENCED_PARAMETER(sDesc
);
248 UNREFERENCED_PARAMETER(dwDesc
);
249 UNREFERENCED_PARAMETER(dwName
);
251 if (ValidatePowerPolicies(0,pp
))
253 if (guiIndex
>= MAX_POWER_POLICY
)
256 //implement store power policy dynamically
261 memcpy(&gPP
[guiIndex
], pp
, sizeof(POWER_POLICY
));
264 index
= (int) SendMessage(hList
,
282 LoadConfig(GetParent(hList
));
290 Pos_InitPage(HWND hwndDlg
)
292 int ifrom
=0,i
=0,imin
=0;
294 TCHAR szName
[MAX_PATH
];
302 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
306 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
310 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
314 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
);
318 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
322 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
326 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
330 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
);
336 for (ifrom
=imin
;ifrom
<(IDS_TIMEOUT15
+1);ifrom
++)
338 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
340 index
= SendMessage(hwnd
,
351 (LPARAM
)Sec
[ifrom
-IDS_TIMEOUT16
]);
354 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
356 index
= SendMessage(hwnd
,
373 Pos_SaveData(HWND hwndDlg
)
377 iCurSel
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
381 if (iCurSel
== CB_ERR
)
384 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
388 if (tmp
> 0 && tmp
< 16)
390 gPP
[iCurSel
].user
.VideoTimeoutAc
= Sec
[tmp
];
392 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
396 if (tmp
> 0 && tmp
< 16)
398 gPP
[iCurSel
].user
.VideoTimeoutDc
= Sec
[tmp
];
400 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
404 if (tmp
> 0 && tmp
< 16)
406 gPP
[iCurSel
].user
.SpindownTimeoutAc
= Sec
[tmp
+2];
408 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
412 if (tmp
> 0 && tmp
< 16)
414 gPP
[iCurSel
].user
.SpindownTimeoutDc
= Sec
[tmp
+2];
416 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
420 if (tmp
> 0 && tmp
< 16)
422 gPP
[iCurSel
].user
.IdleTimeoutAc
= Sec
[tmp
];
424 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
428 if (tmp
> 0 && tmp
< 16)
430 gPP
[iCurSel
].user
.IdleTimeoutDc
= Sec
[tmp
];
432 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
436 if (tmp
> 0 && tmp
< 16)
438 gPP
[iCurSel
].mach
.DozeS4TimeoutAc
= Sec
[tmp
];
440 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
444 if (tmp
> 0 && tmp
< 16)
446 gPP
[iCurSel
].mach
.DozeS4TimeoutDc
= Sec
[tmp
];
449 SetActivePwrScheme(iCurSel
,NULL
,&gPP
[iCurSel
]);
459 TCHAR szBuf
[1024], szBufT
[1024];
462 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
464 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
465 if (iCurSel
== CB_ERR
) return FALSE
;
467 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
469 DelScheme
= SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
470 if (DelScheme
== (UINT
)CB_ERR
) return FALSE
;
472 LoadString(hApplet
, IDS_DEL_SCHEME_TITLE
, szBufT
, sizeof(szBufT
) / sizeof(TCHAR
));
473 LoadString(hApplet
, IDS_DEL_SCHEME
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
475 if (MessageBox(hwnd
, (LPCTSTR
)szBuf
, (LPCTSTR
)szBufT
, MB_OKCANCEL
| MB_ICONQUESTION
) == IDOK
)
479 if (GetActivePwrScheme(&Current
))
481 SendMessage(hList
, CB_SETCURSEL
, (WPARAM
)0, 0);
482 SendMessage(hList
, CB_DELETESTRING
, (WPARAM
)iCurSel
, 0);
483 if (Current
== DelScheme
) Pos_SaveData(hwnd
);
486 if (DeletePwrScheme(DelScheme
) != 0) return TRUE
;
494 CreateEnergyList(HWND hwnd
)
498 SYSTEM_POWER_CAPABILITIES spc
;
502 if (!GetActivePwrScheme(&aps
))
505 if (!ReadGlobalPwrPolicy(&gGPP
))
508 if (!ReadPwrScheme(aps
,&pp
))
511 if (!ValidatePowerPolicies(&gGPP
,0))
515 if (!SetActivePwrScheme(aps,&gGPP,&pp))
519 if (!GetPwrCapabilities(&spc
))
522 if (CanUserWritePwrScheme())
525 // enable write / delete powerscheme button
528 Pos_InitPage(GetParent(hwnd
));
530 if (!GetActivePwrScheme(&aps
))
533 retval
= EnumPwrSchemes(callback_EnumPwrScheme
, aps
);
535 if(SendMessage(hwnd
, CB_GETCOUNT
, 0, 0) > 0)
537 EnableWindow(GetDlgItem(hwndDialog
, IDC_DELETE_BTN
),TRUE
);
538 EnableWindow(GetDlgItem(hwndDialog
, IDC_SAVEAS_BTN
),TRUE
);
545 /* Property page dialog callback */
558 hwndDialog
= hwndDlg
;
562 // initialization failed
564 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
567 if (!CreateEnergyList(GetDlgItem(hwndDlg
, IDC_ENERGYLIST
)))
570 // initialization failed
572 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
576 switch(LOWORD(wParam
))
579 if (HIWORD(wParam
) == CBN_SELCHANGE
)
582 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
595 case IDC_MONITORACLIST
:
596 case IDC_MONITORDCLIST
:
599 case IDC_STANDBYACLIST
:
600 case IDC_STANDBYDCLIST
:
601 case IDC_HYBERNATEACLIST
:
602 case IDC_HYBERNATEDCLIST
:
603 if (HIWORD(wParam
) == CBN_SELCHANGE
)
605 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
612 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
613 if (lpnm
->code
== (UINT
)PSN_APPLY
)
615 Pos_SaveData(hwndDlg
);