[POWERCFG] Do not re-initialize all paged directly when the hibernate file setting...
[reactos.git] / dll / cpl / powercfg / hibernate.c
1 /*
2 * PROJECT: ReactOS Power Configuration Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/powercfg/hibernate.c
5 * PURPOSE: hibernate tab of applet
6 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net)
7 * Johannes Anderwald (johannes.anderwald@reactos.org)
8 * Martin Rottensteiner
9 * Dmitry Chapyshev (lentind@yandex.ru)
10 */
11
12 #include "powercfg.h"
13
14 static VOID
15 Hib_InitDialog(HWND hwndDlg)
16 {
17 SYSTEM_POWER_CAPABILITIES PowerCaps;
18 MEMORYSTATUSEX msex;
19 TCHAR szTemp[MAX_PATH];
20 LPTSTR lpRoot;
21 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;
22
23 if (GetPwrCapabilities(&PowerCaps))
24 {
25 CheckDlgButton(hwndDlg,
26 IDC_HIBERNATEFILE,
27 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
28
29 msex.dwLength = sizeof(msex);
30 if (!GlobalMemoryStatusEx(&msex))
31 {
32 return; // FIXME
33 }
34
35 if (GetWindowsDirectory(szTemp,MAX_PATH))
36 lpRoot = szTemp;
37 else
38 lpRoot = NULL;
39
40 // Get available space and size of selected volume.
41 if (!GetDiskFreeSpaceEx(lpRoot, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
42 TotalNumberOfFreeBytes.QuadPart = 0;
43
44 // Print the free available space into selected volume.
45 StrFormatByteSize(TotalNumberOfFreeBytes.QuadPart, szTemp, _countof(szTemp));
46 SetDlgItemText(hwndDlg, IDC_FREESPACE, szTemp);
47
48 // Print the amount of space required for hibernation.
49 StrFormatByteSize(msex.ullTotalPhys, szTemp, _countof(szTemp));
50 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szTemp);
51
52 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
53 {
54 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
55 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
56 }
57 else
58 {
59 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
60 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
61 }
62 }
63 }
64
65 INT_PTR
66 Hib_SaveData(HWND hwndDlg)
67 {
68 BOOLEAN bHibernate;
69
70 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
71
72 if (CallNtPowerInformation(SystemReserveHiberFile, &bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
73 {
74 Hib_InitDialog(hwndDlg);
75 return TRUE;
76 }
77
78 return FALSE;
79 }
80
81 /* Property page dialog callback */
82 INT_PTR CALLBACK
83 HibernateDlgProc(HWND hwndDlg,
84 UINT uMsg,
85 WPARAM wParam,
86 LPARAM lParam)
87 {
88 switch (uMsg)
89 {
90 case WM_INITDIALOG:
91 Hib_InitDialog(hwndDlg);
92 return TRUE;
93
94 case WM_COMMAND:
95 switch (LOWORD(wParam))
96 {
97 case IDC_HIBERNATEFILE:
98 if (HIWORD(wParam) == BN_CLICKED)
99 {
100 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
101 }
102 break;
103 }
104 break;
105
106 case WM_NOTIFY:
107 if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
108 {
109 return Hib_SaveData(hwndDlg);
110 }
111 break;
112 }
113
114 return FALSE;
115 }