2005-09-30 11:25:32 +00:00
|
|
|
/*
|
2023-03-14 22:27:29 +00:00
|
|
|
* PROJECT: ReactOS Notepad
|
|
|
|
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
|
|
|
|
* PURPOSE: Providing a Windows-compatible simple text editor for ReactOS
|
|
|
|
* COPYRIGHT: Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch>
|
|
|
|
* Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
|
|
|
|
* Copyright 2002 Andriy Palamarchuk
|
2005-09-30 11:25:32 +00:00
|
|
|
*/
|
|
|
|
|
2013-01-24 23:00:42 +00:00
|
|
|
#include "notepad.h"
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2014-01-07 17:05:34 +00:00
|
|
|
#include <winreg.h>
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static LPCTSTR s_szRegistryKey = _T("Software\\Microsoft\\Notepad");
|
2005-09-30 11:25:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
static LONG HeightFromPointSize(DWORD dwPointSize)
|
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
LONG lHeight;
|
|
|
|
HDC hDC;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
hDC = GetDC(NULL);
|
|
|
|
lHeight = -MulDiv(dwPointSize, GetDeviceCaps(hDC, LOGPIXELSY), 720);
|
|
|
|
ReleaseDC(NULL, hDC);
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
return lHeight;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static DWORD PointSizeFromHeight(LONG lHeight)
|
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
DWORD dwPointSize;
|
|
|
|
HDC hDC;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
hDC = GetDC(NULL);
|
|
|
|
dwPointSize = -MulDiv(lHeight, 720, GetDeviceCaps(hDC, LOGPIXELSY));
|
|
|
|
ReleaseDC(NULL, hDC);
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
/* round to nearest multiple of 10 */
|
|
|
|
dwPointSize += 5;
|
|
|
|
dwPointSize -= dwPointSize % 10;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
return dwPointSize;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
static BOOL
|
|
|
|
QueryGeneric(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwExpectedType,
|
|
|
|
LPVOID pvResult, DWORD dwResultSize)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
DWORD dwType, cbData;
|
|
|
|
LPVOID *pTemp = _alloca(dwResultSize);
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
ZeroMemory(pTemp, dwResultSize);
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
cbData = dwResultSize;
|
|
|
|
if (RegQueryValueEx(hKey, pszValueNameT, NULL, &dwType, (LPBYTE) pTemp, &cbData) != ERROR_SUCCESS)
|
|
|
|
return FALSE;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
if (dwType != dwExpectedType)
|
|
|
|
return FALSE;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
memcpy(pvResult, pTemp, cbData);
|
|
|
|
return TRUE;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static BOOL QueryDword(HKEY hKey, LPCTSTR pszValueName, DWORD *pdwResult)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
return QueryGeneric(hKey, pszValueName, REG_DWORD, pdwResult, sizeof(*pdwResult));
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static BOOL QueryByte(HKEY hKey, LPCTSTR pszValueName, BYTE *pbResult)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
DWORD dwResult;
|
|
|
|
if (!QueryGeneric(hKey, pszValueName, REG_DWORD, &dwResult, sizeof(dwResult)))
|
|
|
|
return FALSE;
|
|
|
|
if (dwResult >= 0x100)
|
|
|
|
return FALSE;
|
|
|
|
*pbResult = (BYTE) dwResult;
|
|
|
|
return TRUE;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static BOOL QueryBool(HKEY hKey, LPCTSTR pszValueName, BOOL *pbResult)
|
2005-10-01 00:36:17 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
DWORD dwResult;
|
|
|
|
if (!QueryDword(hKey, pszValueName, &dwResult))
|
|
|
|
return FALSE;
|
|
|
|
*pbResult = dwResult ? TRUE : FALSE;
|
|
|
|
return TRUE;
|
2005-10-01 00:36:17 +00:00
|
|
|
}
|
|
|
|
|
2023-02-21 00:22:41 +00:00
|
|
|
static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultLength)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2023-02-21 00:22:41 +00:00
|
|
|
if (dwResultLength == 0)
|
|
|
|
return FALSE;
|
|
|
|
if (!QueryGeneric(hKey, pszValueName, REG_SZ, pszResult, dwResultLength * sizeof(TCHAR)))
|
|
|
|
return FALSE;
|
|
|
|
pszResult[dwResultLength - 1] = 0; /* Avoid buffer overrun */
|
|
|
|
return TRUE;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2015-03-14 20:00:39 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* NOTEPAD_LoadSettingsFromRegistry
|
|
|
|
*
|
|
|
|
* Load settings from registry HKCU\Software\Microsoft\Notepad.
|
|
|
|
*/
|
2024-09-02 21:13:28 +00:00
|
|
|
void NOTEPAD_LoadSettingsFromRegistry(PWINDOWPLACEMENT pWP)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2023-02-21 00:22:41 +00:00
|
|
|
HKEY hKey;
|
2015-01-08 13:20:02 +00:00
|
|
|
HFONT hFont;
|
2024-09-02 21:13:28 +00:00
|
|
|
DWORD dwPointSize;
|
|
|
|
DWORD x = CW_USEDEFAULT, y = CW_USEDEFAULT, cx = 0, cy = 0;
|
2023-02-21 00:22:41 +00:00
|
|
|
|
|
|
|
/* Set the default values */
|
|
|
|
Globals.bShowStatusBar = TRUE;
|
|
|
|
Globals.bWrapLongLines = FALSE;
|
|
|
|
SetRect(&Globals.lMargins, 750, 1000, 750, 1000);
|
|
|
|
ZeroMemory(&Globals.lfFont, sizeof(Globals.lfFont));
|
|
|
|
Globals.lfFont.lfCharSet = DEFAULT_CHARSET;
|
|
|
|
dwPointSize = 100;
|
|
|
|
Globals.lfFont.lfWeight = FW_NORMAL;
|
|
|
|
Globals.lfFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
|
|
|
|
|
|
|
|
/* FIXME: Globals.fSaveWindowPositions = FALSE; */
|
|
|
|
/* FIXME: Globals.fMLE_is_broken = FALSE; */
|
|
|
|
|
|
|
|
/* Open the target registry key */
|
|
|
|
if (RegOpenKey(HKEY_CURRENT_USER, s_szRegistryKey, &hKey) != ERROR_SUCCESS)
|
|
|
|
hKey = NULL;
|
|
|
|
|
|
|
|
/* Load the values from registry */
|
|
|
|
if (hKey)
|
2015-01-08 13:20:02 +00:00
|
|
|
{
|
|
|
|
QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet);
|
|
|
|
QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision);
|
|
|
|
QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement);
|
|
|
|
QueryByte(hKey, _T("lfItalic"), &Globals.lfFont.lfItalic);
|
|
|
|
QueryDword(hKey, _T("lfOrientation"), (DWORD*)&Globals.lfFont.lfOrientation);
|
|
|
|
QueryByte(hKey, _T("lfOutPrecision"), &Globals.lfFont.lfOutPrecision);
|
|
|
|
QueryByte(hKey, _T("lfPitchAndFamily"), &Globals.lfFont.lfPitchAndFamily);
|
|
|
|
QueryByte(hKey, _T("lfQuality"), &Globals.lfFont.lfQuality);
|
|
|
|
QueryByte(hKey, _T("lfStrikeOut"), &Globals.lfFont.lfStrikeOut);
|
|
|
|
QueryByte(hKey, _T("lfUnderline"), &Globals.lfFont.lfUnderline);
|
|
|
|
QueryDword(hKey, _T("lfWeight"), (DWORD*)&Globals.lfFont.lfWeight);
|
|
|
|
QueryDword(hKey, _T("iPointSize"), &dwPointSize);
|
2023-02-21 00:22:41 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines);
|
|
|
|
QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar);
|
2023-02-21 00:22:41 +00:00
|
|
|
|
2015-09-14 09:32:57 +00:00
|
|
|
QueryDword(hKey, _T("iMarginLeft"), (DWORD*)&Globals.lMargins.left);
|
|
|
|
QueryDword(hKey, _T("iMarginTop"), (DWORD*)&Globals.lMargins.top);
|
|
|
|
QueryDword(hKey, _T("iMarginRight"), (DWORD*)&Globals.lMargins.right);
|
|
|
|
QueryDword(hKey, _T("iMarginBottom"), (DWORD*)&Globals.lMargins.bottom);
|
2015-01-08 13:20:02 +00:00
|
|
|
|
2024-09-02 21:13:28 +00:00
|
|
|
QueryDword(hKey, _T("iWindowPosX"), &x);
|
|
|
|
QueryDword(hKey, _T("iWindowPosY"), &y);
|
2023-02-21 00:22:41 +00:00
|
|
|
QueryDword(hKey, _T("iWindowPosDX"), &cx);
|
|
|
|
QueryDword(hKey, _T("iWindowPosDY"), &cy);
|
2023-03-14 02:03:20 +00:00
|
|
|
|
2023-03-20 23:59:40 +00:00
|
|
|
QueryString(hKey, _T("searchString"), Globals.szFindText, _countof(Globals.szFindText));
|
|
|
|
QueryString(hKey, _T("replaceString"), Globals.szReplaceText, _countof(Globals.szReplaceText));
|
2023-02-21 00:22:41 +00:00
|
|
|
}
|
2008-01-30 09:25:54 +00:00
|
|
|
|
2024-09-02 21:13:28 +00:00
|
|
|
pWP->length = sizeof(*pWP);
|
|
|
|
pWP->flags = 0;
|
|
|
|
pWP->showCmd = SW_SHOWDEFAULT;
|
|
|
|
if (cy & 0x80000000)
|
|
|
|
{
|
|
|
|
cy &= ~0x80000000;
|
|
|
|
pWP->flags |= WPF_RESTORETOMAXIMIZED;
|
|
|
|
pWP->showCmd = SW_SHOWMAXIMIZED;
|
|
|
|
}
|
|
|
|
pWP->rcNormalPosition.left = x;
|
|
|
|
pWP->rcNormalPosition.right = x + cx;
|
|
|
|
pWP->rcNormalPosition.top = y;
|
|
|
|
pWP->rcNormalPosition.bottom = y + cy;
|
|
|
|
pWP->ptMaxPosition.x = x;
|
|
|
|
pWP->ptMaxPosition.y = y;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2024-09-02 21:13:28 +00:00
|
|
|
Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize);
|
2023-02-21 00:22:41 +00:00
|
|
|
if (!hKey || !QueryString(hKey, _T("lfFaceName"),
|
2023-03-20 23:59:40 +00:00
|
|
|
Globals.lfFont.lfFaceName, _countof(Globals.lfFont.lfFaceName)))
|
2015-05-30 10:15:48 +00:00
|
|
|
{
|
2023-02-21 00:22:41 +00:00
|
|
|
LoadString(Globals.hInstance, STRING_DEFAULTFONT, Globals.lfFont.lfFaceName,
|
2023-03-20 23:59:40 +00:00
|
|
|
_countof(Globals.lfFont.lfFaceName));
|
2023-02-21 00:22:41 +00:00
|
|
|
}
|
2017-06-14 14:22:32 +00:00
|
|
|
|
2023-03-20 23:59:40 +00:00
|
|
|
if (!hKey || !QueryString(hKey, _T("szHeader"), Globals.szHeader, _countof(Globals.szHeader)))
|
2023-02-21 00:22:41 +00:00
|
|
|
{
|
2017-06-14 14:22:32 +00:00
|
|
|
LoadString(Globals.hInstance, STRING_PAGESETUP_HEADERVALUE, Globals.szHeader,
|
2023-03-20 23:59:40 +00:00
|
|
|
_countof(Globals.szHeader));
|
2023-02-21 00:22:41 +00:00
|
|
|
}
|
|
|
|
|
2023-03-20 23:59:40 +00:00
|
|
|
if (!hKey || !QueryString(hKey, _T("szTrailer"), Globals.szFooter, _countof(Globals.szFooter)))
|
2023-02-21 00:22:41 +00:00
|
|
|
{
|
2017-06-14 14:22:32 +00:00
|
|
|
LoadString(Globals.hInstance, STRING_PAGESETUP_FOOTERVALUE, Globals.szFooter,
|
2023-03-20 23:59:40 +00:00
|
|
|
_countof(Globals.szFooter));
|
2023-02-21 00:22:41 +00:00
|
|
|
}
|
2017-06-14 14:22:32 +00:00
|
|
|
|
2023-02-21 00:22:41 +00:00
|
|
|
if (hKey)
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
|
|
|
/* WORKAROUND: Far East Asian users may not have suitable fixed-pitch fonts. */
|
|
|
|
switch (PRIMARYLANGID(GetUserDefaultLangID()))
|
|
|
|
{
|
|
|
|
case LANG_CHINESE:
|
|
|
|
case LANG_JAPANESE:
|
|
|
|
case LANG_KOREAN:
|
|
|
|
Globals.lfFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
|
|
|
|
break;
|
2015-05-30 10:15:48 +00:00
|
|
|
}
|
2010-04-16 14:30:40 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
hFont = CreateFontIndirect(&Globals.lfFont);
|
2023-03-08 23:23:08 +00:00
|
|
|
SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)hFont, TRUE);
|
2015-01-08 13:20:02 +00:00
|
|
|
if (hFont)
|
|
|
|
{
|
|
|
|
if (Globals.hFont)
|
|
|
|
DeleteObject(Globals.hFont);
|
|
|
|
Globals.hFont = hFont;
|
|
|
|
}
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static BOOL SaveDword(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwValue)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
return RegSetValueEx(hKey, pszValueNameT, 0, REG_DWORD, (LPBYTE) &dwValue, sizeof(dwValue)) == ERROR_SUCCESS;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2007-10-09 08:53:25 +00:00
|
|
|
static BOOL SaveString(HKEY hKey, LPCTSTR pszValueNameT, LPCTSTR pszValue)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
return RegSetValueEx(hKey, pszValueNameT, 0, REG_SZ, (LPBYTE) pszValue, (DWORD) _tcslen(pszValue) * sizeof(*pszValue)) == ERROR_SUCCESS;
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|
|
|
|
|
2015-03-14 20:00:39 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* NOTEPAD_SaveSettingsToRegistry
|
|
|
|
*
|
|
|
|
* Save settings to registry HKCU\Software\Microsoft\Notepad.
|
|
|
|
*/
|
|
|
|
void NOTEPAD_SaveSettingsToRegistry(void)
|
2005-09-30 11:25:32 +00:00
|
|
|
{
|
2015-01-08 13:20:02 +00:00
|
|
|
HKEY hKey;
|
|
|
|
DWORD dwDisposition;
|
2024-09-02 21:13:28 +00:00
|
|
|
WINDOWPLACEMENT wp;
|
|
|
|
UINT x, y, cx, cy;
|
|
|
|
|
|
|
|
wp.length = sizeof(wp);
|
|
|
|
GetWindowPlacement(Globals.hMainWnd, &wp);
|
|
|
|
x = wp.rcNormalPosition.left;
|
|
|
|
y = wp.rcNormalPosition.top;
|
|
|
|
cx = wp.rcNormalPosition.right - x;
|
|
|
|
cy = wp.rcNormalPosition.bottom - y;
|
|
|
|
if (wp.flags & WPF_RESTORETOMAXIMIZED)
|
|
|
|
cy |= 0x80000000;
|
2005-09-30 11:25:32 +00:00
|
|
|
|
2008-01-30 09:25:54 +00:00
|
|
|
|
2015-03-14 20:00:39 +00:00
|
|
|
if (RegCreateKeyEx(HKEY_CURRENT_USER, s_szRegistryKey,
|
2015-05-30 10:15:48 +00:00
|
|
|
0, NULL, 0, KEY_SET_VALUE, NULL,
|
2015-03-14 20:00:39 +00:00
|
|
|
&hKey, &dwDisposition) == ERROR_SUCCESS)
|
2015-01-08 13:20:02 +00:00
|
|
|
{
|
|
|
|
SaveDword(hKey, _T("lfCharSet"), Globals.lfFont.lfCharSet);
|
|
|
|
SaveDword(hKey, _T("lfClipPrecision"), Globals.lfFont.lfClipPrecision);
|
|
|
|
SaveDword(hKey, _T("lfEscapement"), Globals.lfFont.lfEscapement);
|
|
|
|
SaveString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName);
|
|
|
|
SaveDword(hKey, _T("lfItalic"), Globals.lfFont.lfItalic);
|
|
|
|
SaveDword(hKey, _T("lfOrientation"), Globals.lfFont.lfOrientation);
|
|
|
|
SaveDword(hKey, _T("lfOutPrecision"), Globals.lfFont.lfOutPrecision);
|
|
|
|
SaveDword(hKey, _T("lfPitchAndFamily"), Globals.lfFont.lfPitchAndFamily);
|
|
|
|
SaveDword(hKey, _T("lfQuality"), Globals.lfFont.lfQuality);
|
|
|
|
SaveDword(hKey, _T("lfStrikeOut"), Globals.lfFont.lfStrikeOut);
|
|
|
|
SaveDword(hKey, _T("lfUnderline"), Globals.lfFont.lfUnderline);
|
|
|
|
SaveDword(hKey, _T("lfWeight"), Globals.lfFont.lfWeight);
|
|
|
|
SaveDword(hKey, _T("iPointSize"), PointSizeFromHeight(Globals.lfFont.lfHeight));
|
|
|
|
SaveDword(hKey, _T("fWrap"), Globals.bWrapLongLines ? 1 : 0);
|
|
|
|
SaveDword(hKey, _T("fStatusBar"), Globals.bShowStatusBar ? 1 : 0);
|
2015-01-20 12:12:40 +00:00
|
|
|
SaveString(hKey, _T("szHeader"), Globals.szHeader);
|
|
|
|
SaveString(hKey, _T("szTrailer"), Globals.szFooter);
|
2015-09-14 09:32:57 +00:00
|
|
|
SaveDword(hKey, _T("iMarginLeft"), Globals.lMargins.left);
|
|
|
|
SaveDword(hKey, _T("iMarginTop"), Globals.lMargins.top);
|
|
|
|
SaveDword(hKey, _T("iMarginRight"), Globals.lMargins.right);
|
|
|
|
SaveDword(hKey, _T("iMarginBottom"), Globals.lMargins.bottom);
|
2024-09-02 21:13:28 +00:00
|
|
|
SaveDword(hKey, _T("iWindowPosX"), x);
|
|
|
|
SaveDword(hKey, _T("iWindowPosY"), y);
|
|
|
|
SaveDword(hKey, _T("iWindowPosDX"), cx);
|
|
|
|
SaveDword(hKey, _T("iWindowPosDY"), cy);
|
2023-03-14 02:03:20 +00:00
|
|
|
SaveString(hKey, _T("searchString"), Globals.szFindText);
|
|
|
|
SaveString(hKey, _T("replaceString"), Globals.szReplaceText);
|
2015-03-14 20:00:39 +00:00
|
|
|
|
2015-01-08 13:20:02 +00:00
|
|
|
RegCloseKey(hKey);
|
|
|
|
}
|
2005-09-30 11:25:32 +00:00
|
|
|
}
|