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
8 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
13 #define MAX_SCREENSAVERS 100
15 void AddListViewItems2();
16 void CheckRegScreenSaverIsSecure();
19 BOOL bIsScreenSaver
; /* Is this background a wallpaper */
20 TCHAR szFilename
[MAX_PATH
];
21 TCHAR szDisplayName
[256];
24 int ImageListSelection
= 0;
25 ScreenSaverItem g_ScreenSaverItems
[MAX_SCREENSAVERS
];
27 HWND g_hScreenBackgroundPage
= NULL
;
28 HWND g_hScreengroundList
= NULL
;
29 HWND ControlScreenSaverIsSecure
= NULL
;
31 void ListViewItemAreChanged(int itemIndex
)
33 ScreenSaverItem
*ScreenSaverItem
= NULL
;
35 ImageListSelection
= itemIndex
;
36 ScreenSaverItem
= &g_ScreenSaverItems
[ImageListSelection
];
38 PropSheet_Changed(GetParent(g_hScreenBackgroundPage
), g_hScreenBackgroundPage
);
43 ScreenSaverPageProc(HWND hwndDlg
,
48 g_hScreenBackgroundPage
= hwndDlg
;
53 g_hScreengroundList
= GetDlgItem(g_hScreenBackgroundPage
, IDC_SCREENS_CHOICES
);
55 CheckRegScreenSaverIsSecure();
59 DWORD controlId
= LOWORD(wParam
);
60 DWORD command
= HIWORD(wParam
);
63 case IDC_SCREENS_POWER_BUTTON
: // Start Powercfg.Cpl
65 if(command
== BN_CLICKED
)
66 WinExec("rundll32 shell32.dll,Control_RunDLL powercfg.cpl,,",SW_SHOWNORMAL
);
68 case IDC_SCREENS_TESTSC
: // Screensaver Preview
70 if(command
== BN_CLICKED
)
71 MessageBox(NULL
, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK
);
74 case IDC_SCREENS_DELETE
: // Delete Screensaver
76 if(command
== BN_CLICKED
) {
77 if (ImageListSelection
== 0) // Can NOT delete None sry:-)
79 DeleteFileW(g_ScreenSaverItems
[ImageListSelection
].szFilename
);
82 case IDC_SCREENS_SETTINGS
: // Screensaver Settings
84 if(command
== BN_CLICKED
)
85 MessageBox(NULL
, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK
);
87 case IDC_SCREENS_USEPASSCHK
: // Screensaver Is Secure
89 if(command
== BN_CLICKED
)
90 MessageBox(NULL
, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK
);
92 case IDC_SCREENS_TIME
: // Delay before show screensaver
101 LPNMHDR lpnm
= (LPNMHDR
)lParam
;
108 case LVN_ITEMCHANGED
:
110 LPNMLISTVIEW nm
= (LPNMLISTVIEW
)lParam
;
111 if((nm
->uNewState
& LVIS_SELECTED
) == 0)
113 ListViewItemAreChanged(nm
->iItem
);
125 void CheckRegScreenSaverIsSecure()
129 DWORD bufferSize
= sizeof(szBuffer
);
130 DWORD varType
= REG_SZ
;
133 ControlScreenSaverIsSecure
= GetDlgItem(g_hScreenBackgroundPage
, IDC_SCREENS_USEPASSCHK
);
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);
142 SendMessage(ControlScreenSaverIsSecure
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, 0);
147 /* Add the bitmaps in the C:\ReactOS directory and the current wallpaper if any */
148 void AddListViewItems2()
152 TCHAR szSearchPath
[MAX_PATH
];
159 HIMAGELIST g_hScreenShellImageList
= NULL
;
160 TCHAR wallpaperFilename
[MAX_PATH
];
161 DWORD bufferSize
= sizeof(wallpaperFilename
);
162 DWORD varType
= REG_SZ
;
165 int g_ScreenlistViewItemCount
= 0;
166 ScreenSaverItem
*ScreenSaverItem
= NULL
;
168 GetClientRect(g_hScreengroundList
, &clientRect
);
170 ZeroMemory(&dummy
, sizeof(LV_COLUMN
));
171 dummy
.mask
= LVCF_SUBITEM
| LVCF_WIDTH
;
173 dummy
.cx
= (clientRect
.right
- clientRect
.left
) - GetSystemMetrics(SM_CXVSCROLL
);
175 ListView_InsertColumn(g_hScreengroundList
, 0, &dummy
);
177 /* Add the "None" item */
178 ScreenSaverItem
= &g_ScreenSaverItems
[g_ScreenlistViewItemCount
];
180 ScreenSaverItem
->bIsScreenSaver
= FALSE
;
184 ScreenSaverItem
->szDisplayName
,
185 sizeof(ScreenSaverItem
->szDisplayName
) / sizeof(TCHAR
));
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
;
195 ListView_InsertItem(g_hScreengroundList
, &listItem
);
196 ListView_SetItemState(g_hScreengroundList
, g_ScreenlistViewItemCount
, LVIS_SELECTED
, LVIS_SELECTED
);
198 g_ScreenlistViewItemCount
++;
200 /* Add current screensaver if any */
201 RegOpenKeyEx(HKEY_CURRENT_USER
, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS
, ®Key
);
203 result
= RegQueryValueEx(regKey
, TEXT("SCRNSAVE.EXE"), 0, &varType
, (LPBYTE
)wallpaperFilename
, &bufferSize
);
205 if((result
== ERROR_SUCCESS
) && (_tcslen(wallpaperFilename
) > 0))
207 himl
= (HIMAGELIST
)SHGetFileInfo(wallpaperFilename
,
211 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
|
218 g_hScreenShellImageList
= himl
;
219 ListView_SetImageList(g_hScreengroundList
, himl
, LVSIL_SMALL
);
222 ScreenSaverItem
= &g_ScreenSaverItems
[g_ScreenlistViewItemCount
];
224 ScreenSaverItem
->bIsScreenSaver
= TRUE
;
226 _tcscpy(ScreenSaverItem
->szDisplayName
, sfi
.szDisplayName
);
227 _tcscpy(ScreenSaverItem
->szFilename
, wallpaperFilename
);
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
;
237 ListView_InsertItem(g_hScreengroundList
, &listItem
);
238 ListView_SetItemState(g_hScreengroundList
, g_ScreenlistViewItemCount
, LVIS_SELECTED
, LVIS_SELECTED
);
240 g_ScreenlistViewItemCount
++;
246 /* Add all the screensavers in the C:\ReactOS\System32 directory. */
248 GetSystemDirectory(szSearchPath
, MAX_PATH
);
249 _tcscat(szSearchPath
, TEXT("\\*.scr"));
251 hFind
= FindFirstFile(szSearchPath
, &fd
);
252 while(hFind
!= INVALID_HANDLE_VALUE
)
254 /* Don't add any hidden screensavers */
255 if((fd
.dwFileAttributes
& FILE_ATTRIBUTE_HIDDEN
) == 0)
257 TCHAR filename
[MAX_PATH
];
259 GetSystemDirectory(filename
, MAX_PATH
);
261 _tcscat(filename
, TEXT("\\"));
262 _tcscat(filename
, fd
.cFileName
);
264 himl
= (HIMAGELIST
)SHGetFileInfo(filename
,
268 SHGFI_SYSICONINDEX
| SHGFI_SMALLICON
|
278 g_hScreenShellImageList
= himl
;
279 ListView_SetImageList(g_hScreengroundList
, himl
, LVSIL_SMALL
);
282 ScreenSaverItem
= &g_ScreenSaverItems
[g_ScreenlistViewItemCount
];
284 ScreenSaverItem
->bIsScreenSaver
= TRUE
;
286 _tcscpy(ScreenSaverItem
->szDisplayName
, sfi
.szDisplayName
);
287 _tcscpy(ScreenSaverItem
->szFilename
, filename
);
289 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
290 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
291 listItem
.pszText
= ScreenSaverItem
->szDisplayName
;
293 listItem
.iImage
= sfi
.iIcon
;
294 listItem
.iItem
= g_ScreenlistViewItemCount
;
295 listItem
.lParam
= g_ScreenlistViewItemCount
;
297 ListView_InsertItem(g_hScreengroundList
, &listItem
);
299 g_ScreenlistViewItemCount
++;
302 if(!FindNextFile(hFind
, &fd
))
303 hFind
= INVALID_HANDLE_VALUE
;