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@student.tugraz.at)
9 * Dmitry Chapyshev (lentind@yandex.ru)
39 #define MAX_POWER_POLICY 20
41 POWER_POLICY gPP
[MAX_POWER_POLICY
];
49 SYSTEM_POWER_CAPABILITIES spc
;
51 RECT rectCtl, rectDlg, rectCtl2;
55 if (GetWindowRect(hPos,&rectDlg))
57 if (GetWindowRect(GetDlgItem(hPos, IDC_SAT),&rectCtl2))
59 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITOR),&rectCtl))
61 movetop=rectCtl.top - rectCtl2.top;
62 MoveWindow(GetDlgItem(hPos, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
63 if (GetWindowRect(GetDlgItem(hPos, IDC_DISK),&rectCtl))
65 MoveWindow(GetDlgItem(hPos, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
67 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBY),&rectCtl))
69 MoveWindow(GetDlgItem(hPos, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
71 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATE),&rectCtl))
73 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
75 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORDCLIST),&rectCtl2))
78 if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORACLIST),&rectCtl))
80 moveright=rectCtl.right - rectCtl2.right;
81 MoveWindow(GetDlgItem(hPos, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
82 if (GetWindowRect(GetDlgItem(hPos, IDC_DISKACLIST),&rectCtl))
84 MoveWindow(GetDlgItem(hPos, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
86 if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBYACLIST),&rectCtl))
88 MoveWindow(GetDlgItem(hPos, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
90 if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATEACLIST),&rectCtl))
92 MoveWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
95 if (GetWindowRect(GetDlgItem(hPos, IDC_GRPDETAIL),&rectCtl))
97 MoveWindow(GetDlgItem(hPos, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
106 if (!GetPwrCapabilities(&spc
))
111 if (!spc
.SystemBatteriesPresent
)
113 ShowWindow(GetDlgItem(hPos
, IDC_SAT
),FALSE
);
114 ShowWindow(GetDlgItem(hPos
, IDC_IAC
),FALSE
);
115 ShowWindow(GetDlgItem(hPos
, IDC_SAC
),FALSE
);
116 ShowWindow(GetDlgItem(hPos
, IDC_IDC
),FALSE
);
117 ShowWindow(GetDlgItem(hPos
, IDC_SDC
),FALSE
);
118 ShowWindow(GetDlgItem(hPos
, IDC_MONITORDCLIST
),FALSE
);
119 ShowWindow(GetDlgItem(hPos
, IDC_DISKDCLIST
),FALSE
);
120 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
),FALSE
);
121 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
),FALSE
);
122 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), spc
.HiberFilePresent
);
127 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEDCLIST
), spc
.HiberFilePresent
);
128 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATEACLIST
), FALSE
);
132 if (!(spc
.SystemS1
||spc
.SystemS2
|| spc
.SystemS3
))
134 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYACLIST
), TRUE
);
135 ShowWindow(GetDlgItem(hPos
, IDC_STANDBYDCLIST
), TRUE
);
136 ShowWindow(GetDlgItem(hPos
, IDC_STANDBY
), TRUE
);
139 ShowWindow(GetDlgItem(hPos
, IDC_HYBERNATE
), spc
.HiberFilePresent
);
146 LoadConfig(HWND hwndDlg
)
150 TCHAR szProfile
[MAX_PATH
];
151 TCHAR szTemp
[MAX_PATH
];
152 TCHAR szConfig
[MAX_PATH
];
155 iCurSel
= (INT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
159 if (iCurSel
== CB_ERR
)
162 memcpy(&pp
, &gPP
[iCurSel
], sizeof(POWER_POLICY
));
164 uiIndex
= (UINT
)SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETCURSEL
, 0, 0);
165 if(uiIndex
!= (UINT
)CB_ERR
)
167 SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
, CB_GETLBTEXT
, uiIndex
, (LPARAM
)szProfile
);
168 if(LoadString(hApplet
, IDS_CONFIG1
, szTemp
, MAX_PATH
))
170 _stprintf(szConfig
,szTemp
,szProfile
);
171 SetWindowText(GetDlgItem(hwndDlg
, IDC_GRPDETAIL
),szConfig
);
177 if (Sec
[i
]==pp
.user
.VideoTimeoutAc
)
179 SendDlgItemMessage(hwndDlg
, IDC_MONITORACLIST
,
185 if (Sec
[i
]==pp
.user
.VideoTimeoutDc
)
187 SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
192 if (Sec
[i
]==pp
.user
.SpindownTimeoutAc
)
194 SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
199 if (Sec
[i
]==pp
.user
.SpindownTimeoutDc
) // IdleTimeoutDc)
201 SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
206 if (Sec
[i
]==pp
.user
.IdleTimeoutAc
)
208 SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
213 if (Sec
[i
]==pp
.user
.IdleTimeoutDc
)
215 SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
221 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutAc
)
223 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
228 if (Sec
[i
]==pp
.mach
.DozeS4TimeoutDc
)
230 SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
240 callback_EnumPwrScheme(UINT uiIndex
, DWORD dwName
, LPTSTR sName
, DWORD dwDesc
,
241 LPWSTR sDesc
, PPOWER_POLICY pp
,LPARAM lParam
)
245 UNREFERENCED_PARAMETER(lParam
);
246 UNREFERENCED_PARAMETER(sDesc
);
247 UNREFERENCED_PARAMETER(dwDesc
);
248 UNREFERENCED_PARAMETER(dwName
);
250 if (ValidatePowerPolicies(0,pp
))
252 if (guiIndex
>= MAX_POWER_POLICY
)
255 // Implement store power policy dynamically
260 memcpy(&gPP
[guiIndex
], pp
, sizeof(POWER_POLICY
));
263 index
= (int) SendMessage(hList
,
281 LoadConfig(GetParent(hList
));
289 Pos_InitPage(HWND hwndDlg
)
291 int ifrom
=0,i
=0,imin
=0;
293 TCHAR szName
[MAX_PATH
];
301 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORACLIST
);
305 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYACLIST
);
309 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKACLIST
);
313 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEACLIST
);
317 hwnd
=GetDlgItem(hwndDlg
, IDC_MONITORDCLIST
);
321 hwnd
=GetDlgItem(hwndDlg
, IDC_STANDBYDCLIST
);
325 hwnd
=GetDlgItem(hwndDlg
, IDC_DISKDCLIST
);
329 hwnd
=GetDlgItem(hwndDlg
, IDC_HYBERNATEDCLIST
);
335 for (ifrom
=imin
;ifrom
<(IDS_TIMEOUT15
+1);ifrom
++)
337 if (LoadString(hApplet
, ifrom
, szName
, MAX_PATH
))
339 index
= SendMessage(hwnd
,
350 (LPARAM
)Sec
[ifrom
-IDS_TIMEOUT16
]);
353 if (LoadString(hApplet
, IDS_TIMEOUT16
, szName
, MAX_PATH
))
355 index
= SendMessage(hwnd
,
372 Pos_SaveData(HWND hwndDlg
)
376 iCurSel
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_ENERGYLIST
,
380 if (iCurSel
== CB_ERR
)
383 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
387 if (tmp
> 0 && tmp
< 16)
389 gPP
[iCurSel
].user
.VideoTimeoutAc
= Sec
[tmp
];
391 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_MONITORDCLIST
,
395 if (tmp
> 0 && tmp
< 16)
397 gPP
[iCurSel
].user
.VideoTimeoutDc
= Sec
[tmp
];
399 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKACLIST
,
403 if (tmp
> 0 && tmp
< 16)
405 gPP
[iCurSel
].user
.SpindownTimeoutAc
= Sec
[tmp
+2];
407 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_DISKDCLIST
,
411 if (tmp
> 0 && tmp
< 16)
413 gPP
[iCurSel
].user
.SpindownTimeoutDc
= Sec
[tmp
+2];
415 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYACLIST
,
419 if (tmp
> 0 && tmp
< 16)
421 gPP
[iCurSel
].user
.IdleTimeoutAc
= Sec
[tmp
];
423 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_STANDBYDCLIST
,
427 if (tmp
> 0 && tmp
< 16)
429 gPP
[iCurSel
].user
.IdleTimeoutDc
= Sec
[tmp
];
431 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEACLIST
,
435 if (tmp
> 0 && tmp
< 16)
437 gPP
[iCurSel
].mach
.DozeS4TimeoutAc
= Sec
[tmp
];
439 tmp
= (INT
) SendDlgItemMessage(hwndDlg
, IDC_HYBERNATEDCLIST
,
443 if (tmp
> 0 && tmp
< 16)
445 gPP
[iCurSel
].mach
.DozeS4TimeoutDc
= Sec
[tmp
];
448 SetActivePwrScheme(iCurSel
,NULL
,&gPP
[iCurSel
]);
458 TCHAR szBuf
[1024], szBufT
[1024];
461 hList
= GetDlgItem(hwnd
, IDC_ENERGYLIST
);
463 iCurSel
= SendMessage(hList
, CB_GETCURSEL
, 0, 0);
464 if (iCurSel
== CB_ERR
) return FALSE
;
466 SendMessage(hList
, CB_SETCURSEL
, iCurSel
, 0);
468 DelScheme
= SendMessage(hList
, CB_GETITEMDATA
, (WPARAM
)iCurSel
, 0);
469 if (DelScheme
== (UINT
)CB_ERR
) return FALSE
;
471 LoadString(hApplet
, IDS_DEL_SCHEME_TITLE
, szBufT
, sizeof(szBufT
) / sizeof(TCHAR
));
472 LoadString(hApplet
, IDS_DEL_SCHEME
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
474 if (MessageBox(hwnd
, (LPCTSTR
)szBuf
, (LPCTSTR
)szBufT
, MB_OKCANCEL
| MB_ICONQUESTION
) == IDOK
)
478 if (GetActivePwrScheme(&Current
))
480 SendMessage(hList
, CB_SETCURSEL
, (WPARAM
)0, 0);
481 SendMessage(hList
, CB_DELETESTRING
, (WPARAM
)iCurSel
, 0);
482 if (Current
== DelScheme
) Pos_SaveData(hwnd
);
485 if (DeletePwrScheme(DelScheme
) != 0) return TRUE
;
493 CreateEnergyList(HWND hwnd
)
497 SYSTEM_POWER_CAPABILITIES spc
;
501 if (!GetActivePwrScheme(&aps
))
504 if (!ReadGlobalPwrPolicy(&gGPP
))
507 if (!ReadPwrScheme(aps
,&pp
))
510 if (!ValidatePowerPolicies(&gGPP
,0))
514 if (!SetActivePwrScheme(aps,&gGPP,&pp))
518 if (!GetPwrCapabilities(&spc
))
521 if (CanUserWritePwrScheme())
524 // Enable write / delete powerscheme button
527 Pos_InitPage(GetParent(hwnd
));
529 if (!GetActivePwrScheme(&aps
))
532 retval
= EnumPwrSchemes(callback_EnumPwrScheme
, aps
);
534 if(SendMessage(hwnd
, CB_GETCOUNT
, 0, 0) > 0)
536 EnableWindow(GetDlgItem(hwndDialog
, IDC_DELETE_BTN
),TRUE
);
537 EnableWindow(GetDlgItem(hwndDialog
, IDC_SAVEAS_BTN
),TRUE
);
544 /* Property page dialog callback */
557 hwndDialog
= hwndDlg
;
561 // Initialization failed
563 MessageBox(hwndDlg
,_T("Pos_InitData failed\n"), NULL
, MB_OK
);
566 if (!CreateEnergyList(GetDlgItem(hwndDlg
, IDC_ENERGYLIST
)))
569 // Initialization failed
571 MessageBox(hwndDlg
,_T("CreateEnergyList failed\n"), NULL
, MB_OK
);
575 switch(LOWORD(wParam
))
578 if (HIWORD(wParam
) == CBN_SELCHANGE
)
581 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
594 case IDC_MONITORACLIST
:
595 case IDC_MONITORDCLIST
:
598 case IDC_STANDBYACLIST
:
599 case IDC_STANDBYDCLIST
:
600 case IDC_HYBERNATEACLIST
:
601 case IDC_HYBERNATEDCLIST
:
602 if (HIWORD(wParam
) == CBN_SELCHANGE
)
604 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
611 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
612 if (lpnm
->code
== (UINT
)PSN_APPLY
)
614 Pos_SaveData(hwndDlg
);