|
|
/****************************************************************************\
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; }
|