/* * Notepad (settings.c) * * Copyright 1998,99 Marcel Baur * Copyright 2002 Sylvain Petreolle * Copyright 2002 Andriy Palamarchuk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "notepad.h" #include static LPCTSTR s_szRegistryKey = _T("Software\\Microsoft\\Notepad"); static LONG HeightFromPointSize(DWORD dwPointSize) { LONG lHeight; HDC hDC; hDC = GetDC(NULL); lHeight = -MulDiv(dwPointSize, GetDeviceCaps(hDC, LOGPIXELSY), 720); ReleaseDC(NULL, hDC); return lHeight; } static DWORD PointSizeFromHeight(LONG lHeight) { DWORD dwPointSize; HDC hDC; hDC = GetDC(NULL); dwPointSize = -MulDiv(lHeight, 720, GetDeviceCaps(hDC, LOGPIXELSY)); ReleaseDC(NULL, hDC); /* round to nearest multiple of 10 */ dwPointSize += 5; dwPointSize -= dwPointSize % 10; return dwPointSize; } static BOOL QueryGeneric(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwExpectedType, LPVOID pvResult, DWORD dwResultSize) { DWORD dwType, cbData; LPVOID *pTemp = _alloca(dwResultSize); ZeroMemory(pTemp, dwResultSize); cbData = dwResultSize; if (RegQueryValueEx(hKey, pszValueNameT, NULL, &dwType, (LPBYTE) pTemp, &cbData) != ERROR_SUCCESS) return FALSE; if (dwType != dwExpectedType) return FALSE; memcpy(pvResult, pTemp, cbData); return TRUE; } static BOOL QueryDword(HKEY hKey, LPCTSTR pszValueName, DWORD *pdwResult) { return QueryGeneric(hKey, pszValueName, REG_DWORD, pdwResult, sizeof(*pdwResult)); } static BOOL QueryByte(HKEY hKey, LPCTSTR pszValueName, BYTE *pbResult) { DWORD dwResult; if (!QueryGeneric(hKey, pszValueName, REG_DWORD, &dwResult, sizeof(dwResult))) return FALSE; if (dwResult >= 0x100) return FALSE; *pbResult = (BYTE) dwResult; return TRUE; } static BOOL QueryBool(HKEY hKey, LPCTSTR pszValueName, BOOL *pbResult) { DWORD dwResult; if (!QueryDword(hKey, pszValueName, &dwResult)) return FALSE; *pbResult = dwResult ? TRUE : FALSE; return TRUE; } static BOOL QueryString(HKEY hKey, LPCTSTR pszValueName, LPTSTR pszResult, DWORD dwResultSize) { return QueryGeneric(hKey, pszValueName, REG_SZ, pszResult, dwResultSize * sizeof(TCHAR)); } /*********************************************************************** * * NOTEPAD_LoadSettingsFromRegistry * * Load settings from registry HKCU\Software\Microsoft\Notepad. */ void NOTEPAD_LoadSettingsFromRegistry(void) { HKEY hKey = NULL; HFONT hFont; DWORD dwPointSize = 0; INT base_length, dx, dy; base_length = (GetSystemMetrics(SM_CXSCREEN) > GetSystemMetrics(SM_CYSCREEN)) ? GetSystemMetrics(SM_CYSCREEN) : GetSystemMetrics(SM_CXSCREEN); dx = (INT)(base_length * .95); dy = dx * 3 / 4; SetRect(&Globals.main_rect, 0, 0, dx, dy); if (RegOpenKey(HKEY_CURRENT_USER, s_szRegistryKey, &hKey) == ERROR_SUCCESS) { QueryByte(hKey, _T("lfCharSet"), &Globals.lfFont.lfCharSet); QueryByte(hKey, _T("lfClipPrecision"), &Globals.lfFont.lfClipPrecision); QueryDword(hKey, _T("lfEscapement"), (DWORD*)&Globals.lfFont.lfEscapement); QueryString(hKey, _T("lfFaceName"), Globals.lfFont.lfFaceName, ARRAY_SIZE(Globals.lfFont.lfFaceName)); 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); QueryBool(hKey, _T("fWrap"), &Globals.bWrapLongLines); QueryBool(hKey, _T("fStatusBar"), &Globals.bShowStatusBar); QueryString(hKey, _T("szHeader"), Globals.szHeader, ARRAY_SIZE(Globals.szHeader)); QueryString(hKey, _T("szTrailer"), Globals.szFooter, ARRAY_SIZE(Globals.szFooter)); 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); QueryDword(hKey, _T("iWindowPosX"), (DWORD*)&Globals.main_rect.left); QueryDword(hKey, _T("iWindowPosY"), (DWORD*)&Globals.main_rect.top); QueryDword(hKey, _T("iWindowPosDX"), (DWORD*)&dx); QueryDword(hKey, _T("iWindowPosDY"), (DWORD*)&dy); Globals.main_rect.right = Globals.main_rect.left + dx; Globals.main_rect.bottom = Globals.main_rect.top + dy; /* invert value because DIALOG_ViewStatusBar will be called to show it */ Globals.bShowStatusBar = !Globals.bShowStatusBar; if (dwPointSize != 0) Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize); else Globals.lfFont.lfHeight = HeightFromPointSize(100); RegCloseKey(hKey); } else { /* If no settings are found in the registry, then use default values */ Globals.bShowStatusBar = FALSE; Globals.bWrapLongLines = FALSE; SetRect(&Globals.lMargins, 750, 1000, 750, 1000); /* FIXME: Globals.fSaveWindowPositions = FALSE; */ /* FIXME: Globals.fMLE_is_broken = FALSE; */ LoadString(Globals.hInstance, STRING_PAGESETUP_HEADERVALUE, Globals.szHeader, ARRAY_SIZE(Globals.szHeader)); LoadString(Globals.hInstance, STRING_PAGESETUP_FOOTERVALUE, Globals.szFooter, ARRAY_SIZE(Globals.szFooter)); ZeroMemory(&Globals.lfFont, sizeof(Globals.lfFont)); Globals.lfFont.lfCharSet = DEFAULT_CHARSET; Globals.lfFont.lfClipPrecision = CLIP_STROKE_PRECIS; Globals.lfFont.lfEscapement = 0; LoadString(Globals.hInstance, STRING_DEFAULTFONT, Globals.lfFont.lfFaceName, ARRAY_SIZE(Globals.lfFont.lfFaceName)); Globals.lfFont.lfItalic = FALSE; Globals.lfFont.lfOrientation = 0; Globals.lfFont.lfOutPrecision = OUT_STRING_PRECIS; Globals.lfFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN; Globals.lfFont.lfQuality = PROOF_QUALITY; Globals.lfFont.lfStrikeOut = FALSE; Globals.lfFont.lfUnderline = FALSE; Globals.lfFont.lfWeight = FW_NORMAL; Globals.lfFont.lfHeight = HeightFromPointSize(100); } hFont = CreateFontIndirect(&Globals.lfFont); SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE); if (hFont) { if (Globals.hFont) DeleteObject(Globals.hFont); Globals.hFont = hFont; } } static BOOL SaveDword(HKEY hKey, LPCTSTR pszValueNameT, DWORD dwValue) { return RegSetValueEx(hKey, pszValueNameT, 0, REG_DWORD, (LPBYTE) &dwValue, sizeof(dwValue)) == ERROR_SUCCESS; } static BOOL SaveString(HKEY hKey, LPCTSTR pszValueNameT, LPCTSTR pszValue) { return RegSetValueEx(hKey, pszValueNameT, 0, REG_SZ, (LPBYTE) pszValue, (DWORD) _tcslen(pszValue) * sizeof(*pszValue)) == ERROR_SUCCESS; } /*********************************************************************** * * NOTEPAD_SaveSettingsToRegistry * * Save settings to registry HKCU\Software\Microsoft\Notepad. */ void NOTEPAD_SaveSettingsToRegistry(void) { HKEY hKey; DWORD dwDisposition; GetWindowRect(Globals.hMainWnd, &Globals.main_rect); if (RegCreateKeyEx(HKEY_CURRENT_USER, s_szRegistryKey, 0, NULL, 0, KEY_SET_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { 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); SaveString(hKey, _T("szHeader"), Globals.szHeader); SaveString(hKey, _T("szTrailer"), Globals.szFooter); 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); SaveDword(hKey, _T("iWindowPosX"), Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosY"), Globals.main_rect.top); SaveDword(hKey, _T("iWindowPosDX"), Globals.main_rect.right - Globals.main_rect.left); SaveDword(hKey, _T("iWindowPosDY"), Globals.main_rect.bottom - Globals.main_rect.top); RegCloseKey(hKey); } }