ReactOS 0.4.15-dev-7906-g1b85a5f
settings.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Notepad
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Providing a Windows-compatible simple text editor for ReactOS
5 * COPYRIGHT: Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch>
6 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
7 * Copyright 2002 Andriy Palamarchuk
8 */
9
10#include "notepad.h"
11
12#include <winreg.h>
13
14static LPCTSTR s_szRegistryKey = _T("Software\\Microsoft\\Notepad");
15
16
17static LONG HeightFromPointSize(DWORD dwPointSize)
18{
19 LONG lHeight;
20 HDC hDC;
21
22 hDC = GetDC(NULL);
23 lHeight = -MulDiv(dwPointSize, GetDeviceCaps(hDC, LOGPIXELSY), 720);
25
26 return lHeight;
27}
28
30{
31 DWORD dwPointSize;
32 HDC hDC;
33
34 hDC = GetDC(NULL);
35 dwPointSize = -MulDiv(lHeight, 720, GetDeviceCaps(hDC, LOGPIXELSY));
37
38 /* round to nearest multiple of 10 */
39 dwPointSize += 5;
40 dwPointSize -= dwPointSize % 10;
41
42 return dwPointSize;
43}
44
45static BOOL
46QueryGeneric(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwExpectedType,
47 LPVOID pvResult, DWORD dwResultSize)
48{
49 DWORD dwType, cbData;
50 LPVOID *pTemp = _alloca(dwResultSize);
51
52 ZeroMemory(pTemp, dwResultSize);
53
54 cbData = dwResultSize;
55 if (RegQueryValueEx(hKey, pszValueNameT, NULL, &dwType, (LPBYTE) pTemp, &cbData) != ERROR_SUCCESS)
56 return FALSE;
57
58 if (dwType != dwExpectedType)
59 return FALSE;
60
61 memcpy(pvResult, pTemp, cbData);
62 return TRUE;
63}
64
66{
67 return QueryGeneric(hKey, pszValueName, REG_DWORD, pdwResult, sizeof(*pdwResult));
68}
69
70static BOOL QueryByte(HKEY hKey, LPCTSTR pszValueName, BYTE *pbResult)
71{
72 DWORD dwResult;
73 if (!QueryGeneric(hKey, pszValueName, REG_DWORD, &dwResult, sizeof(dwResult)))
74 return FALSE;
75 if (dwResult >= 0x100)
76 return FALSE;
77 *pbResult = (BYTE) dwResult;
78 return TRUE;
79}
80
81static BOOL QueryBool(HKEY hKey, LPCTSTR pszValueName, BOOL *pbResult)
82{
83 DWORD dwResult;
84 if (!QueryDword(hKey, pszValueName, &dwResult))
85 return FALSE;
86 *pbResult = dwResult ? TRUE : FALSE;
87 return TRUE;
88}
89
90static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultLength)
91{
92 if (dwResultLength == 0)
93 return FALSE;
94 if (!QueryGeneric(hKey, pszValueName, REG_SZ, pszResult, dwResultLength * sizeof(TCHAR)))
95 return FALSE;
96 pszResult[dwResultLength - 1] = 0; /* Avoid buffer overrun */
97 return TRUE;
98}
99
100/***********************************************************************
101 * NOTEPAD_LoadSettingsFromRegistry
102 *
103 * Load settings from registry HKCU\Software\Microsoft\Notepad.
104 */
106{
107 HKEY hKey;
108 HFONT hFont;
109 DWORD dwPointSize, cx, cy;
111
112 /* Set the default values */
113 Globals.bShowStatusBar = TRUE;
114 Globals.bWrapLongLines = FALSE;
115 SetRect(&Globals.lMargins, 750, 1000, 750, 1000);
116 ZeroMemory(&Globals.lfFont, sizeof(Globals.lfFont));
117 Globals.lfFont.lfCharSet = DEFAULT_CHARSET;
118 dwPointSize = 100;
119 Globals.lfFont.lfWeight = FW_NORMAL;
120 Globals.lfFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
121 Globals.main_rect.left = CW_USEDEFAULT;
122 Globals.main_rect.top = CW_USEDEFAULT;
123 cx = min((cxScreen * 3) / 4, 640);
124 cy = min((cyScreen * 3) / 4, 480);
125
126 /* FIXME: Globals.fSaveWindowPositions = FALSE; */
127 /* FIXME: Globals.fMLE_is_broken = FALSE; */
128
129 /* Open the target registry key */
131 hKey = NULL;
132
133 /* Load the values from registry */
134 if (hKey)
135 {
136 QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet);
137 QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision);
138 QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement);
139 QueryByte(hKey, _T("lfItalic"), &Globals.lfFont.lfItalic);
140 QueryDword(hKey, _T("lfOrientation"), (DWORD*)&Globals.lfFont.lfOrientation);
141 QueryByte(hKey, _T("lfOutPrecision"), &Globals.lfFont.lfOutPrecision);
142 QueryByte(hKey, _T("lfPitchAndFamily"), &Globals.lfFont.lfPitchAndFamily);
143 QueryByte(hKey, _T("lfQuality"), &Globals.lfFont.lfQuality);
144 QueryByte(hKey, _T("lfStrikeOut"), &Globals.lfFont.lfStrikeOut);
145 QueryByte(hKey, _T("lfUnderline"), &Globals.lfFont.lfUnderline);
146 QueryDword(hKey, _T("lfWeight"), (DWORD*)&Globals.lfFont.lfWeight);
147 QueryDword(hKey, _T("iPointSize"), &dwPointSize);
148
149 QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines);
150 QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar);
151
152 QueryDword(hKey, _T("iMarginLeft"), (DWORD*)&Globals.lMargins.left);
153 QueryDword(hKey, _T("iMarginTop"), (DWORD*)&Globals.lMargins.top);
154 QueryDword(hKey, _T("iMarginRight"), (DWORD*)&Globals.lMargins.right);
155 QueryDword(hKey, _T("iMarginBottom"), (DWORD*)&Globals.lMargins.bottom);
156
157 QueryDword(hKey, _T("iWindowPosX"), (DWORD*)&Globals.main_rect.left);
158 QueryDword(hKey, _T("iWindowPosY"), (DWORD*)&Globals.main_rect.top);
159 QueryDword(hKey, _T("iWindowPosDX"), &cx);
160 QueryDword(hKey, _T("iWindowPosDY"), &cy);
161
162 QueryString(hKey, _T("searchString"), Globals.szFindText, _countof(Globals.szFindText));
163 QueryString(hKey, _T("replaceString"), Globals.szReplaceText, _countof(Globals.szReplaceText));
164 }
165
166 Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize);
167 Globals.main_rect.right = Globals.main_rect.left + cx;
168 Globals.main_rect.bottom = Globals.main_rect.top + cy;
169
170 if (!hKey || !QueryString(hKey, _T("lfFaceName"),
171 Globals.lfFont.lfFaceName, _countof(Globals.lfFont.lfFaceName)))
172 {
174 _countof(Globals.lfFont.lfFaceName));
175 }
176
177 if (!hKey || !QueryString(hKey, _T("szHeader"), Globals.szHeader, _countof(Globals.szHeader)))
178 {
180 _countof(Globals.szHeader));
181 }
182
183 if (!hKey || !QueryString(hKey, _T("szTrailer"), Globals.szFooter, _countof(Globals.szFooter)))
184 {
186 _countof(Globals.szFooter));
187 }
188
189 if (hKey)
191
192 /* WORKAROUND: Far East Asian users may not have suitable fixed-pitch fonts. */
194 {
195 case LANG_CHINESE:
196 case LANG_JAPANESE:
197 case LANG_KOREAN:
198 Globals.lfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
199 break;
200 }
201
204 if (hFont)
205 {
206 if (Globals.hFont)
207 DeleteObject(Globals.hFont);
208 Globals.hFont = hFont;
209 }
210}
211
212static BOOL SaveDword(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwValue)
213{
214 return RegSetValueEx(hKey, pszValueNameT, 0, REG_DWORD, (LPBYTE) &dwValue, sizeof(dwValue)) == ERROR_SUCCESS;
215}
216
217static BOOL SaveString(HKEY hKey, LPCTSTR pszValueNameT, LPCTSTR pszValue)
218{
219 return RegSetValueEx(hKey, pszValueNameT, 0, REG_SZ, (LPBYTE) pszValue, (DWORD) _tcslen(pszValue) * sizeof(*pszValue)) == ERROR_SUCCESS;
220}
221
222/***********************************************************************
223 * NOTEPAD_SaveSettingsToRegistry
224 *
225 * Save settings to registry HKCU\Software\Microsoft\Notepad.
226 */
228{
229 HKEY hKey;
230 DWORD dwDisposition;
231
233
235 0, NULL, 0, KEY_SET_VALUE, NULL,
236 &hKey, &dwDisposition) == ERROR_SUCCESS)
237 {
238 SaveDword(hKey, _T("lfCharSet"), Globals.lfFont.lfCharSet);
239 SaveDword(hKey, _T("lfClipPrecision"), Globals.lfFont.lfClipPrecision);
240 SaveDword(hKey, _T("lfEscapement"), Globals.lfFont.lfEscapement);
241 SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName);
242 SaveDword(hKey, _T("lfItalic"), Globals.lfFont.lfItalic);
243 SaveDword(hKey, _T("lfOrientation"), Globals.lfFont.lfOrientation);
244 SaveDword(hKey, _T("lfOutPrecision"), Globals.lfFont.lfOutPrecision);
245 SaveDword(hKey, _T("lfPitchAndFamily"), Globals.lfFont.lfPitchAndFamily);
246 SaveDword(hKey, _T("lfQuality"), Globals.lfFont.lfQuality);
247 SaveDword(hKey, _T("lfStrikeOut"), Globals.lfFont.lfStrikeOut);
248 SaveDword(hKey, _T("lfUnderline"), Globals.lfFont.lfUnderline);
249 SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight);
250 SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight));
251 SaveDword(hKey, _T("fWrap"), Globals.bWrapLongLines ? 1 : 0);
252 SaveDword(hKey, _T("fStatusBar"), Globals.bShowStatusBar ? 1 : 0);
253 SaveString(hKey, _T("szHeader"), Globals.szHeader);
254 SaveString(hKey, _T("szTrailer"), Globals.szFooter);
255 SaveDword(hKey, _T("iMarginLeft"), Globals.lMargins.left);
256 SaveDword(hKey, _T("iMarginTop"), Globals.lMargins.top);
257 SaveDword(hKey, _T("iMarginRight"), Globals.lMargins.right);
258 SaveDword(hKey, _T("iMarginBottom"), Globals.lMargins.bottom);
259 SaveDword(hKey, _T("iWindowPosX"), Globals.main_rect.left);
260 SaveDword(hKey, _T("iWindowPosY"), Globals.main_rect.top);
261 SaveDword(hKey, _T("iWindowPosDX"), Globals.main_rect.right - Globals.main_rect.left);
262 SaveDword(hKey, _T("iWindowPosDY"), Globals.main_rect.bottom - Globals.main_rect.top);
263 SaveString(hKey, _T("searchString"), Globals.szFindText);
264 SaveString(hKey, _T("replaceString"), Globals.szReplaceText);
265
267 }
268}
static HDC hDC
Definition: 3dtext.c:33
void NOTEPAD_SaveSettingsToRegistry(void)
Definition: settings.c:227
static BOOL QueryByte(HKEY hKey, LPCTSTR pszValueName, BYTE *pbResult)
Definition: settings.c:70
static DWORD PointSizeFromHeight(LONG lHeight)
Definition: settings.c:29
static BOOL QueryBool(HKEY hKey, LPCTSTR pszValueName, BOOL *pbResult)
Definition: settings.c:81
static LPCTSTR s_szRegistryKey
Definition: settings.c:14
void NOTEPAD_LoadSettingsFromRegistry(void)
Definition: settings.c:105
static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultLength)
Definition: settings.c:90
static BOOL QueryDword(HKEY hKey, LPCTSTR pszValueName, DWORD *pdwResult)
Definition: settings.c:65
static BOOL QueryGeneric(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwExpectedType, LPVOID pvResult, DWORD dwResultSize)
Definition: settings.c:46
static BOOL SaveString(HKEY hKey, LPCTSTR pszValueNameT, LPCTSTR pszValue)
Definition: settings.c:217
static LONG HeightFromPointSize(DWORD dwPointSize)
Definition: settings.c:17
static BOOL SaveDword(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwValue)
Definition: settings.c:212
HFONT hFont
Definition: main.c:53
#define RegCloseKey(hKey)
Definition: registry.h:49
CLIPBOARD_GLOBALS Globals
Definition: clipbrd.c:13
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
pKey DeleteObject()
LANGID WINAPI GetUserDefaultLangID(void)
Definition: lang.c:744
#define REG_SZ
Definition: layer.c:22
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HDC
Definition: imagelist.c:92
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define min(a, b)
Definition: monoChain.cc:55
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
#define STRING_PAGESETUP_FOOTERVALUE
Definition: notepad_res.h:61
#define STRING_DEFAULTFONT
Definition: notepad_res.h:91
#define STRING_PAGESETUP_HEADERVALUE
Definition: notepad_res.h:60
#define KEY_SET_VALUE
Definition: nt_native.h:1017
_In_ UINT _In_ DWORD _Out_ DWORD * pdwResult
Definition: ntgdi.h:250
long LONG
Definition: pedump.c:60
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define REG_DWORD
Definition: sdbapi.c:596
#define LANG_CHINESE
Definition: nls.h:42
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define _countof(array)
Definition: sndvol32.h:68
HINSTANCE hInstance
Definition: precomp.h:43
unsigned char * LPBYTE
Definition: typedefs.h:53
#define _T(x)
Definition: vfdio.h:22
#define ZeroMemory
Definition: winbase.h:1712
UINT_PTR WPARAM
Definition: windef.h:207
#define FIXED_PITCH
Definition: wingdi.h:444
#define DEFAULT_PITCH
Definition: wingdi.h:443
#define FF_MODERN
Definition: wingdi.h:449
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define FF_DONTCARE
Definition: wingdi.h:448
#define LOGPIXELSY
Definition: wingdi.h:719
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define FW_NORMAL
Definition: wingdi.h:373
#define CreateFontIndirect
Definition: wingdi.h:4444
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegSetValueEx
Definition: winreg.h:533
#define RegCreateKeyEx
Definition: winreg.h:501
#define RegQueryValueEx
Definition: winreg.h:524
#define RegOpenKey
Definition: winreg.h:519
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define SM_CYSCREEN
Definition: winuser.h:960
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define WM_SETFONT
Definition: winuser.h:1650
#define SendMessage
Definition: winuser.h:5843
HDC WINAPI GetDC(_In_opt_ HWND)
#define CW_USEDEFAULT
Definition: winuser.h:225
#define LoadString
Definition: winuser.h:5819
#define SM_CXSCREEN
Definition: winuser.h:959
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
char TCHAR
Definition: xmlstorage.h:189
const CHAR * LPCTSTR
Definition: xmlstorage.h:193
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define _tcslen
Definition: xmlstorage.h:198
unsigned char BYTE
Definition: xxhash.c:193