You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
9.2 KiB
279 lines
9.2 KiB
|
|
/****************************************************************************\
|
|
|
|
FONT.C / Factory / WinBOM (FACTORY.EXE)
|
|
|
|
Microsoft Confidential
|
|
Copyright (c) Microsoft Corporation 2001
|
|
All rights reserved
|
|
|
|
State code for customizing the font smoothing and cleartype settings.
|
|
|
|
WINBOM.INI
|
|
[ComputerSettings]
|
|
FontSmoothing = ; Default is 'Standard'.
|
|
|
|
Standard | ; Will determine, based on the system speed, if font
|
|
; smoothing is turned on or not.
|
|
|
|
On | ; Forces font smoothing on. Should only be used if the
|
|
; performance of the video card is known to give an
|
|
; acceptable user experience with this option enabled.
|
|
|
|
Off | ; Forces font smoothing off.
|
|
|
|
ClearType ; Turns clear type and font smoothing on. Should only be
|
|
; used if the monitor is known to be an LCD screen and
|
|
; that the system performance is known to be acceptable
|
|
; with this option enabled.
|
|
|
|
04/2001 - Jason Cohen (JCOHEN)
|
|
Added source file for the state that customizes the font and
|
|
cleartype settings.
|
|
|
|
\****************************************************************************/
|
|
|
|
|
|
//
|
|
// Includes
|
|
//
|
|
|
|
#include "factoryp.h"
|
|
|
|
|
|
//
|
|
// Internal Defined Value(s):
|
|
//
|
|
|
|
#define REG_KEY_FONTSMOOTHING _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VisualEffects\\FontSmoothing")
|
|
#define REG_VAL_DEFAULTBYFONTTEST _T("DefaultByFontTest")
|
|
#define REG_VAL_DEFAULTVALUE _T("DefaultValue")
|
|
|
|
#define REG_KEY_CLEARTYPE _T("Control Panel\\Desktop")
|
|
#define REG_VAL_FONTSMOOTHING _T("FontSmoothing")
|
|
#define REG_VAL_FONTSMOOTHINGTYPE _T("FontSmoothingType")
|
|
|
|
#define REG_KEY_HORRID_CLASSES _T("_Classes")
|
|
#define REG_KEY_HORRID_CLASSES_LEN ( AS(REG_KEY_HORRID_CLASSES) - 1 )
|
|
|
|
|
|
//
|
|
// Internal Function Prototype(s):
|
|
//
|
|
|
|
static BOOL RegSetAllUsers(LPTSTR lpszSubKey, LPTSTR lpszValue, LPBYTE lpData, DWORD dwType);
|
|
|
|
|
|
//
|
|
// Exported Function(s):
|
|
//
|
|
|
|
BOOL SetFontOptions(LPSTATEDATA lpStateData)
|
|
{
|
|
LPTSTR lpszWinBOMPath = lpStateData->lpszWinBOMPath;
|
|
TCHAR szFontSmoothing[256] = NULLSTR,
|
|
szFontSmoothingData[] = _T("_");
|
|
DWORD dwDefaultByFontTest,
|
|
dwDefaultValue,
|
|
dwFontSmoothingType;
|
|
BOOL bRet = TRUE;
|
|
|
|
// Get the option from the winbom.
|
|
//
|
|
GetPrivateProfileString(INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_FONTSMOOTHING, NULLSTR, szFontSmoothing, AS(szFontSmoothing), lpszWinBOMPath);
|
|
|
|
// Figure out what values to write based on the value in the winbom.
|
|
//
|
|
if ( NULLCHR == szFontSmoothing[0] )
|
|
{
|
|
// No key, do nothing and do not touch whatever options already set.
|
|
//
|
|
return TRUE;
|
|
}
|
|
else if ( LSTRCMPI(szFontSmoothing, INI_VAL_WBOM_FONTSMOOTHING_ON) == 0 )
|
|
{
|
|
// Force font smoothing on.
|
|
//
|
|
dwDefaultByFontTest = 0;
|
|
dwDefaultValue = 1;
|
|
dwFontSmoothingType = 1;
|
|
szFontSmoothingData[0] = _T('2');
|
|
}
|
|
else if ( LSTRCMPI(szFontSmoothing, INI_VAL_WBOM_FONTSMOOTHING_OFF) == 0 )
|
|
{
|
|
// Force font smoothing off.
|
|
//
|
|
dwDefaultByFontTest = 0;
|
|
dwDefaultValue = 0;
|
|
dwFontSmoothingType = 0;
|
|
szFontSmoothingData[0] = _T('0');
|
|
}
|
|
else if ( LSTRCMPI(szFontSmoothing, INI_VAL_WBOM_FONTSMOOTHING_CLEARTYPE) == 0 )
|
|
{
|
|
// Force font smoothing and cleartype on.
|
|
//
|
|
dwDefaultByFontTest = 0;
|
|
dwDefaultValue = 1;
|
|
dwFontSmoothingType = 2;
|
|
szFontSmoothingData[0] = _T('2');
|
|
}
|
|
else if ( LSTRCMPI(szFontSmoothing, INI_VAL_WBOM_FONTSMOOTHING_DEFAULT) == 0 )
|
|
{
|
|
// Let system decide if font smoothing should be on or not.
|
|
//
|
|
dwDefaultByFontTest = 1;
|
|
dwDefaultValue = 0;
|
|
dwFontSmoothingType = 0;
|
|
szFontSmoothingData[0] = _T('0');
|
|
}
|
|
else
|
|
{
|
|
FacLogFile(0 | LOG_ERR, IDS_ERR_WINBOMVALUE, lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_FONTSMOOTHING, szFontSmoothing);
|
|
bRet = FALSE;
|
|
}
|
|
|
|
// Now save the settings if valid option passed in.
|
|
//
|
|
if ( bRet )
|
|
{
|
|
if ( !RegSetDword(HKLM, REG_KEY_FONTSMOOTHING, REG_VAL_DEFAULTBYFONTTEST, dwDefaultByFontTest) )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
if ( !RegSetDword(HKLM, REG_KEY_FONTSMOOTHING, REG_VAL_DEFAULTVALUE, dwDefaultValue) )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
if ( !RegSetAllUsers(REG_KEY_CLEARTYPE, REG_VAL_FONTSMOOTHINGTYPE, (LPBYTE) &dwFontSmoothingType, REG_DWORD) )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
if ( !RegSetAllUsers(REG_KEY_CLEARTYPE, REG_VAL_FONTSMOOTHING, (LPBYTE) szFontSmoothingData, REG_SZ) )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
//
|
|
// ISSUE-2002/02/25-acosma,robertko - this is a duplicate of the REG_VAL_FONTSMOOTHINGTYPE set above - should be removed.
|
|
//
|
|
if ( !RegSetAllUsers(REG_KEY_CLEARTYPE, REG_VAL_FONTSMOOTHINGTYPE, (LPBYTE) &dwFontSmoothingType, REG_DWORD) )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL DisplaySetFontOptions(LPSTATEDATA lpStateData)
|
|
{
|
|
return IniSettingExists(lpStateData->lpszWinBOMPath, INI_SEC_WBOM_SETTINGS, INI_KEY_WBOM_FONTSMOOTHING, NULL);
|
|
}
|
|
|
|
|
|
//
|
|
// Internal Function(s):
|
|
//
|
|
|
|
static BOOL RegSetAllUsers(LPTSTR lpszSubKey, LPTSTR lpszValue, LPBYTE lpData, DWORD dwType)
|
|
{
|
|
BOOL bRet = TRUE,
|
|
bErr;
|
|
LPTSTR lpszKeyName;
|
|
HKEY hkeyEnum,
|
|
hkeySub;
|
|
DWORD dwIndex = 0,
|
|
dwSize,
|
|
dwDis,
|
|
dwMaxSize;
|
|
int iLen;
|
|
|
|
// Figure out the max length of any sub key and allocate a buffer for it.
|
|
//
|
|
if ( ( ERROR_SUCCESS == RegQueryInfoKey(HKEY_USERS,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&dwMaxSize,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL) ) &&
|
|
|
|
( lpszKeyName = (LPTSTR) MALLOC((++dwMaxSize) * sizeof(TCHAR)) ) )
|
|
{
|
|
// Now enumerate all the sub keys.
|
|
//
|
|
dwSize = dwMaxSize;
|
|
while ( ERROR_SUCCESS == RegEnumKeyEx(HKEY_USERS,
|
|
dwIndex++,
|
|
lpszKeyName,
|
|
&dwSize,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL) )
|
|
{
|
|
// Iterate over all users ignoring the keys with the "_Classes" suffix
|
|
//
|
|
if ( ( dwSize < REG_KEY_HORRID_CLASSES_LEN ) ||
|
|
( 0 != LSTRCMPI(lpszKeyName + (dwSize - REG_KEY_HORRID_CLASSES_LEN), REG_KEY_HORRID_CLASSES) ) )
|
|
{
|
|
// Open up the sub key.
|
|
//
|
|
if ( ERROR_SUCCESS == RegOpenKeyEx(HKEY_USERS,
|
|
lpszKeyName,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hkeyEnum) )
|
|
{
|
|
// Set the value that was passed in.
|
|
//
|
|
switch ( dwType )
|
|
{
|
|
case REG_DWORD:
|
|
bErr = !RegSetDword(hkeyEnum, lpszSubKey, lpszValue, *((LPDWORD) lpData));
|
|
break;
|
|
|
|
case REG_SZ:
|
|
bErr = !RegSetString(hkeyEnum, lpszSubKey, lpszValue, (LPTSTR) lpData);
|
|
break;
|
|
|
|
default:
|
|
bErr = TRUE;
|
|
break;
|
|
}
|
|
|
|
// If anything fails, we keep going but return an error.
|
|
//
|
|
if ( bErr )
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
|
|
// Close the sub key that we enumerated.
|
|
//
|
|
RegCloseKey(hkeyEnum);
|
|
}
|
|
}
|
|
|
|
// Reset the size for the next call to RegEnumKeyEx().
|
|
//
|
|
dwSize = dwMaxSize;
|
|
}
|
|
|
|
// Free the buffer we allocated.
|
|
//
|
|
FREE(lpszKeyName);
|
|
}
|
|
else
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
|
|
// Return TRUE if everything worked okay.
|
|
//
|
|
return bRet;
|
|
}
|