ReactOS  0.4.13-dev-242-g611e6d7
settings.c
Go to the documentation of this file.
1 /*
2  * Star field screensaver
3  *
4  * Copyright 2011 Carlo Bramini
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #define WIN32_LEAN_AND_MEAN
22 #include <windows.h>
23 #include <tchar.h>
24 #include <commctrl.h>
25 #include <shellapi.h>
26 
27 #include "resource.h"
28 #include "settings.h"
29 
30 #define SIZEOF(_v) (sizeof(_v) / sizeof(*_v))
31 
32 // Options for the starfield
34 
35 // Factory default settings.
36 static const SSSTARS FactoryDefaults = {
37  MAX_STARS,
38  20,
40 
41  TRUE,
42  TRUE,
43  TRUE,
44  TRUE
45 };
46 
47 static const DWORD RotoStrings[] = {
51 };
52 
53 static DWORD QueryDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD Default)
54 {
55  DWORD dwData, dwType, cbData;
56  LONG lRes;
57 
58  dwType = REG_DWORD;
59  cbData = sizeof(DWORD);
60 
61  lRes = RegQueryValueEx(
62  hKey,
63  pszValueName,
64  NULL,
65  &dwType,
66  (LPBYTE)&dwData,
67  &cbData);
68 
69  if (lRes != ERROR_SUCCESS || dwType != REG_DWORD)
70  return Default;
71 
72  return dwData;
73 }
74 
75 static void SaveDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD dwValue)
76 {
77  RegSetValueEx(hKey, pszValueName, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(dwValue));
78 }
79 
80 
81 void LoadSettings(void)
82 {
83  HKEY hKey;
84  LONG lRes;
85 
87 
88  lRes = RegCreateKeyEx(
90  _T("Software\\Microsoft\\ScreenSavers\\Ssstars"),
91  0,
92  _T(""),
93  0,
94  KEY_READ,
95  NULL,
96  &hKey,
97  NULL);
98 
99  if (lRes != ERROR_SUCCESS)
100  return;
101 
102  Settings.uiNumStars = QueryDWORD(hKey, _T("NumberOfStars"), Settings.uiNumStars);
103  Settings.uiSpeed = QueryDWORD(hKey, _T("Speed"), Settings.uiSpeed);
104  Settings.uiRotation = QueryDWORD(hKey, _T("TypeOfRotation"), Settings.uiRotation);
105 
106  Settings.bDoBlending = QueryDWORD(hKey, _T("DoBlending"), Settings.bDoBlending);
107  Settings.bFinePerspective = QueryDWORD(hKey, _T("FinePerspective"), Settings.bFinePerspective);
108  Settings.bEnableFiltering = QueryDWORD(hKey, _T("EnableFiltering"), Settings.bEnableFiltering);
109  Settings.bSmoothShading = QueryDWORD(hKey, _T("SmoothShading"), Settings.bSmoothShading);
110 
111  // Check the number of stars to be in range
114  else
117 
118  // Check the speed to be in range
119  if (Settings.uiSpeed < MIN_SPEED)
121  else
122  if (Settings.uiSpeed > MAX_SPEED)
124 
125  // Check type of rotation to be in range
130 
131  RegCloseKey(hKey);
132 }
133 
134 void SaveSettings(void)
135 {
136  HKEY hKey;
137  LONG lRes;
138 
139  lRes = RegCreateKeyEx(
141  _T("Software\\Microsoft\\ScreenSavers\\Ssstars"),
142  0,
143  _T(""),
144  0,
145  KEY_WRITE,
146  NULL,
147  &hKey,
148  NULL);
149 
150  if (lRes != ERROR_SUCCESS)
151  return;
152 
153  SaveDWORD(hKey, _T("NumberOfStars"), Settings.uiNumStars);
154  SaveDWORD(hKey, _T("Speed"), Settings.uiSpeed);
155  SaveDWORD(hKey, _T("TypeOfRotation"), Settings.uiRotation);
156 
157  SaveDWORD(hKey, _T("DoBlending"), Settings.bDoBlending);
158  SaveDWORD(hKey, _T("FinePerspective"), Settings.bFinePerspective);
159  SaveDWORD(hKey, _T("EnableFiltering"), Settings.bEnableFiltering);
160  SaveDWORD(hKey, _T("SmoothShading"), Settings.bSmoothShading);
161 
162  RegCloseKey(hKey);
163 }
164 
165 static void SetupControls(HWND hWnd)
166 {
167  TCHAR Strings[256];
169  UINT x, gap;
170  LOGFONT lf;
171  HFONT hFont;
172  HBITMAP hCosmos;
173  HDC hDC, hMemDC;
174  HGDIOBJ hOldBmp, hOldFnt;
175  SIZE sizeReactOS;
176  SIZE sizeStarfield;
177  BITMAP bm;
178 
180 
182 
184 
185  for (x = 0; x < ROTATION_ITEMS; x++)
186  {
187  LoadString(hInstance, RotoStrings[x], Strings, sizeof(Strings)/sizeof(TCHAR));
189  }
190 
192 
193  hDC = GetDC(hWnd);
194  hMemDC = CreateCompatibleDC(hDC);
195 
196  // Create the font for the title
197  ZeroMemory(&lf, sizeof(lf));
198 
199  lf.lfWeight = FW_THIN;
200  lf.lfCharSet = ANSI_CHARSET;
202  lf.lfHeight = 36;
203  _tcscpy(lf.lfFaceName, _T("Tahoma"));
204 
205  hFont = CreateFontIndirect(&lf);
206 
207  hOldBmp = SelectObject(hMemDC, hCosmos);
208  hOldFnt = SelectObject(hMemDC, hFont);
209 
210  SetBkMode(hMemDC, TRANSPARENT);
211  SetTextColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
212 
213  x = LoadString(hInstance, IDS_DESCRIPTION, Strings, sizeof(Strings)/sizeof(TCHAR));
214 
215  GetTextExtentPoint32(hMemDC, _T("ReactOS"), 7, &sizeReactOS);
216  GetTextExtentPoint32(hMemDC, Strings, x, &sizeStarfield);
217 
218  GetObject(hCosmos, sizeof(BITMAP), &bm);
219 
220  gap = bm.bmHeight - sizeReactOS.cy - sizeStarfield.cy;
221 
222  TextOut(hMemDC, 16, gap * 2 / 5, _T("ReactOS"), 7);
223  TextOut(hMemDC, 16, gap * 3 / 5 + sizeReactOS.cy, Strings, x);
224 
225  SelectObject(hMemDC, hOldBmp);
226  SelectObject(hMemDC, hOldFnt);
227 
229 
230  DeleteDC(hMemDC);
231  ReleaseDC(hWnd, hDC);
232 
234 }
235 
236 static void ApplySettings(HWND hWnd)
237 {
240 
243 
245 
250 }
251 
252 static void ReadSettings(HWND hWnd)
253 {
256 
259 
261 
266 }
267 
269 {
271  HICON hIcon;
272  TCHAR szAppName[256];
273  TCHAR szAuthor[256];
274  TCHAR szLicense[1024];
275 
277 
279 
281  LoadString(hInstance, IDS_AUTHOR, szAuthor, SIZEOF(szAuthor));
282  LoadString(hInstance, IDS_LICENSE, szLicense, SIZEOF(szLicense));
283 
284  _tcscat(szAppName, _T("#"));
285  _tcscat(szAppName, szAuthor);
286 
287  ShellAbout(hWnd, szAppName, szLicense, hIcon);
288 
289  return TRUE;
290 }
291 
292 //
293 // Dialogbox procedure for Configuration window
294 //
296 {
297  switch (uMsg) {
298  case WM_INITDIALOG:
299  LoadSettings();
300  SetupControls(hDlg);
301  ApplySettings(hDlg);
302  return TRUE;
303 
304  case WM_COMMAND:
305  switch (LOWORD( wParam )) {
306 
307  case IDOK:
308  // Write configuration
309  SaveSettings();
310 
311  // Fall down...
312  case IDCANCEL:
313  EndDialog( hDlg, LOWORD( wParam ));
314  return TRUE;
315 
316  case IDC_BUTTON_ABOUT:
317  return OnCommandAbout(hDlg);
318  }
319 
320  case WM_HSCROLL:
321  ReadSettings(hDlg);
322  return TRUE;
323 
324  }
325 
326  return FALSE;
327 }
328 
330 {
332 
333  return TRUE;
334 }
335 
#define RegQueryValueEx
Definition: winreg.h:524
#define MAKEINTRESOURCE
Definition: winuser.h:591
BOOL CALLBACK ScreenSaverConfigureDialog(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: settings.c:295
static HICON
Definition: imagelist.c:84
#define TRUE
Definition: types.h:120
const CHAR * LPCTSTR
Definition: xmlstorage.h:193
#define IDOK
Definition: winuser.h:824
#define ERROR_SUCCESS
Definition: deptool.c:10
#define IDI_STARFIELD
Definition: resource.h:9
#define IDC_TEXT_SPEED
Definition: resource.h:17
static void SetupControls(HWND hWnd)
Definition: settings.c:165
#define IDS_ROTATION_PERIODIC
Definition: resource.h:4
HDC WINAPI GetDC(_In_opt_ HWND)
static const SSSTARS FactoryDefaults
Definition: settings.c:36
#define KEY_READ
Definition: nt_native.h:1023
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
#define ROTATION_NONE
Definition: settings.h:24
#define IDS_DESCRIPTION
Definition: resource.h:92
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
#define TBM_SETRANGE
Definition: commctrl.h:2009
HWND hWnd
Definition: settings.c:17
static HANDLE ULONG_PTR dwData
Definition: file.c:35
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
_TCHAR * _tcscpy(_TCHAR *to, const _TCHAR *from)
Definition: tcscpy.h:8
#define ZeroMemory
Definition: winbase.h:1635
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define TBM_SETPOS
Definition: commctrl.h:2008
BYTE lfCharSet
Definition: dimm.idl:50
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define MAX_SPEED
Definition: settings.h:33
SSSTARS Settings
Definition: settings.c:33
UINT_PTR WPARAM
Definition: windef.h:207
#define SendDlgItemMessage
Definition: winuser.h:5708
#define PROOF_QUALITY
Definition: wingdi.h:437
#define DWORD
Definition: nt_native.h:44
#define CB_GETCURSEL
Definition: winuser.h:1904
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDB_COSMOS
Definition: resource.h:11
HFONT hFont
Definition: main.c:53
#define ROTATION_LINEAR
Definition: settings.h:25
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
HINSTANCE hInstance
Definition: charmap.c:20
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define TBM_GETPOS
Definition: commctrl.h:2003
LONG lfHeight
Definition: dimm.idl:42
DWORD bSmoothShading
Definition: settings.h:42
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define IDC_SLIDER_NUM_OF_STARS
Definition: resource.h:14
#define TRANSPARENT
Definition: wingdi.h:949
#define CB_ADDSTRING
Definition: winuser.h:1897
LONG lfWeight
Definition: dimm.idl:46
smooth NULL
Definition: ftsmooth.c:416
#define IDC_CHECK_DOBLENDING
Definition: resource.h:22
#define MIN_STARS
Definition: settings.h:29
LONG_PTR LPARAM
Definition: windef.h:208
#define BM_GETCHECK
Definition: winuser.h:1879
static void SaveDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD dwValue)
Definition: settings.c:75
static BOOL OnCommandAbout(HWND hWnd)
Definition: settings.c:268
#define KEY_WRITE
Definition: nt_native.h:1031
char TCHAR
Definition: xmlstorage.h:189
#define SIZEOF(_v)
Definition: settings.c:30
#define BM_SETCHECK
Definition: winuser.h:1882
#define _T(x)
Definition: vfdio.h:22
#define IDS_ROTATION_NONE
Definition: resource.h:2
void SaveSettings(void)
Definition: settings.c:113
#define LR_DEFAULTSIZE
Definition: winuser.h:1084
#define IDC_IMAGE_COSMOS
Definition: resource.h:19
#define RGB(r, g, b)
Definition: wingdi.h:2918
#define WINAPI
Definition: msvc.h:8
#define IDC_COMBO_ROTATION
Definition: resource.h:18
DWORD bFinePerspective
Definition: settings.h:40
static void ReadSettings(HWND hWnd)
Definition: settings.c:252
#define IDS_AUTHOR
Definition: resource.h:10
unsigned long DWORD
Definition: ntddk_ex.h:95
#define FW_THIN
Definition: wingdi.h:368
#define ShellAbout
Definition: shellapi.h:688
static const WCHAR Strings[]
Definition: reg.c:35
#define GetObject
Definition: wingdi.h:4446
HANDLE HINSTANCE
Definition: typedefs.h:75
#define ROTATION_ITEMS
Definition: settings.h:27
BOOL WINAPI SetDlgItemInt(_In_ HWND, _In_ int, _In_ UINT, _In_ BOOL)
#define MAX_STARS
Definition: settings.h:30
#define CB_SETCURSEL
Definition: winuser.h:1922
#define IDC_TEXT_NUM_OF_STARS
Definition: resource.h:16
#define IDC_SLIDER_SPEED
Definition: resource.h:15
#define WM_COMMAND
Definition: winuser.h:1716
#define MIN_SPEED
Definition: settings.h:32
#define IDC_CHECK_SHADING
Definition: resource.h:25
BYTE lfQuality
Definition: dimm.idl:53
DWORD uiNumStars
Definition: settings.h:36
TCHAR szAppName[128]
Definition: solitaire.cpp:16
DWORD uiSpeed
Definition: settings.h:37
DWORD bDoBlending
Definition: settings.h:39
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:886
static HDC hDC
Definition: 3dtext.c:33
HINSTANCE hInst
Definition: dxdiag.c:13
static const DWORD RotoStrings[]
Definition: settings.c:47
BOOL WINAPI DeleteDC(_In_ HDC)
#define IDS_LICENSE
Definition: resource.h:28
HICON hIcon
Definition: msconfig.c:44
Definition: bl.h:1331
#define LR_CREATEDIBSECTION
Definition: winuser.h:1088
#define IDC_CHECK_PERSPECTIVE
Definition: resource.h:23
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
Definition: settings.c:329
#define CreateFontIndirect
Definition: wingdi.h:4422
unsigned int UINT
Definition: ndis.h:50
#define WM_HSCROLL
Definition: winuser.h:1719
#define IMAGE_BITMAP
Definition: winuser.h:211
static DWORD QueryDWORD(HKEY hKey, LPCTSTR pszValueName, DWORD Default)
Definition: settings.c:53
#define STM_SETIMAGE
Definition: winuser.h:2054
#define ROTATION_PERIODIC
Definition: settings.h:26
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
DWORD uiRotation
Definition: settings.h:38
#define IDS_ROTATION_LINEAR
Definition: resource.h:3
#define GWLP_HINSTANCE
Definition: winuser.h:850
#define GetTextExtentPoint32
Definition: wingdi.h:4450
_TCHAR * _tcscat(_TCHAR *s, const _TCHAR *append)
Definition: tcscat.h:8
#define IDC_CHECK_FILTERING
Definition: resource.h:24
#define TextOut
Definition: wingdi.h:4461
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
#define LoadImage
Definition: winuser.h:5681
static HBITMAP
Definition: button.c:44
VOID WINAPI InitCommonControls(void)
Definition: commctrl.c:863
#define LoadIcon
Definition: winuser.h:5679
#define GetWindowLongPtr
Definition: treelist.c:73
DWORD bEnableFiltering
Definition: settings.h:41
#define ANSI_CHARSET
Definition: wingdi.h:382
#define IDCANCEL
Definition: winuser.h:825
#define IDC_BUTTON_ABOUT
Definition: resource.h:20
#define REG_DWORD
Definition: sdbapi.c:596
LONG cy
Definition: windef.h:320
static void ApplySettings(HWND hWnd)
Definition: settings.c:236
#define WM_INITDIALOG
Definition: winuser.h:1715
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define RegSetValueEx
Definition: winreg.h:533
#define LoadString
Definition: winuser.h:5685
#define RegCreateKeyEx
Definition: winreg.h:501
void LoadSettings(void)
Definition: settings.c:53