move more dlls
[reactos.git] / reactos / dll / cpl / desk / screensaver.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Display Control Panel
5 * FILE: lib/cpl/desk/screensaver.c
6 * PURPOSE: Screen saver property page
7 *
8 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
9 */
10
11 #include "desk.h"
12
13 #define MAX_SCREENSAVERS 100
14
15 void AddListViewItems2();
16 void CheckRegScreenSaverIsSecure();
17
18 typedef struct {
19 BOOL bIsScreenSaver; /* Is this background a wallpaper */
20 TCHAR szFilename[MAX_PATH];
21 TCHAR szDisplayName[256];
22 } ScreenSaverItem;
23
24 int ImageListSelection = 0;
25 ScreenSaverItem g_ScreenSaverItems[MAX_SCREENSAVERS];
26
27 HWND g_hScreenBackgroundPage = NULL;
28 HWND g_hScreengroundList = NULL;
29 HWND ControlScreenSaverIsSecure = NULL;
30
31 void ListViewItemAreChanged(int itemIndex)
32 {
33 ScreenSaverItem *ScreenSaverItem = NULL;
34
35 ImageListSelection = itemIndex;
36 ScreenSaverItem = &g_ScreenSaverItems[ImageListSelection];
37
38 PropSheet_Changed(GetParent(g_hScreenBackgroundPage), g_hScreenBackgroundPage);
39 }
40
41 INT_PTR
42 CALLBACK
43 ScreenSaverPageProc(HWND hwndDlg,
44 UINT uMsg,
45 WPARAM wParam,
46 LPARAM lParam)
47 {
48 g_hScreenBackgroundPage = hwndDlg;
49
50 switch(uMsg) {
51 case WM_INITDIALOG:
52 {
53 g_hScreengroundList = GetDlgItem(g_hScreenBackgroundPage, IDC_SCREENS_CHOICES);
54 AddListViewItems2();
55 CheckRegScreenSaverIsSecure();
56 } break;
57 case WM_COMMAND:
58 {
59 DWORD controlId = LOWORD(wParam);
60 DWORD command = HIWORD(wParam);
61
62 switch(controlId) {
63 case IDC_SCREENS_POWER_BUTTON: // Start Powercfg.Cpl
64 {
65 if(command == BN_CLICKED)
66 WinExec("rundll32 shell32.dll,Control_RunDLL powercfg.cpl,,",SW_SHOWNORMAL);
67 } break;
68 case IDC_SCREENS_TESTSC: // Screensaver Preview
69 {
70 if(command == BN_CLICKED)
71 MessageBox(NULL, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK);
72
73 } break;
74 case IDC_SCREENS_DELETE: // Delete Screensaver
75 {
76 if(command == BN_CLICKED) {
77 if (ImageListSelection == 0) // Can NOT delete None sry:-)
78 return FALSE;
79 DeleteFileW(g_ScreenSaverItems[ImageListSelection].szFilename);
80 }
81 } break;
82 case IDC_SCREENS_SETTINGS: // Screensaver Settings
83 {
84 if(command == BN_CLICKED)
85 MessageBox(NULL, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK);
86 } break;
87 case IDC_SCREENS_USEPASSCHK: // Screensaver Is Secure
88 {
89 if(command == BN_CLICKED)
90 MessageBox(NULL, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK);
91 } break;
92 case IDC_SCREENS_TIME: // Delay before show screensaver
93 {
94 } break;
95 default:
96 break;
97 } break;
98 }
99 case WM_NOTIFY:
100 {
101 LPNMHDR lpnm = (LPNMHDR)lParam;
102
103 switch(lpnm->code) {
104 case PSN_APPLY:
105 {
106 return TRUE;
107 } break;
108 case LVN_ITEMCHANGED:
109 {
110 LPNMLISTVIEW nm = (LPNMLISTVIEW)lParam;
111 if((nm->uNewState & LVIS_SELECTED) == 0)
112 return FALSE;
113 ListViewItemAreChanged(nm->iItem);
114 break;
115 } break;
116 default:
117 break;
118 }
119 } break;
120 }
121
122 return FALSE;
123 }
124
125 void CheckRegScreenSaverIsSecure()
126 {
127 HKEY hKey;
128 TCHAR szBuffer[2];
129 DWORD bufferSize = sizeof(szBuffer);
130 DWORD varType = REG_SZ;
131 LONG result;
132
133 ControlScreenSaverIsSecure = GetDlgItem(g_hScreenBackgroundPage, IDC_SCREENS_USEPASSCHK);
134
135 RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &hKey);
136 result = RegQueryValueEx(hKey, TEXT("ScreenSaverIsSecure"), 0, &varType, (LPBYTE)szBuffer, &bufferSize);
137 if(result == ERROR_SUCCESS)
138 if(_ttoi(szBuffer) == 1) {
139 SendMessage(ControlScreenSaverIsSecure, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
140 goto End;
141 }
142 SendMessage(ControlScreenSaverIsSecure, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
143 End:
144 RegCloseKey(hKey);
145 }
146
147 /* Add the bitmaps in the C:\ReactOS directory and the current wallpaper if any */
148 void AddListViewItems2()
149 {
150 WIN32_FIND_DATA fd;
151 HANDLE hFind;
152 TCHAR szSearchPath[MAX_PATH];
153 LV_ITEM listItem;
154 LV_COLUMN dummy;
155 RECT clientRect;
156 HKEY regKey;
157 SHFILEINFO sfi;
158 HIMAGELIST himl;
159 HIMAGELIST g_hScreenShellImageList = NULL;
160 TCHAR wallpaperFilename[MAX_PATH];
161 DWORD bufferSize = sizeof(wallpaperFilename);
162 DWORD varType = REG_SZ;
163 LONG result;
164 UINT i = 0;
165 int g_ScreenlistViewItemCount = 0;
166 ScreenSaverItem *ScreenSaverItem = NULL;
167
168 GetClientRect(g_hScreengroundList, &clientRect);
169
170 ZeroMemory(&dummy, sizeof(LV_COLUMN));
171 dummy.mask = LVCF_SUBITEM | LVCF_WIDTH;
172 dummy.iSubItem = 0;
173 dummy.cx = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL);
174
175 ListView_InsertColumn(g_hScreengroundList, 0, &dummy);
176
177 /* Add the "None" item */
178 ScreenSaverItem = &g_ScreenSaverItems[g_ScreenlistViewItemCount];
179
180 ScreenSaverItem->bIsScreenSaver = FALSE;
181
182 LoadString(hApplet,
183 IDS_NONE,
184 ScreenSaverItem->szDisplayName,
185 sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR));
186
187 ZeroMemory(&listItem, sizeof(LV_ITEM));
188 listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
189 listItem.state = LVIS_SELECTED;
190 listItem.pszText = ScreenSaverItem->szDisplayName;
191 listItem.iImage = -1;
192 listItem.iItem = g_ScreenlistViewItemCount;
193 listItem.lParam = g_ScreenlistViewItemCount;
194
195 ListView_InsertItem(g_hScreengroundList, &listItem);
196 ListView_SetItemState(g_hScreengroundList, g_ScreenlistViewItemCount, LVIS_SELECTED, LVIS_SELECTED);
197
198 g_ScreenlistViewItemCount++;
199
200 /* Add current screensaver if any */
201 RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
202
203 result = RegQueryValueEx(regKey, TEXT("SCRNSAVE.EXE"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize);
204
205 if((result == ERROR_SUCCESS) && (_tcslen(wallpaperFilename) > 0))
206 {
207 himl = (HIMAGELIST)SHGetFileInfo(wallpaperFilename,
208 0,
209 &sfi,
210 sizeof(sfi),
211 SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
212 SHGFI_DISPLAYNAME);
213
214 if(himl != NULL)
215 {
216 if(i++ == 0)
217 {
218 g_hScreenShellImageList = himl;
219 ListView_SetImageList(g_hScreengroundList, himl, LVSIL_SMALL);
220 }
221
222 ScreenSaverItem = &g_ScreenSaverItems[g_ScreenlistViewItemCount];
223
224 ScreenSaverItem->bIsScreenSaver = TRUE;
225
226 _tcscpy(ScreenSaverItem->szDisplayName, sfi.szDisplayName);
227 _tcscpy(ScreenSaverItem->szFilename, wallpaperFilename);
228
229 ZeroMemory(&listItem, sizeof(LV_ITEM));
230 listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
231 listItem.state = LVIS_SELECTED;
232 listItem.pszText = ScreenSaverItem->szDisplayName;
233 listItem.iImage = sfi.iIcon;
234 listItem.iItem = g_ScreenlistViewItemCount;
235 listItem.lParam = g_ScreenlistViewItemCount;
236
237 ListView_InsertItem(g_hScreengroundList, &listItem);
238 ListView_SetItemState(g_hScreengroundList, g_ScreenlistViewItemCount, LVIS_SELECTED, LVIS_SELECTED);
239
240 g_ScreenlistViewItemCount++;
241 }
242 }
243
244 RegCloseKey(regKey);
245
246 /* Add all the screensavers in the C:\ReactOS\System32 directory. */
247
248 GetSystemDirectory(szSearchPath, MAX_PATH);
249 _tcscat(szSearchPath, TEXT("\\*.scr"));
250
251 hFind = FindFirstFile(szSearchPath, &fd);
252 while(hFind != INVALID_HANDLE_VALUE)
253 {
254 /* Don't add any hidden screensavers */
255 if((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
256 {
257 TCHAR filename[MAX_PATH];
258
259 GetSystemDirectory(filename, MAX_PATH);
260
261 _tcscat(filename, TEXT("\\"));
262 _tcscat(filename, fd.cFileName);
263
264 himl = (HIMAGELIST)SHGetFileInfo(filename,
265 0,
266 &sfi,
267 sizeof(sfi),
268 SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
269 SHGFI_DISPLAYNAME);
270
271 if(himl == NULL)
272 {
273 break;
274 }
275
276 if(i++ == 0)
277 {
278 g_hScreenShellImageList = himl;
279 ListView_SetImageList(g_hScreengroundList, himl, LVSIL_SMALL);
280 }
281
282 ScreenSaverItem = &g_ScreenSaverItems[g_ScreenlistViewItemCount];
283
284 ScreenSaverItem->bIsScreenSaver = TRUE;
285
286 _tcscpy(ScreenSaverItem->szDisplayName, sfi.szDisplayName);
287 _tcscpy(ScreenSaverItem->szFilename, filename);
288
289 ZeroMemory(&listItem, sizeof(LV_ITEM));
290 listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
291 listItem.pszText = ScreenSaverItem->szDisplayName;
292 listItem.state = 0;
293 listItem.iImage = sfi.iIcon;
294 listItem.iItem = g_ScreenlistViewItemCount;
295 listItem.lParam = g_ScreenlistViewItemCount;
296
297 ListView_InsertItem(g_hScreengroundList, &listItem);
298
299 g_ScreenlistViewItemCount++;
300 }
301
302 if(!FindNextFile(hFind, &fd))
303 hFind = INVALID_HANDLE_VALUE;
304 }
305 }
306