https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2ebda0e3d0e583ee6d24b0...
commit 2ebda0e3d0e583ee6d24b04132923aaa6a1c0e1a Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun May 5 01:10:39 2019 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun May 5 01:20:19 2019 +0200
[CONSOLE.CPL] Fix the console screen preview when selecting TrueType fonts. CORE-13182 CORE-13196
- Use the correct character height & width. - Additions: use StringCch*() when initializing the dialog title.
[CONSRV:CONCFG] Minor fixes.
- When retrieving font characteristics in ConCfgReadUserSettings(), check for NULL/zero values that indicate that we should use default ones instead. - Rename 'dwNumSubKeys' into 'dwNumValues'. --- dll/cpl/console/console.c | 25 +++++++++-------------- dll/cpl/console/console.h | 9 ++++++++- dll/cpl/console/font.c | 28 ++++++++++++-------------- dll/cpl/console/layout.c | 6 +++--- win32ss/user/winsrv/concfg/settings.c | 38 +++++++++++++++++++++++------------ 5 files changed, 59 insertions(+), 47 deletions(-)
diff --git a/dll/cpl/console/console.c b/dll/cpl/console/console.c index d39253a0c6..89e9ac57fb 100644 --- a/dll/cpl/console/console.c +++ b/dll/cpl/console/console.c @@ -228,25 +228,20 @@ InitApplet(HANDLE hSectionOrWnd) }
/* Initialize the font support */ - hCurrentFont = CreateConsoleFont(ConInfo); - if (hCurrentFont == NULL) - DPRINT1("InitApplet: CreateConsoleFont failed\n"); + FontPreview.hFont = CreateConsoleFont(ConInfo); + if (FontPreview.hFont == NULL) + DPRINT1("InitApplet: CreateConsoleFont() failed\n"); + GetFontCellSize(NULL, FontPreview.hFont, &FontPreview.CharHeight, &FontPreview.CharWidth);
/* Initialize the property sheet structure */ ZeroMemory(&psh, sizeof(psh)); psh.dwSize = sizeof(psh); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | /* PSH_USEHICON */ PSH_USEICONID | PSH_NOAPPLYNOW | PSH_USECALLBACK; + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | /* PSH_USEHICON | */ PSH_USEICONID | PSH_NOAPPLYNOW | PSH_USECALLBACK;
if (ConInfo->ConsoleTitle[0] != UNICODE_NULL) - { - wcsncpy(szTitle, L""", MAX_PATH); - wcsncat(szTitle, ConInfo->ConsoleTitle, MAX_PATH - wcslen(szTitle)); - wcsncat(szTitle, L""", MAX_PATH - wcslen(szTitle)); - } + StringCchPrintfW(szTitle, ARRAYSIZE(szTitle), L""%s"", ConInfo->ConsoleTitle); else - { - wcscpy(szTitle, L"ReactOS Console"); - } + StringCchCopyW(szTitle, ARRAYSIZE(szTitle), L"ReactOS Console"); psh.pszCaption = szTitle;
if (pSharedInfo != NULL) @@ -278,9 +273,9 @@ InitApplet(HANDLE hSectionOrWnd) Result = PropertySheetW(&psh); UnRegisterWinPrevClass(hApplet);
- /* First cleanup */ - if (hCurrentFont) DeleteObject(hCurrentFont); - hCurrentFont = NULL; + /* Clear the font support */ + if (FontPreview.hFont) DeleteObject(FontPreview.hFont); + FontPreview.hFont = NULL;
/* Save the console settings */ if (SetConsoleInfo) diff --git a/dll/cpl/console/console.h b/dll/cpl/console/console.h index 04508bf063..0f7b592494 100644 --- a/dll/cpl/console/console.h +++ b/dll/cpl/console/console.h @@ -35,10 +35,17 @@ typedef enum _TEXT_TYPE Popup } TEXT_TYPE;
+typedef struct _FONT_PREVIEW +{ + HFONT hFont; + UINT CharWidth; + UINT CharHeight; +} FONT_PREVIEW; + /* Globals */ extern HINSTANCE hApplet; extern PCONSOLE_STATE_INFO ConInfo; -extern HFONT hCurrentFont; +extern FONT_PREVIEW FontPreview;
VOID ApplyConsoleInfo(HWND hwndDlg);
diff --git a/dll/cpl/console/font.c b/dll/cpl/console/font.c index 45a2612b39..66c9cc6a41 100644 --- a/dll/cpl/console/font.c +++ b/dll/cpl/console/font.c @@ -18,7 +18,7 @@ * Current active font, corresponding to the active console font, * and used for painting the text samples. */ -HFONT hCurrentFont = NULL; +FONT_PREVIEW FontPreview = {NULL, 0, 0};
/* @@ -597,8 +597,7 @@ FontSizeChange( IN PFONTSIZE_LIST_CTL SizeList, IN OUT PCONSOLE_STATE_INFO pConInfo) { - HDC hDC; - LONG CharWidth, CharHeight, FontSize; + LONG FontSize, CharWidth, CharHeight; WCHAR szFontSize[100];
/* @@ -614,33 +613,32 @@ FontSizeChange( CharHeight = (SizeList->UseRasterOrTTList ? (LONG)HIWORD(FontSize) : FontSize); CharWidth = (SizeList->UseRasterOrTTList ? (LONG)LOWORD(FontSize) : 0);
- if (hCurrentFont) DeleteObject(hCurrentFont); - hCurrentFont = CreateConsoleFont2(CharHeight, CharWidth, pConInfo); - if (hCurrentFont == NULL) - DPRINT1("FontSizeChange: CreateConsoleFont2 failed\n"); + if (FontPreview.hFont) DeleteObject(FontPreview.hFont); + FontPreview.hFont = CreateConsoleFont2(CharHeight, CharWidth, pConInfo); + if (FontPreview.hFont == NULL) + DPRINT1("FontSizeChange: CreateConsoleFont2() failed\n");
/* Retrieve the real character size in pixels */ - hDC = GetDC(NULL); - GetFontCellSize(hDC, hCurrentFont, (PUINT)&CharHeight, (PUINT)&CharWidth); - ReleaseDC(NULL, hDC); + GetFontCellSize(NULL, FontPreview.hFont, &FontPreview.CharHeight, &FontPreview.CharWidth);
/* * Format: * Width = FontSize.X = LOWORD(FontSize); * Height = FontSize.Y = HIWORD(FontSize); */ - pConInfo->FontSize.X = (SHORT)(SizeList->UseRasterOrTTList ? CharWidth : 0); - pConInfo->FontSize.Y = (SHORT)CharHeight; + pConInfo->FontSize.X = (SHORT)(SizeList->UseRasterOrTTList ? FontPreview.CharWidth : 0); + pConInfo->FontSize.Y = (SHORT)FontPreview.CharHeight;
DPRINT1("pConInfo->FontSize = (%d x %d) ; (CharWidth x CharHeight) = (%d x %d)\n", - pConInfo->FontSize.X, pConInfo->FontSize.Y, CharWidth, CharHeight); + pConInfo->FontSize.X, pConInfo->FontSize.Y, + FontPreview.CharWidth, FontPreview.CharHeight);
InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_FONT_WINDOW_PREVIEW), NULL, TRUE); InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_SELECT_FONT_PREVIEW), NULL, TRUE);
- StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", CharWidth); + StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", FontPreview.CharWidth); SetDlgItemText(hDlg, IDC_FONT_SIZE_X, szFontSize); - StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", CharHeight); + StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", FontPreview.CharHeight); SetDlgItemText(hDlg, IDC_FONT_SIZE_Y, szFontSize);
return TRUE; diff --git a/dll/cpl/console/layout.c b/dll/cpl/console/layout.c index 9123a1fca7..f8d998625c 100644 --- a/dll/cpl/console/layout.c +++ b/dll/cpl/console/layout.c @@ -205,8 +205,8 @@ WinPrev_OnDraw(
/* We start with the console client area, rescaled for the preview */ SetRect(&rcWin, 0, 0, - pConInfo->WindowSize.X * pConInfo->FontSize.X, - pConInfo->WindowSize.Y * pConInfo->FontSize.Y); + pConInfo->WindowSize.X * FontPreview.CharWidth, + pConInfo->WindowSize.Y * FontPreview.CharHeight); RescaleRect(pData, rcWin);
/* Add the scrollbars if needed (does not account for any frame) */ @@ -489,7 +489,7 @@ PaintText( hBrush = CreateSolidBrush(nbkColor); if (!hBrush) return;
- hOldFont = SelectObject(drawItem->hDC, hCurrentFont); + hOldFont = SelectObject(drawItem->hDC, FontPreview.hFont); //if (hOldFont == NULL) //{ // DeleteObject(hBrush); diff --git a/win32ss/user/winsrv/concfg/settings.c b/win32ss/user/winsrv/concfg/settings.c index fcc66d82af..2c7624f74a 100644 --- a/win32ss/user/winsrv/concfg/settings.c +++ b/win32ss/user/winsrv/concfg/settings.c @@ -120,7 +120,7 @@ ConCfgOpenUserSettings( Status = RtlOpenCurrentUser(/*samDesired*/MAXIMUM_ALLOWED, (PHANDLE)&/*CurrentUserKeyHandle*/hKey); if (!NT_SUCCESS(Status)) { - DPRINT1("RtlOpenCurrentUser failed, Status = 0x%08lx\n", Status); + DPRINT1("RtlOpenCurrentUser() failed, Status = 0x%08lx\n", Status); SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } @@ -170,7 +170,7 @@ ConCfgReadUserSettings( { BOOLEAN Success = FALSE; HKEY hKey; - DWORD dwNumSubKeys = 0; + DWORD dwNumValues = 0; DWORD dwIndex; DWORD dwColorIndex = 0; DWORD dwType; @@ -183,21 +183,21 @@ ConCfgReadUserSettings( if (!ConCfgOpenUserSettings(DefaultSettings ? L"" : ConsoleInfo->ConsoleTitle, &hKey, KEY_READ, FALSE)) { - DPRINT("ConCfgOpenUserSettings failed\n"); + DPRINT("ConCfgOpenUserSettings() failed\n"); return FALSE; }
if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, - &dwNumSubKeys, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + &dwNumValues, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { - DPRINT("ConCfgReadUserSettings: RegQueryInfoKeyW failed\n"); + DPRINT("ConCfgReadUserSettings: RegQueryInfoKeyW() failed\n"); RegCloseKey(hKey); return FALSE; }
- DPRINT("ConCfgReadUserSettings entered dwNumSubKeys %d\n", dwNumSubKeys); + DPRINT("ConCfgReadUserSettings() entered, dwNumValues %d\n", dwNumValues);
- for (dwIndex = 0; dwIndex < dwNumSubKeys; dwIndex++) + for (dwIndex = 0; dwIndex < dwNumValues; dwIndex++) { dwValue = sizeof(Value); dwValueName = ARRAYSIZE(szValueName); @@ -238,24 +238,36 @@ ConCfgReadUserSettings( } else if (!wcscmp(szValueName, L"FaceName")) { - StringCchCopyNW(ConsoleInfo->FaceName, ARRAYSIZE(ConsoleInfo->FaceName), - szValue, ARRAYSIZE(szValue)); + /* A NULL value means that the defaults should be used instead */ + if (*szValue) + { + StringCchCopyNW(ConsoleInfo->FaceName, ARRAYSIZE(ConsoleInfo->FaceName), + szValue, ARRAYSIZE(szValue)); + } Success = TRUE; } else if (!wcscmp(szValueName, L"FontFamily")) { - ConsoleInfo->FontFamily = Value; + /* A zero value means that the defaults should be used instead */ + if (Value) + ConsoleInfo->FontFamily = Value; Success = TRUE; } else if (!wcscmp(szValueName, L"FontSize")) { - ConsoleInfo->FontSize.X = LOWORD(Value); // Width - ConsoleInfo->FontSize.Y = HIWORD(Value); // Height + /* A zero value means that the defaults should be used instead */ + if (Value) + { + ConsoleInfo->FontSize.X = LOWORD(Value); // Width + ConsoleInfo->FontSize.Y = HIWORD(Value); // Height + } Success = TRUE; } else if (!wcscmp(szValueName, L"FontWeight")) { - ConsoleInfo->FontWeight = Value; + /* A zero value means that the defaults should be used instead */ + if (Value) + ConsoleInfo->FontWeight = Value; Success = TRUE; } else if (!wcscmp(szValueName, L"HistoryBufferSize"))