2008-08-07 20:43:05 +00:00
|
|
|
/*
|
2008-05-04 09:04:14 +00:00
|
|
|
* PROJECT: ReactOS Console Configuration DLL
|
|
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
2015-09-22 17:04:32 +00:00
|
|
|
* FILE: dll/cpl/console/font.c
|
2014-04-13 01:03:08 +00:00
|
|
|
* PURPOSE: Font dialog
|
2013-09-15 13:06:05 +00:00
|
|
|
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
|
2014-04-13 01:03:08 +00:00
|
|
|
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
|
2017-04-17 23:21:13 +00:00
|
|
|
* Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
|
2008-05-04 09:04:14 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "console.h"
|
|
|
|
|
2013-03-24 17:08:10 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2014-04-13 01:03:08 +00:00
|
|
|
|
|
|
|
/*
|
2017-05-03 23:56:35 +00:00
|
|
|
* Current active font, corresponding to the active console font,
|
|
|
|
* and used for painting the text samples.
|
2014-04-13 01:03:08 +00:00
|
|
|
*/
|
2017-05-03 23:56:35 +00:00
|
|
|
HFONT hCurrentFont = NULL;
|
|
|
|
|
2014-04-13 01:03:08 +00:00
|
|
|
|
|
|
|
/*
|
2017-05-03 23:56:35 +00:00
|
|
|
* Standard font pixel/point heights for TrueType fonts
|
2014-04-13 01:03:08 +00:00
|
|
|
*/
|
2017-05-03 23:56:35 +00:00
|
|
|
static const SHORT TrueTypePoints[] =
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72
|
|
|
|
};
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
typedef struct _FONTSIZE_LIST_CTL
|
|
|
|
{
|
|
|
|
LIST_CTL RasterSizeList; // ListBox for Raster font sizes; needs to handle bisection.
|
|
|
|
HWND hWndTTSizeList; // ComboBox for TrueType font sizes.
|
|
|
|
BOOL bIsTTSizeDirty; // TRUE or FALSE depending on whether we have edited the edit zone.
|
|
|
|
BOOL UseRasterOrTTList; // TRUE: Use the Raster size list; FALSE: Use the TrueType size list.
|
|
|
|
BOOL TTSizePixelUnit; // TRUE: Size in pixels (default); FALSE: Size in points.
|
|
|
|
LONG CurrentRasterSize;
|
|
|
|
LONG CurrentTTSize; // In whatever unit (pixels or points) currently selected.
|
|
|
|
} FONTSIZE_LIST_CTL, *PFONTSIZE_LIST_CTL;
|
|
|
|
|
|
|
|
/* Used by FontTypeChange() only */
|
|
|
|
static INT CurrentSelFont = LB_ERR;
|
|
|
|
static DWORD CurrentFontType = (DWORD)-1; // Invalid font type
|
|
|
|
|
|
|
|
|
|
|
|
// PLIST_GETCOUNT
|
|
|
|
static INT
|
|
|
|
RasterSizeList_GetCount(
|
|
|
|
IN PLIST_CTL ListCtl)
|
|
|
|
{
|
|
|
|
return (INT)SendMessageW(ListCtl->hWndList, LB_GETCOUNT, 0, 0);
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
// PLIST_GETDATA
|
|
|
|
static ULONG_PTR
|
|
|
|
RasterSizeList_GetData(
|
|
|
|
IN PLIST_CTL ListCtl,
|
|
|
|
IN INT Index)
|
|
|
|
{
|
|
|
|
return (ULONG_PTR)SendMessageW(ListCtl->hWndList, LB_GETITEMDATA, (WPARAM)Index, 0);
|
|
|
|
}
|
2014-04-13 01:03:08 +00:00
|
|
|
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
INT
|
|
|
|
LogicalSizeToPointSize(
|
|
|
|
IN HDC hDC OPTIONAL,
|
|
|
|
IN UINT LogicalSize)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
INT PointSize;
|
|
|
|
HDC hOrgDC = hDC;
|
|
|
|
|
|
|
|
if (!hDC)
|
|
|
|
hDC = GetDC(NULL);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
// LogicalSize = tm.tmHeight - tm.tmInternalLeading;
|
|
|
|
PointSize = MulDiv(LogicalSize, 72, GetDeviceCaps(hDC, LOGPIXELSY));
|
2017-04-17 23:21:13 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
if (!hOrgDC)
|
|
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
|
|
|
|
return PointSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
INT
|
|
|
|
PointSizeToLogicalSize(
|
|
|
|
IN HDC hDC OPTIONAL,
|
|
|
|
IN INT PointSize)
|
|
|
|
{
|
|
|
|
INT LogicalSize;
|
|
|
|
HDC hOrgDC = hDC;
|
2017-04-17 23:21:13 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
if (!hDC)
|
|
|
|
hDC = GetDC(NULL);
|
|
|
|
|
|
|
|
LogicalSize = MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
|
|
|
|
|
|
|
|
if (!hOrgDC)
|
|
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
|
|
|
|
return LogicalSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static VOID
|
|
|
|
FontSizeList_SelectFontSize(
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList,
|
|
|
|
IN ULONG FontSize)
|
2017-04-17 23:21:13 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
INT nSel;
|
|
|
|
WCHAR szFontSize[100];
|
|
|
|
|
|
|
|
//
|
|
|
|
// FIXME: Check whether FontSize == 0
|
|
|
|
// (or in the case of raster font maybe, whether HIWORD(FontSize) == Height == 0) ??
|
|
|
|
//
|
|
|
|
|
|
|
|
/* Find and select the best font size in the list corresponding to the current size */
|
|
|
|
if (SizeList->UseRasterOrTTList)
|
|
|
|
{
|
|
|
|
INT idx;
|
|
|
|
|
|
|
|
/* Raster font size (in pixels) */
|
|
|
|
SizeList->CurrentRasterSize = FontSize;
|
|
|
|
|
|
|
|
nSel = BisectListSortedByValue(&SizeList->RasterSizeList, FontSize, NULL, FALSE);
|
|
|
|
idx = (INT)SendMessageW(SizeList->RasterSizeList.hWndList, LB_GETCOUNT, 0, 0);
|
|
|
|
if (nSel == LB_ERR)
|
|
|
|
{
|
|
|
|
/* Not found, select the first element of the list */
|
|
|
|
nSel = 0;
|
|
|
|
}
|
|
|
|
else if (nSel >= idx)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We got an index beyond the end of the list (as per Bisect* functionality),
|
|
|
|
* so instead, select the last element of the list.
|
|
|
|
*/
|
|
|
|
nSel = idx-1;
|
|
|
|
}
|
|
|
|
SendMessageW(SizeList->RasterSizeList.hWndList, LB_SETCURSEL, (WPARAM)nSel, 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* TrueType font size (in pixels or points) */
|
|
|
|
SizeList->CurrentTTSize = FontSize;
|
|
|
|
|
|
|
|
// _ultow(szFontSize, FontSize, 10);
|
|
|
|
StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", FontSize);
|
|
|
|
|
|
|
|
/* Find the font size in the list, or add it both in the ComboBox list, sorted by size value (string), and its edit box */
|
|
|
|
nSel = SendMessageW(SizeList->hWndTTSizeList, CB_FINDSTRINGEXACT, 0, (LPARAM)szFontSize);
|
|
|
|
if (nSel == CB_ERR)
|
|
|
|
{
|
|
|
|
nSel = (UINT)SendMessageW(SizeList->hWndTTSizeList, CB_ADDSTRING, -1, (LPARAM)szFontSize);
|
|
|
|
// ComboBox_SetText(...)
|
|
|
|
SetWindowTextW(SizeList->hWndTTSizeList, szFontSize);
|
|
|
|
SizeList->bIsTTSizeDirty = TRUE;
|
|
|
|
}
|
|
|
|
SendMessageW(SizeList->hWndTTSizeList, CB_SETCURSEL, (WPARAM)nSel, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static LONG
|
|
|
|
FontSizeList_GetSelectedFontSize(
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList)
|
|
|
|
{
|
|
|
|
INT nSel;
|
|
|
|
LONG FontSize;
|
2017-09-01 20:17:25 +00:00
|
|
|
PWCHAR pszNext = NULL;
|
2017-05-03 23:56:35 +00:00
|
|
|
WCHAR szFontSize[100];
|
|
|
|
|
|
|
|
if (SizeList->UseRasterOrTTList)
|
|
|
|
{
|
|
|
|
/* Raster font size (in pixels) */
|
|
|
|
|
|
|
|
nSel = (INT)SendMessageW(SizeList->RasterSizeList.hWndList, LB_GETCURSEL, 0, 0);
|
|
|
|
if (nSel == LB_ERR) return 0;
|
|
|
|
|
|
|
|
FontSize = (LONG)SizeList->RasterSizeList.GetData(&SizeList->RasterSizeList, nSel);
|
|
|
|
if (FontSize == LB_ERR) return 0;
|
|
|
|
|
|
|
|
SizeList->CurrentRasterSize = FontSize;
|
|
|
|
}
|
2017-04-17 23:21:13 +00:00
|
|
|
else
|
2017-05-03 23:56:35 +00:00
|
|
|
{
|
|
|
|
/* TrueType font size (in pixels or points) */
|
|
|
|
|
|
|
|
if (!SizeList->bIsTTSizeDirty)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* The user just selected an existing size, read the ComboBox selection.
|
|
|
|
*
|
|
|
|
* See: https://support.microsoft.com/en-us/help/66365/how-to-process-a-cbn-selchange-notification-message
|
|
|
|
* for more details.
|
|
|
|
*/
|
|
|
|
nSel = SendMessageW(SizeList->hWndTTSizeList, CB_GETCURSEL, 0, 0);
|
|
|
|
SendMessageW(SizeList->hWndTTSizeList, CB_GETLBTEXT, nSel, (LPARAM)szFontSize);
|
2017-09-01 20:17:25 +00:00
|
|
|
|
|
|
|
/* Validate the font size */
|
|
|
|
FontSize = wcstoul(szFontSize, &pszNext, 10);
|
|
|
|
if ((FontSize == 0) || (*pszNext))
|
|
|
|
return 0;
|
2017-05-03 23:56:35 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Read the ComboBox edit string, as the user has entered a custom size */
|
|
|
|
// ComboBox_GetText(...)
|
|
|
|
GetWindowTextW(SizeList->hWndTTSizeList, szFontSize, ARRAYSIZE(szFontSize));
|
|
|
|
|
2017-09-01 20:17:25 +00:00
|
|
|
/* Validate the font size */
|
|
|
|
FontSize = wcstoul(szFontSize, &pszNext, 10);
|
|
|
|
if ((FontSize == 0) || (*pszNext))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Find if the font size already exists in the list; if not, add it */
|
2017-05-03 23:56:35 +00:00
|
|
|
nSel = SendMessageW(SizeList->hWndTTSizeList, CB_FINDSTRINGEXACT, 0, (LPARAM)szFontSize);
|
|
|
|
if (nSel == CB_ERR)
|
|
|
|
{
|
|
|
|
nSel = (UINT)SendMessageW(SizeList->hWndTTSizeList, CB_ADDSTRING, -1, (LPARAM)szFontSize);
|
|
|
|
//// ComboBox_SetText(...)
|
|
|
|
//SetWindowTextW(SizeList->hWndTTSizeList, szFontSize);
|
|
|
|
//SizeList->bIsTTSizeDirty = TRUE;
|
|
|
|
}
|
|
|
|
SendMessageW(SizeList->hWndTTSizeList, CB_SETCURSEL, (WPARAM)nSel, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
SizeList->bIsTTSizeDirty = FALSE;
|
|
|
|
|
|
|
|
SizeList->CurrentTTSize = FontSize;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If the font size is given in points, instead of pixels,
|
|
|
|
* convert it into logical size.
|
|
|
|
*/
|
|
|
|
if (!SizeList->TTSizePixelUnit)
|
|
|
|
FontSize = -PointSizeToLogicalSize(NULL, FontSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
return FontSize;
|
2017-04-17 23:21:13 +00:00
|
|
|
}
|
|
|
|
|
2017-04-24 17:01:07 +00:00
|
|
|
|
|
|
|
static VOID
|
|
|
|
AddFontToList(
|
|
|
|
IN HWND hWndList,
|
2017-05-03 23:56:35 +00:00
|
|
|
IN LPCWSTR pszFaceName,
|
2017-04-24 17:01:07 +00:00
|
|
|
IN DWORD FontType)
|
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
INT iItem;
|
2017-04-24 17:01:07 +00:00
|
|
|
|
|
|
|
/* Make sure the font doesn't already exist in the list */
|
2017-05-03 23:56:35 +00:00
|
|
|
if (SendMessageW(hWndList, LB_FINDSTRINGEXACT, 0, (LPARAM)pszFaceName) != LB_ERR)
|
2017-04-24 17:01:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
/* Add the font */
|
2017-05-03 23:56:35 +00:00
|
|
|
iItem = (INT)SendMessageW(hWndList, LB_ADDSTRING, 0, (LPARAM)pszFaceName);
|
|
|
|
if (iItem == LB_ERR)
|
2017-04-24 17:01:07 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
DPRINT1("Failed to add font '%S'\n", pszFaceName);
|
2017-04-24 17:01:07 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
DPRINT1("Add font '%S'\n", pszFaceName);
|
2017-04-24 17:01:07 +00:00
|
|
|
|
|
|
|
/* Store this information in the list-item's userdata area */
|
2017-05-03 23:56:35 +00:00
|
|
|
// SendMessageW(hWndList, LB_SETITEMDATA, idx, MAKELPARAM(fFixed, fTrueType));
|
|
|
|
SendMessageW(hWndList, LB_SETITEMDATA, iItem, (LPARAM)FontType);
|
2017-04-24 17:01:07 +00:00
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
typedef struct _FACE_NAMES_PROC_PARAM
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
HWND hWndList;
|
|
|
|
UINT CodePage;
|
|
|
|
} FACE_NAMES_PROC_PARAM, *PFACE_NAMES_PROC_PARAM;
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
static BOOL CALLBACK
|
|
|
|
EnumFaceNamesProc(
|
|
|
|
IN PLOGFONTW lplf,
|
|
|
|
IN PNEWTEXTMETRICW lpntm,
|
|
|
|
IN DWORD FontType,
|
|
|
|
IN LPARAM lParam)
|
|
|
|
{
|
|
|
|
PFACE_NAMES_PROC_PARAM Param = (PFACE_NAMES_PROC_PARAM)lParam;
|
2014-04-13 01:03:08 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* To install additional TrueType fonts to be available for the console,
|
|
|
|
* add entries of type REG_SZ named "0", "00" etc... in:
|
|
|
|
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
|
|
|
|
* The names of the fonts listed there should match those in:
|
|
|
|
* HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts
|
|
|
|
*/
|
2017-05-03 23:56:35 +00:00
|
|
|
if (IsValidConsoleFont2(lplf, lpntm, FontType, Param->CodePage))
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/* Add the font to the list */
|
|
|
|
AddFontToList(Param->hWndList, lplf->lfFaceName, FontType);
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/* Continue the font enumeration */
|
|
|
|
return TRUE;
|
|
|
|
}
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
static BOOL CALLBACK
|
|
|
|
EnumFontSizesProc(
|
|
|
|
IN PLOGFONTW lplf,
|
|
|
|
IN PNEWTEXTMETRICW lpntm,
|
|
|
|
IN DWORD FontType,
|
|
|
|
IN LPARAM lParam)
|
|
|
|
{
|
|
|
|
PFONTSIZE_LIST_CTL SizeList = (PFONTSIZE_LIST_CTL)lParam;
|
|
|
|
UINT iItem, iDupItem;
|
|
|
|
WCHAR szFontSize[100];
|
|
|
|
|
|
|
|
if (FontType != TRUETYPE_FONTTYPE)
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
WPARAM FontSize;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Format:
|
|
|
|
* Width = FontSize.X = LOWORD(FontSize);
|
|
|
|
* Height = FontSize.Y = HIWORD(FontSize);
|
|
|
|
*/
|
|
|
|
|
|
|
|
StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d x %d", lplf->lfWidth, lplf->lfHeight);
|
|
|
|
FontSize = MAKEWPARAM(lplf->lfWidth, lplf->lfHeight);
|
|
|
|
|
|
|
|
/* Add the font size into the list, sorted by size value. Avoid any duplicates. */
|
|
|
|
/* Store this information in the list-item's userdata area */
|
|
|
|
iDupItem = LB_ERR;
|
|
|
|
iItem = BisectListSortedByValue(&SizeList->RasterSizeList, FontSize, &iDupItem, TRUE);
|
|
|
|
if (iItem == LB_ERR)
|
|
|
|
iItem = 0;
|
|
|
|
if (iDupItem == LB_ERR)
|
2017-04-17 23:21:13 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
iItem = (UINT)SendMessageW(SizeList->RasterSizeList.hWndList, LB_INSERTSTRING, iItem, (LPARAM)szFontSize);
|
|
|
|
if (iItem != LB_ERR && iItem != LB_ERRSPACE)
|
|
|
|
iItem = SendMessageW(SizeList->RasterSizeList.hWndList, LB_SETITEMDATA, iItem, FontSize);
|
2017-04-17 23:21:13 +00:00
|
|
|
}
|
2017-05-03 23:56:35 +00:00
|
|
|
|
|
|
|
return TRUE;
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
2017-04-17 23:21:13 +00:00
|
|
|
else
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/* TrueType or vectored font: list all the hardcoded font points */
|
|
|
|
ULONG i;
|
|
|
|
for (i = 0; i < ARRAYSIZE(TrueTypePoints); ++i)
|
2017-04-17 23:21:13 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
// _ultow(szFontSize, TrueTypePoints[i], 10);
|
|
|
|
StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", TrueTypePoints[i]);
|
|
|
|
|
|
|
|
/* Add the font size into the list, sorted by size value (string). Avoid any duplicates. */
|
|
|
|
if (SendMessageW(SizeList->hWndTTSizeList, CB_FINDSTRINGEXACT, 0, (LPARAM)szFontSize) == CB_ERR)
|
|
|
|
iItem = (UINT)SendMessageW(SizeList->hWndTTSizeList, CB_INSERTSTRING, -1, (LPARAM)szFontSize);
|
2017-04-17 23:21:13 +00:00
|
|
|
}
|
2017-05-03 23:56:35 +00:00
|
|
|
|
|
|
|
/* Stop the enumeration now */
|
|
|
|
return FALSE;
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
2017-05-03 23:56:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static VOID
|
|
|
|
FaceNameList_Initialize(
|
|
|
|
IN HWND hWndList,
|
|
|
|
IN UINT CodePage)
|
|
|
|
{
|
|
|
|
FACE_NAMES_PROC_PARAM Param;
|
|
|
|
HDC hDC;
|
|
|
|
LOGFONTW lf;
|
|
|
|
INT idx;
|
|
|
|
|
|
|
|
Param.hWndList = hWndList;
|
|
|
|
Param.CodePage = CodePage;
|
|
|
|
|
|
|
|
ZeroMemory(&lf, sizeof(lf));
|
|
|
|
lf.lfCharSet = DEFAULT_CHARSET; // CodePageToCharSet(CodePage);
|
|
|
|
// lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDC = GetDC(NULL);
|
|
|
|
EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFaceNamesProc, (LPARAM)&Param, 0);
|
|
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
|
|
|
|
idx = (INT)SendMessageW(hWndList, LB_GETCOUNT, 0, 0);
|
|
|
|
if (idx != LB_ERR && idx != 0)
|
2014-04-13 01:03:08 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/* We have found some fonts and filled the list, we are fine! */
|
|
|
|
return;
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/* No fonts were found. Manually add default ones into the list. */
|
|
|
|
DPRINT1("The ideal console fonts were not found; manually add default ones.\n");
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
AddFontToList(hWndList, L"Terminal", RASTER_FONTTYPE);
|
|
|
|
AddFontToList(hWndList, L"Lucida Console", TRUETYPE_FONTTYPE);
|
|
|
|
if (CodePageToCharSet(CodePage) != DEFAULT_CHARSET)
|
|
|
|
AddFontToList(hWndList, L"Droid Sans Fallback", TRUETYPE_FONTTYPE);
|
2014-04-13 01:03:08 +00:00
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
static VOID
|
|
|
|
FaceNameList_SelectFaceName(
|
|
|
|
IN HWND hWndList,
|
|
|
|
IN LPCWSTR FaceName)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
INT iItem;
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
iItem = (INT)SendMessageW(hWndList, LB_FINDSTRINGEXACT, 0, (LPARAM)FaceName);
|
|
|
|
if (iItem == LB_ERR)
|
|
|
|
iItem = (INT)SendMessageW(hWndList, LB_FINDSTRINGEXACT, 0, (LPARAM)L"Terminal");
|
|
|
|
if (iItem == LB_ERR)
|
|
|
|
iItem = 0;
|
|
|
|
SendMessageW(hWndList, LB_SETCURSEL, (WPARAM)iItem, 0);
|
|
|
|
|
|
|
|
// return iItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
static VOID
|
|
|
|
UpdateFontSizeList(
|
|
|
|
IN HWND hDlg,
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList)
|
|
|
|
{
|
|
|
|
HWND hDlgItem;
|
|
|
|
|
|
|
|
if (SizeList->UseRasterOrTTList)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/*
|
|
|
|
* Raster font: show the Raster size list, and
|
|
|
|
* hide the TrueType size list and the units.
|
|
|
|
*/
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
// EnableDlgItem(hDlg, IDC_CHECK_BOLD_FONTS, FALSE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = GetDlgItem(hDlg, IDC_RADIO_PIXEL_UNIT);
|
|
|
|
ShowWindow(hDlgItem, SW_HIDE);
|
|
|
|
EnableWindow(hDlgItem, FALSE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = GetDlgItem(hDlg, IDC_RADIO_POINT_UNIT);
|
|
|
|
ShowWindow(hDlgItem, SW_HIDE);
|
|
|
|
EnableWindow(hDlgItem, FALSE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = SizeList->hWndTTSizeList;
|
|
|
|
ShowWindow(hDlgItem, SW_HIDE);
|
|
|
|
EnableWindow(hDlgItem, FALSE);
|
|
|
|
|
|
|
|
hDlgItem = SizeList->RasterSizeList.hWndList;
|
|
|
|
EnableWindow(hDlgItem, TRUE);
|
|
|
|
ShowWindow(hDlgItem, SW_SHOW);
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/*
|
|
|
|
* TrueType font: show the TrueType size list
|
|
|
|
* and the units, and hide the Raster size list.
|
|
|
|
*/
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
// EnableDlgItem(hDlg, IDC_CHECK_BOLD_FONTS, TRUE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = SizeList->RasterSizeList.hWndList;
|
|
|
|
ShowWindow(hDlgItem, SW_HIDE);
|
|
|
|
EnableWindow(hDlgItem, FALSE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = SizeList->hWndTTSizeList;
|
|
|
|
EnableWindow(hDlgItem, TRUE);
|
|
|
|
ShowWindow(hDlgItem, SW_SHOW);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = GetDlgItem(hDlg, IDC_RADIO_PIXEL_UNIT);
|
|
|
|
EnableWindow(hDlgItem, TRUE);
|
|
|
|
ShowWindow(hDlgItem, SW_SHOW);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDlgItem = GetDlgItem(hDlg, IDC_RADIO_POINT_UNIT);
|
|
|
|
EnableWindow(hDlgItem, TRUE);
|
|
|
|
ShowWindow(hDlgItem, SW_SHOW);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static BOOL
|
|
|
|
FontSizeChange(
|
|
|
|
IN HWND hDlg,
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList,
|
|
|
|
IN OUT PCONSOLE_STATE_INFO pConInfo);
|
|
|
|
|
|
|
|
static BOOL
|
|
|
|
FontTypeChange(
|
|
|
|
IN HWND hDlg,
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList,
|
|
|
|
IN OUT PCONSOLE_STATE_INFO pConInfo)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
HWND hListBox = GetDlgItem(hDlg, IDC_LBOX_FONTTYPE);
|
2014-08-11 13:35:33 +00:00
|
|
|
INT Length, nSel;
|
|
|
|
LOGFONTW lf;
|
2017-05-03 23:56:35 +00:00
|
|
|
LPWSTR FaceName;
|
|
|
|
DWORD FontType;
|
|
|
|
LPCWSTR FontGrpBoxLabelTpl = NULL;
|
|
|
|
WCHAR FontGrpBoxLabel[260];
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-04-24 17:01:07 +00:00
|
|
|
nSel = (INT)SendMessageW(hListBox, LB_GETCURSEL, 0, 0);
|
2017-05-03 23:56:35 +00:00
|
|
|
if (nSel == LB_ERR) return FALSE;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This is disabled, because there can be external parameters
|
|
|
|
* that may have changed (e.g. ConInfo->FontWeight, code page, ...)
|
|
|
|
* and that we don't control here, and that need a font refresh.
|
|
|
|
*/
|
|
|
|
#if 0
|
|
|
|
/* Check whether the selection has changed */
|
|
|
|
if (nSel == CurrentSelFont)
|
|
|
|
return FALSE;
|
|
|
|
#endif
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-04-24 17:01:07 +00:00
|
|
|
Length = (INT)SendMessageW(hListBox, LB_GETTEXTLEN, nSel, 0);
|
2017-05-03 23:56:35 +00:00
|
|
|
if (Length == LB_ERR) return FALSE;
|
2014-08-11 13:35:33 +00:00
|
|
|
|
|
|
|
FaceName = HeapAlloc(GetProcessHeap(),
|
|
|
|
HEAP_ZERO_MEMORY,
|
|
|
|
(Length + 1) * sizeof(WCHAR));
|
2017-05-03 23:56:35 +00:00
|
|
|
if (FaceName == NULL) return FALSE;
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-04-24 17:01:07 +00:00
|
|
|
Length = (INT)SendMessageW(hListBox, LB_GETTEXT, nSel, (LPARAM)FaceName);
|
|
|
|
FaceName[Length] = L'\0';
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-04-24 17:01:07 +00:00
|
|
|
StringCchCopyW(pConInfo->FaceName, ARRAYSIZE(pConInfo->FaceName), FaceName);
|
2015-03-24 23:58:44 +00:00
|
|
|
DPRINT1("pConInfo->FaceName = '%S'\n", pConInfo->FaceName);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
|
|
|
ZeroMemory(&lf, sizeof(lf));
|
2017-04-17 23:21:13 +00:00
|
|
|
lf.lfCharSet = DEFAULT_CHARSET; // CodePageToCharSet(pConInfo->CodePage);
|
2014-08-11 13:35:33 +00:00
|
|
|
// lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
|
2017-04-24 17:01:07 +00:00
|
|
|
StringCchCopyW(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), FaceName);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/*
|
|
|
|
* Retrieve the read-only font group box label string template,
|
|
|
|
* and set the group box label to the name of the selected font.
|
|
|
|
*/
|
|
|
|
Length = LoadStringW(hApplet, IDS_GROUPBOX_FONT_NAME, (LPWSTR)&FontGrpBoxLabelTpl, 0);
|
|
|
|
if (FontGrpBoxLabelTpl && Length > 0)
|
|
|
|
{
|
|
|
|
StringCchCopyNW(FontGrpBoxLabel, ARRAYSIZE(FontGrpBoxLabel), FontGrpBoxLabelTpl, Length);
|
|
|
|
StringCchCatW(FontGrpBoxLabel, ARRAYSIZE(FontGrpBoxLabel), FaceName);
|
|
|
|
SetDlgItemTextW(hDlg, IDC_GROUPBOX_FONT_NAME, FontGrpBoxLabel);
|
|
|
|
}
|
2014-08-11 13:35:33 +00:00
|
|
|
|
|
|
|
HeapFree(GetProcessHeap(), 0, FaceName);
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/*
|
|
|
|
* Reset the font size list, only:
|
|
|
|
* - if we have changed the type of font, or
|
|
|
|
* - if the font type is the same and is RASTER but the font has changed.
|
|
|
|
* Otherwise, if the font type is not RASTER and has not changed,
|
|
|
|
* we always display the TrueType default sizes and we don't need to
|
|
|
|
* recreate the list when we change between different TrueType fonts.
|
|
|
|
*/
|
|
|
|
FontType = SendMessageW(hListBox, LB_GETITEMDATA, nSel, 0);
|
|
|
|
if (FontType != LB_ERR)
|
|
|
|
{
|
|
|
|
SizeList->UseRasterOrTTList = (FontType == RASTER_FONTTYPE);
|
|
|
|
|
|
|
|
/* Display the correct font size list (if needed) */
|
|
|
|
if (CurrentFontType != FontType)
|
|
|
|
UpdateFontSizeList(hDlg, SizeList);
|
|
|
|
|
|
|
|
/* Enumerate the available sizes for the selected font */
|
|
|
|
if ((CurrentFontType != FontType) ||
|
|
|
|
(FontType == RASTER_FONTTYPE && CurrentSelFont != nSel))
|
|
|
|
{
|
|
|
|
HDC hDC;
|
|
|
|
|
|
|
|
if (SizeList->UseRasterOrTTList)
|
|
|
|
SendMessageW(SizeList->RasterSizeList.hWndList, LB_RESETCONTENT, 0, 0);
|
|
|
|
else
|
|
|
|
SendMessageW(SizeList->hWndTTSizeList, CB_RESETCONTENT, 0, 0);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
hDC = GetDC(NULL);
|
|
|
|
EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFontSizesProc, (LPARAM)SizeList, 0);
|
|
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
|
|
|
|
/* Re-select the current font size */
|
|
|
|
if (SizeList->UseRasterOrTTList)
|
|
|
|
FontSizeList_SelectFontSize(SizeList, SizeList->CurrentRasterSize);
|
|
|
|
else
|
|
|
|
FontSizeList_SelectFontSize(SizeList, SizeList->CurrentTTSize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* We failed, display the raster fonts size list */
|
|
|
|
SizeList->UseRasterOrTTList = TRUE;
|
|
|
|
UpdateFontSizeList(hDlg, SizeList);
|
|
|
|
}
|
|
|
|
CurrentFontType = FontType;
|
|
|
|
CurrentSelFont = nSel;
|
|
|
|
|
|
|
|
FontSizeChange(hDlg, SizeList, pConInfo);
|
|
|
|
return TRUE;
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
static BOOL
|
|
|
|
FontSizeChange(
|
|
|
|
IN HWND hDlg,
|
|
|
|
IN PFONTSIZE_LIST_CTL SizeList,
|
|
|
|
IN OUT PCONSOLE_STATE_INFO pConInfo)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
HDC hDC;
|
|
|
|
LONG CharWidth, CharHeight, FontSize;
|
|
|
|
WCHAR szFontSize[100];
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/*
|
|
|
|
* Retrieve the current selected font size.
|
|
|
|
* - If SizeList->UseRasterOrTTList is TRUE, or if it is FALSE but
|
|
|
|
* if SizeList->TTSizePixelUnit is TRUE, then the font size is in pixels;
|
|
|
|
* - If SizeList->TTSizePixelUnit is FALSE, then the font size is in points.
|
|
|
|
*/
|
2017-09-01 20:17:25 +00:00
|
|
|
FontSize = FontSizeList_GetSelectedFontSize(SizeList);
|
|
|
|
if (FontSize == 0)
|
|
|
|
return FALSE; // We have got an invalid font size...
|
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
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");
|
|
|
|
|
|
|
|
/* Retrieve the real character size in pixels */
|
|
|
|
hDC = GetDC(NULL);
|
|
|
|
GetFontCellSize(hDC, hCurrentFont, (PUINT)&CharHeight, (PUINT)&CharWidth);
|
|
|
|
ReleaseDC(NULL, hDC);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Format:
|
|
|
|
* Width = FontSize.X = LOWORD(FontSize);
|
|
|
|
* Height = FontSize.Y = HIWORD(FontSize);
|
|
|
|
*/
|
2017-05-03 23:56:35 +00:00
|
|
|
pConInfo->FontSize.X = (SHORT)(SizeList->UseRasterOrTTList ? CharWidth : 0);
|
|
|
|
pConInfo->FontSize.Y = (SHORT)CharHeight;
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
DPRINT1("pConInfo->FontSize = (%d x %d) ; (CharWidth x CharHeight) = (%d x %d)\n",
|
|
|
|
pConInfo->FontSize.X, pConInfo->FontSize.Y, CharWidth, CharHeight);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_FONT_WINDOW_PREVIEW), NULL, TRUE);
|
|
|
|
InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_SELECT_FONT_PREVIEW), NULL, TRUE);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", CharWidth);
|
|
|
|
SetDlgItemText(hDlg, IDC_FONT_SIZE_X, szFontSize);
|
|
|
|
StringCchPrintfW(szFontSize, ARRAYSIZE(szFontSize), L"%d", CharHeight);
|
|
|
|
SetDlgItemText(hDlg, IDC_FONT_SIZE_Y, szFontSize);
|
|
|
|
|
|
|
|
return TRUE;
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-05-04 09:04:14 +00:00
|
|
|
INT_PTR
|
|
|
|
CALLBACK
|
2017-05-03 23:56:35 +00:00
|
|
|
FontProc(HWND hDlg,
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
UINT uMsg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
2008-05-04 09:04:14 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
PFONTSIZE_LIST_CTL SizeList;
|
|
|
|
|
|
|
|
SizeList = (PFONTSIZE_LIST_CTL)GetWindowLongPtrW(hDlg, DWLP_USER);
|
2008-05-04 09:04:14 +00:00
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
HWND hFontList = GetDlgItem(hDlg, IDC_LBOX_FONTTYPE);
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
SizeList = (PFONTSIZE_LIST_CTL)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*SizeList));
|
|
|
|
if (!SizeList)
|
|
|
|
{
|
|
|
|
EndDialog(hDlg, 0);
|
|
|
|
return (INT_PTR)TRUE;
|
|
|
|
}
|
|
|
|
SizeList->RasterSizeList.hWndList = GetDlgItem(hDlg, IDC_LBOX_FONTSIZE);
|
|
|
|
SizeList->RasterSizeList.GetCount = RasterSizeList_GetCount;
|
|
|
|
SizeList->RasterSizeList.GetData = RasterSizeList_GetData;
|
|
|
|
SizeList->hWndTTSizeList = GetDlgItem(hDlg, IDC_CBOX_FONTSIZE);
|
|
|
|
SizeList->bIsTTSizeDirty = FALSE;
|
|
|
|
SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR)SizeList);
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/* By default show the raster font size list */
|
|
|
|
SizeList->UseRasterOrTTList = TRUE;
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/* By default show the font sizes in pixel units */
|
|
|
|
CheckRadioButton(hDlg, IDC_RADIO_PIXEL_UNIT, IDC_RADIO_POINT_UNIT, IDC_RADIO_PIXEL_UNIT);
|
|
|
|
SizeList->TTSizePixelUnit = TRUE;
|
2017-04-17 23:21:13 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
UpdateFontSizeList(hDlg, SizeList);
|
|
|
|
|
|
|
|
/* Initialize the font list */
|
|
|
|
FaceNameList_Initialize(hFontList, ConInfo->CodePage);
|
2017-04-17 23:21:13 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
/* Select the current font */
|
2015-03-24 23:58:44 +00:00
|
|
|
DPRINT1("ConInfo->FaceName = '%S'\n", ConInfo->FaceName);
|
2017-05-03 23:56:35 +00:00
|
|
|
FaceNameList_SelectFaceName(hFontList, ConInfo->FaceName);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
if (ConInfo->FontWeight >= FW_BOLD)
|
|
|
|
CheckDlgButton(hDlg, IDC_CHECK_BOLD_FONTS, BST_CHECKED);
|
|
|
|
else
|
|
|
|
CheckDlgButton(hDlg, IDC_CHECK_BOLD_FONTS, BST_UNCHECKED);
|
|
|
|
|
|
|
|
/* Select the current font size */
|
|
|
|
/*
|
|
|
|
* Format:
|
|
|
|
* Width = FontSize.X = LOWORD(FontSize);
|
|
|
|
* Height = FontSize.Y = HIWORD(FontSize);
|
|
|
|
*/
|
|
|
|
SizeList->CurrentRasterSize = MAKELONG(ConInfo->FontSize.X, ConInfo->FontSize.Y);
|
|
|
|
SizeList->CurrentTTSize = ConInfo->FontSize.Y;
|
|
|
|
// FontSizeList_SelectFontSize(SizeList, SizeList->CurrentRasterSize);
|
|
|
|
|
|
|
|
/* Refresh everything */
|
|
|
|
FontTypeChange(hDlg, SizeList, ConInfo);
|
2014-04-13 01:03:08 +00:00
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
case WM_DESTROY:
|
|
|
|
{
|
|
|
|
if (SizeList)
|
|
|
|
HeapFree(GetProcessHeap(), 0, SizeList);
|
|
|
|
return (INT_PTR)TRUE;
|
|
|
|
}
|
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
case WM_DRAWITEM:
|
|
|
|
{
|
2014-04-13 01:03:08 +00:00
|
|
|
LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam;
|
|
|
|
|
2017-05-08 17:33:33 +00:00
|
|
|
if (drawItem->CtlID == IDC_STATIC_SELECT_FONT_PREVIEW)
|
2015-03-24 23:58:44 +00:00
|
|
|
PaintText(drawItem, ConInfo, Screen);
|
2014-08-11 13:35:33 +00:00
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2014-04-13 01:03:08 +00:00
|
|
|
|
2017-05-08 17:33:33 +00:00
|
|
|
case WM_DISPLAYCHANGE:
|
|
|
|
{
|
|
|
|
/* Retransmit to the preview window */
|
|
|
|
SendDlgItemMessageW(hDlg, IDC_STATIC_FONT_WINDOW_PREVIEW,
|
|
|
|
WM_DISPLAYCHANGE, wParam, lParam);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2014-08-11 13:35:33 +00:00
|
|
|
case WM_NOTIFY:
|
|
|
|
{
|
|
|
|
switch (((LPNMHDR)lParam)->code)
|
|
|
|
{
|
|
|
|
case PSN_APPLY:
|
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
ApplyConsoleInfo(hDlg);
|
2015-04-05 23:04:42 +00:00
|
|
|
return TRUE;
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case WM_COMMAND:
|
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
if (HIWORD(wParam) == LBN_SELCHANGE /* || CBN_SELCHANGE */)
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
switch (LOWORD(wParam))
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
case IDC_LBOX_FONTTYPE:
|
|
|
|
{
|
|
|
|
/* Change the property sheet state only if the font has really changed */
|
|
|
|
if (FontTypeChange(hDlg, SizeList, ConInfo))
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case IDC_LBOX_FONTSIZE:
|
|
|
|
case IDC_CBOX_FONTSIZE:
|
2014-08-11 13:35:33 +00:00
|
|
|
{
|
2017-05-03 23:56:35 +00:00
|
|
|
/* Change the property sheet state only if the font has really changed */
|
|
|
|
if (FontSizeChange(hDlg, SizeList, ConInfo))
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
|
|
break;
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
2017-05-03 23:56:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
/* NOTE: CBN_EDITUPDATE is sent first, and is followed by CBN_EDITCHANGE */
|
|
|
|
else if (HIWORD(wParam) == CBN_EDITUPDATE && LOWORD(wParam) == IDC_CBOX_FONTSIZE)
|
|
|
|
{
|
|
|
|
ULONG FontSize;
|
|
|
|
PWCHAR pszNext = NULL;
|
|
|
|
WCHAR szFontSize[100];
|
|
|
|
WCHAR szMessage[260];
|
|
|
|
|
2017-09-01 20:17:25 +00:00
|
|
|
/* Read the ComboBox edit string, as the user has entered a custom size */
|
2017-05-03 23:56:35 +00:00
|
|
|
GetWindowTextW(SizeList->hWndTTSizeList, szFontSize, ARRAYSIZE(szFontSize));
|
2017-09-01 20:17:25 +00:00
|
|
|
|
|
|
|
/* Validate the font size */
|
2017-05-03 23:56:35 +00:00
|
|
|
FontSize = wcstoul(szFontSize, &pszNext, 10);
|
2017-09-01 20:17:25 +00:00
|
|
|
if ((FontSize == 0) || (*pszNext))
|
2017-05-03 23:56:35 +00:00
|
|
|
{
|
|
|
|
// FIXME: Localize!
|
|
|
|
StringCchPrintfW(szMessage, ARRAYSIZE(szMessage), L"\"%s\" is not a valid font size.", szFontSize);
|
|
|
|
MessageBoxW(hDlg, szMessage, L"Error", MB_ICONINFORMATION | MB_OK);
|
|
|
|
}
|
|
|
|
/**/SizeList->bIsTTSizeDirty = TRUE;/**/
|
|
|
|
}
|
|
|
|
else if (HIWORD(wParam) == CBN_KILLFOCUS && LOWORD(wParam) == IDC_CBOX_FONTSIZE)
|
|
|
|
{
|
|
|
|
/* Change the property sheet state only if the font has really changed */
|
|
|
|
if (FontSizeChange(hDlg, SizeList, ConInfo))
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (HIWORD(wParam) == BN_CLICKED)
|
|
|
|
{
|
|
|
|
switch (LOWORD(wParam))
|
|
|
|
{
|
|
|
|
case IDC_CHECK_BOLD_FONTS:
|
|
|
|
{
|
|
|
|
if (IsDlgButtonChecked(hDlg, IDC_CHECK_BOLD_FONTS) == BST_CHECKED)
|
|
|
|
ConInfo->FontWeight = FW_BOLD;
|
|
|
|
else
|
|
|
|
ConInfo->FontWeight = FW_NORMAL;
|
2014-08-11 13:35:33 +00:00
|
|
|
|
2017-05-03 23:56:35 +00:00
|
|
|
FontTypeChange(hDlg, SizeList, ConInfo);
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
2014-08-11 13:35:33 +00:00
|
|
|
break;
|
|
|
|
}
|
2017-05-03 23:56:35 +00:00
|
|
|
|
|
|
|
case IDC_RADIO_PIXEL_UNIT:
|
|
|
|
case IDC_RADIO_POINT_UNIT:
|
|
|
|
{
|
|
|
|
SizeList->TTSizePixelUnit = (LOWORD(wParam) == IDC_RADIO_PIXEL_UNIT);
|
|
|
|
|
|
|
|
/* The call is valid only for TrueType fonts */
|
|
|
|
if (CurrentFontType != TRUETYPE_FONTTYPE)
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* Change the property sheet state only if the font has really changed */
|
|
|
|
if (FontSizeChange(hDlg, SizeList, ConInfo))
|
|
|
|
PropSheet_Changed(GetParent(hDlg), hDlg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2014-08-11 13:35:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2008-05-04 09:04:14 +00:00
|
|
|
|
[CONSOLE.DLL-KERNEL32-CONSRV]
Fix the console properties dialog, when launching and transmitting console properties. Before, the properties dialog was directly launched by the console server (consrv), running with CSRSS (System) privileges, what constituted a security hole. Now, I create a remote thread in the running process owning the console for launching the properties dialog (thus it has only user privileges, and not System ones anymore). For that purpose, I basically took the technique described in the following paper (Cesar Cerrudo, "Story of a dumb patch", http://www.argeniss.com/research/MSBugPaper.pdf or http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf), where basically the console server shares the console properties via a shared memory section with the console properties dialog dll. The address of the thread which launches the dialog in the context of the console app is given to the console server the same way as we do for the control handler (called e.g. when you press Ctrl-C, etc...)
Of course this is quite hackish, because you have the GUI interface split between the console server and the console properties dialog dll. Something far more elegant would be to put all the GUI thingie into a dedicated dll or exe, running with the same privileges as the console program itself (a kind of console -- or terminal -- emulator).
[CONSOLE.DLL]
Fix retriving / setting colors.c and other things.
[CONSRV.DLL]
- Fix retrieving / setting console properties from the registry (via the HKCU\Console\* keys), via the shell shortcuts (not totally done at the moment, because somebody has to implement properly that thing : http://msdn.microsoft.com/en-us/library/windows/desktop/bb773359(v=vs.85).aspx (NT_CONSOLE_PROPS structure stored as a shortcut data block) (at application launching time), and via the console properties dialog.
- Few DPRINTs removed.
svn path=/branches/ros-csrss/; revision=58415
2013-03-03 15:35:12 +00:00
|
|
|
return FALSE;
|
2008-05-04 09:04:14 +00:00
|
|
|
}
|