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)
46 #define MAX_POWER_POLICY 20
48 POWER_POLICY gPP
[MAX_POWER_POLICY
];
56 SYSTEM_POWER_CAPABILITIES spc
;
58 RECT rectCtl, rectDlg, rectCtl2;
62 if (GetWindowRect(hPos,&rectDlg))
64 if (GetWindowRect(GetDlgItem(hPos, IDC_SAT),&rectCtl2))
66 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITOR),&rectCtl))
68 movetop=rectCtl.top - rectCtl2.top;
69 MoveWindow(GetDlgItem(hPos, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
70 if (GetWindowRect(GetDlgItem(hPos, IDC_DISK),&rectCtl))
72 MoveWindow(GetDlgItem(hPos, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
74 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBY),&rectCtl))
76 MoveWindow(GetDlgItem(hPos, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
78 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATE),&rectCtl))
80 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
82 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORDCLIST),&rectCtl2))
85 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORACLIST),&rectCtl))
87 moveright=rectCtl.right - rectCtl2.right;
88 MoveWindow(GetDlgItem(hPos, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
89 if (GetWindowRect(GetDlgItem(hPos, IDC_DISKACLIST),&rectCtl))
91 MoveWindow(GetDlgItem(hPos, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
93 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBYACLIST),&rectCtl))
95 MoveWindow(GetDlgItem(hPos, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
97 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATEACLIST),&rectCtl))
99 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
102 if (GetWindowRect(GetDlgItem(hPos, IDC_GRPDETAIL),&rectCtl))
104 MoveWindow(GetDlgItem(hPos, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
113 if (!GetPwrCapabilities(&spc
))
118 if (!spc
.SystemBatteriesPresent
)
120 ShowWindow(GetDlgItem(hPos
, IDC_SAT
),FALSE
);
121 ShowWindow(GetDlgItem(hPos
, IDC_IAC
),FALSE
);
122 ShowWindow(GetDlgItem(hPos
, IDC_SAC
),FALSE
);
123 ShowWindow(GetDlgItem(hPos
, IDC_IDC
),FALSE
);
124 ShowWindow(GetDlgItem(hPos
, IDC_SDC
),FALSE
);
125 ShowWindow(GetDlgItem(hPos
, IDC_MONITORDCLIST
),FALSE
);
126 ShowWindow(GetDlgItem(hPos
, IDC_DISKDCLIST
),FALSE
);
127 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
),FALSE
);
128 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
),FALSE
);
129 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), spc
.HiberFilePresent
);
134 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
), spc
.HiberFilePresent
);
135 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), FALSE
);
139 if (!(spc
.SystemS1
||spc
.SystemS2
|| spc
.SystemS3
))
141 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYACLIST
), TRUE
);
142 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
), TRUE
);
143 ShowWindow(GetDlgItem(hPos
, IDC_STANDBY
), TRUE
);
146 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATE
), spc
.HiberFilePresent
);
153 LoadConfig(HWND hwndDlg
)
157 TCHAR szProfile
[MAX_PATH
];
158 TCHAR szTemp
[MAX_PATH
];
159 TCHAR szConfig
[MAX_PATH
];
162 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
166 if (iCurSel
== CB_ERR
)
169 memcpy(&pp
, &gPP
[iCurSel
], sizeof(POWER_POLICY
));
171 uiIndex
= (UINT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETCURSEL
, 0, 0);
172 if(uiIndex
!= (UINT
)CB_ERR
)
174 SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETLBTEXT
, uiIndex
, (LPARAM
)szProfile
);
175 if(LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
177 _stprintf(szConfig
,szTemp
,szProfile
);
178 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
),szConfig
);
184 if (Sec
[i
]==pp
.user
.VideoTimeoutAc
)
186 SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
192 if (Sec
[i
]==pp
.user
.VideoTimeoutDc
)
194 SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
199 if (Sec
[i
]==pp
.user
.SpindownTimeoutAc
)
201 SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
206 if (Sec
[i
]==pp
.user
.SpindownTimeoutDc
)//IdleTimeoutDc)
208 SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
213 if (Sec
[i
]==pp
.user
.IdleTimeoutAc
)
215 SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
220 if (Sec
[i
]==pp
.user
.IdleTimeoutDc
)
222 SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
228 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutAc
)
230 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
235 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutDc
)
237 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
247 callback_EnumPwrScheme(UINT uiIndex
, DWORD dwName
, LPTSTR sName
, DWORD dwDesc
,
248 LPWSTR sDesc
, PPOWER_POLICY pp
,LPARAM lParam
)
252 UNREFERENCED_PARAMETER(lParam
);
253 UNREFERENCED_PARAMETER(sDesc
);
254 UNREFERENCED_PARAMETER(dwDesc
);
255 UNREFERENCED_PARAMETER(dwName
);
257 if (ValidatePowerPolicies(0,pp
))
259 if (guiIndex
>= MAX_POWER_POLICY
)
262 //implement store power policy dynamically
267 memcpy(&gPP
[guiIndex
], pp
, sizeof(POWER_POLICY
));
270 index
= (int) SendMessage(hList
,
288 LoadConfig(GetParent(hList
));
296 Pos_InitPage(HWND hwndDlg
)
298 int ifrom
=0,i
=0,imin
=0;
300 TCHAR szName
[MAX_PATH
];
308 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
312 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
316 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
320 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
);
324 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
328 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
332 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
336 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
);
342 for (ifrom
=imin
;ifrom
<(IDS_TIMEOUT15
+1);ifrom
++)
344 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
346 index
= SendMessage(hwnd
,
357 (LPARAM
)Sec
[ifrom
-IDS_TIMEOUT16
]);
360 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
362 index
= SendMessage(hwnd
,
379 Pos_SaveData(HWND hwndDlg
)
383 iCurSel
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
387 if (iCurSel
== CB_ERR
)
390 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
394 if (tmp
> 0 && tmp
< 16)
396 gPP
[iCurSel
].user
.VideoTimeoutAc
= Sec
[tmp
];
398 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
402 if (tmp
> 0 && tmp
< 16)
404 gPP
[iCurSel
].user
.VideoTimeoutDc
= Sec
[tmp
];
406 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
410 if (tmp
> 0 && tmp
< 16)
412 gPP
[iCurSel
].user
.SpindownTimeoutAc
= Sec
[tmp
+2];
414 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
418 if (tmp
> 0 && tmp
< 16)
420 gPP
[iCurSel
].user
.SpindownTimeoutDc
= Sec
[tmp
+2];
422 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
426 if (tmp
> 0 && tmp
< 16)
428 gPP
[iCurSel
].user
.IdleTimeoutAc
= Sec
[tmp
];
430 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
434 if (tmp
> 0 && tmp
< 16)
436 gPP
[iCurSel
].user
.IdleTimeoutDc
= Sec
[tmp
];
438 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
442 if (tmp
> 0 && tmp
< 16)
444 gPP
[iCurSel
].mach
.DozeS4TimeoutAc
= Sec
[tmp
];
446 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
450 if (tmp
> 0 && tmp
< 16)
452 gPP
[iCurSel
].mach
.DozeS4TimeoutDc
= Sec
[tmp
];
455 SetActivePwrScheme(iCurSel
,NULL
,&gPP
[iCurSel
]);
465 TCHAR szBuf
[1024], szBufT
[1024];
468 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
470 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
471 if (iCurSel
== CB_ERR
) return FALSE
;
473 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
475 DelScheme
= SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
476 if (DelScheme
== (UINT
)CB_ERR
) return FALSE
;
478 LoadString(hApplet
, IDS_DEL_SCHEME_TITLE
, szBufT
, sizeof(szBufT
) / sizeof(TCHAR
));
479 LoadString(hApplet
, IDS_DEL_SCHEME
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
481 if (MessageBox(hwnd
, (LPCTSTR
)szBuf
, (LPCTSTR
)szBufT
, MB_OKCANCEL
| MB_ICONQUESTION
) == IDOK
)
485 if (GetActivePwrScheme(&Current
))
487 SendMessage(hList
, CB_SETCURSEL
, (WPARAM
)0, 0);
488 SendMessage(hList
, CB_DELETESTRING
, (WPARAM
)iCurSel
, 0);
489 if (Current
== DelScheme
) Pos_SaveData(hwnd
);
492 if (DeletePwrScheme(DelScheme
) != 0) return TRUE
;
500 CreateEnergyList(HWND hwnd
)
504 SYSTEM_POWER_CAPABILITIES spc
;
508 if (!GetActivePwrScheme(&aps
))
511 if (!ReadGlobalPwrPolicy(&gGPP
))
514 if (!ReadPwrScheme(aps
,&pp
))
517 if (!ValidatePowerPolicies(&gGPP
,0))
521 if (!SetActivePwrScheme(aps,&gGPP,&pp))
525 if (!GetPwrCapabilities(&spc
))
528 if (CanUserWritePwrScheme())
531 // enable write / delete powerscheme button
534 Pos_InitPage(GetParent(hwnd
));
536 if (!GetActivePwrScheme(&aps
))
539 retval
= EnumPwrSchemes(callback_EnumPwrScheme
, aps
);
541 if(SendMessage(hwnd
, CB_GETCOUNT
, 0, 0) > 0)
543 EnableWindow(GetDlgItem(hwndDialog
, IDC_DELETE_BTN
),TRUE
);
544 EnableWindow(GetDlgItem(hwndDialog
, IDC_SAVEAS_BTN
),TRUE
);
551 /* Property page dialog callback */
564 hwndDialog
= hwndDlg
;
568 // initialization failed
570 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
573 if (!CreateEnergyList(GetDlgItem(hwndDlg
, IDC_ENERGYLIST
)))
576 // initialization failed
578 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
582 switch(LOWORD(wParam
))
585 if (HIWORD(wParam
) == CBN_SELCHANGE
)
588 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
601 case IDC_MONITORACLIST
:
602 case IDC_MONITORDCLIST
:
605 case IDC_STANDBYACLIST
:
606 case IDC_STANDBYDCLIST
:
607 case IDC_HYBERNATEACLIST
:
608 case IDC_HYBERNATEDCLIST
:
609 if (HIWORD(wParam
) == CBN_SELCHANGE
)
611 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
618 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
619 if (lpnm
->code
== (UINT
)PSN_APPLY
)
621 Pos_SaveData(hwndDlg
);