зеркало из https://github.com/mozilla/pjs.git
Only show the system default font on platforms where applicable, b=206782, r=jshin, sr=blizzard
This commit is contained in:
Родитель
0d74636d72
Коммит
1de2cd1928
|
@ -47,13 +47,21 @@ interface nsIFontEnumerator : nsISupports
|
|||
*/
|
||||
void EnumerateFonts(in string aLangGroup, in string aGeneric,
|
||||
out PRUint32 aCount, [retval, array, size_is(aCount)] out wstring aResult);
|
||||
/*
|
||||
|
||||
/**
|
||||
@param aLangGroup language group
|
||||
@return bool do we have a font for this language group
|
||||
*/
|
||||
void HaveFontFor(in string aLangGroup, [retval] out boolean aResult);
|
||||
|
||||
/*
|
||||
/**
|
||||
* @param aLangGroup language group
|
||||
* @param aGeneric CSS generic font
|
||||
* @return suggested default font for this language group and generic family
|
||||
*/
|
||||
wstring getDefaultFont(in string aLangGroup, in string aGeneric);
|
||||
|
||||
/**
|
||||
* update the global font list
|
||||
* return true if font list is changed
|
||||
*/
|
||||
|
|
|
@ -668,12 +668,17 @@ nsFontEnumeratorBeOS::EnumerateFonts(const char* aLangGroup,
|
|||
*aResult = nsnull;
|
||||
NS_ENSURE_ARG_POINTER(aCount);
|
||||
*aCount = 0;
|
||||
NS_ENSURE_ARG_POINTER(aGeneric);
|
||||
NS_ENSURE_ARG_POINTER(aLangGroup);
|
||||
// Dunno why this assignment is needed - sergei_d@fi.tartu.ee
|
||||
nsCOMPtr<nsIAtom> langGroup = getter_AddRefs(NS_NewAtom(aLangGroup));
|
||||
|
||||
return EnumFonts(aLangGroup, aGeneric, aCount, aResult);
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
const char* langGroup = nsnull;
|
||||
if (aLangGroup && *aLangGroup)
|
||||
langGroup = aLangGroup;
|
||||
const char* generic = nsnull;
|
||||
if (aGeneric && *aGeneric)
|
||||
generic = aGeneric;
|
||||
|
||||
return EnumFonts(langGroup, generic, aCount, aResult);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -686,6 +691,19 @@ nsFontEnumeratorBeOS::HaveFontFor(const char* aLangGroup, PRBool* aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorBeOS::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorBeOS::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -6436,13 +6436,18 @@ nsFontEnumeratorGTK::EnumerateFonts(const char* aLangGroup,
|
|||
*aResult = nsnull;
|
||||
NS_ENSURE_ARG_POINTER(aCount);
|
||||
*aCount = 0;
|
||||
NS_ENSURE_ARG_POINTER(aGeneric);
|
||||
NS_ENSURE_ARG_POINTER(aLangGroup);
|
||||
|
||||
nsCOMPtr<nsIAtom> langGroup = getter_AddRefs(NS_NewAtom(aLangGroup));
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
nsCOMPtr<nsIAtom> langGroup;
|
||||
if (aLangGroup && *aLangGroup)
|
||||
langGroup = do_GetAtom(aLangGroup);
|
||||
const char* generic = nsnull;
|
||||
if (aGeneric && *aGeneric)
|
||||
generic = aGeneric;
|
||||
|
||||
// XXX still need to implement aLangGroup and aGeneric
|
||||
return EnumFonts(langGroup, aGeneric, aCount, aResult);
|
||||
return EnumFonts(langGroup, generic, aCount, aResult);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -6457,6 +6462,19 @@ nsFontEnumeratorGTK::HaveFontFor(const char* aLangGroup, PRBool* aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorGTK::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorGTK::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -1466,12 +1466,17 @@ nsFontEnumeratorXft::EnumerateFonts(const char *aLangGroup,
|
|||
*aResult = nsnull;
|
||||
NS_ENSURE_ARG_POINTER(aCount);
|
||||
*aCount = 0;
|
||||
NS_ENSURE_ARG_POINTER(aGeneric);
|
||||
NS_ENSURE_ARG_POINTER(aLangGroup);
|
||||
|
||||
nsCOMPtr<nsIAtom> langGroup = do_GetAtom(aLangGroup);
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
nsCOMPtr<nsIAtom> langGroup;
|
||||
if (aLangGroup && *aLangGroup)
|
||||
langGroup = do_GetAtom(aLangGroup);
|
||||
const char* generic = nsnull;
|
||||
if (aGeneric && *aGeneric)
|
||||
generic = aGeneric;
|
||||
|
||||
return EnumFontsXft(langGroup, aGeneric, aCount, aResult);
|
||||
return EnumFontsXft(langGroup, generic, aCount, aResult);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -1486,6 +1491,62 @@ nsFontEnumeratorXft::HaveFontFor(const char *aLangGroup, PRBool *aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorXft::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
#if 0
|
||||
//XXX Some voodoo inspired from the thread:
|
||||
//XXX http://www.mail-archive.com/fonts@xfree86.org/msg01344.html
|
||||
//XXX please iterate to turn this on when you are happy/ready
|
||||
|
||||
FcResult res;
|
||||
FcPattern* match_pattern = NULL;
|
||||
if (aGeneric && *aGeneric)
|
||||
match_pattern = FcNameParse(aGeneric);
|
||||
else
|
||||
match_pattern = FcPatternCreate();
|
||||
|
||||
if (!match_pattern)
|
||||
return NS_OK; // not fatal, just return an empty default name
|
||||
|
||||
if (aLangGroup && *aLangGroup) {
|
||||
nsCOMPtr<nsIAtom> langGroup = do_GetAtom(aLangGroup);
|
||||
AddLangGroup(match_pattern, langGroup);
|
||||
}
|
||||
|
||||
FcConfigSubstitute(0, match_pattern, FcMatchPattern);
|
||||
FcDefaultSubstitute(match_pattern);
|
||||
FcPattern* result_pattern = FcFontMatch(0, match_pattern, &res);
|
||||
if (result_pattern) {
|
||||
char *family;
|
||||
FcPatternGetString(result_pattern, FC_FAMILY, 0, (FcChar8 **)&family);
|
||||
PRUnichar* name = NS_STATIC_CAST(PRUnichar *,
|
||||
nsMemory::Alloc ((strlen (family) + 1)
|
||||
* sizeof (PRUnichar)));
|
||||
if (name) {
|
||||
PRUnichar *r = name;
|
||||
for (char *f = family; *f; ++f)
|
||||
*r++ = *f;
|
||||
*r = '\0';
|
||||
|
||||
*aResult = name;
|
||||
}
|
||||
|
||||
FcPatternDestroy(result_pattern);
|
||||
}
|
||||
FcPatternDestroy(match_pattern);
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorXft::UpdateFontList(PRBool *_retval)
|
||||
{
|
||||
|
|
|
@ -1262,6 +1262,19 @@ nsFontEnumeratorMac::HaveFontFor(const char* aLangGroup,PRBool* aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorMac::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorMac::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -2092,6 +2092,19 @@ nsFontEnumeratorOS2::HaveFontFor(const char* aLangGroup, PRBool* aResult)
|
|||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorOS2::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorOS2::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -387,15 +387,21 @@ NS_IMETHODIMP nsFontEnumeratorPh::EnumerateAllFonts(PRUint32* aCount, PRUnichar*
|
|||
else return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsFontEnumeratorPh::EnumerateFonts( const char* aLangGroup, const char* aGeneric, PRUint32* aCount, PRUnichar*** aResult )
|
||||
NS_IMETHODIMP nsFontEnumeratorPh::EnumerateFonts( const char* aLangGroup, const char* aGeneric, PRUint32* aCount, PRUint32* aDefault, PRUnichar*** aResult )
|
||||
{
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
NS_ENSURE_ARG_POINTER(aCount);
|
||||
*aCount = 0;
|
||||
NS_ENSURE_ARG_POINTER(aGeneric);
|
||||
NS_ENSURE_ARG_POINTER(aLangGroup);
|
||||
NS_ENSURE_ARG_POINTER(aDefault);
|
||||
*aDefault = 0;
|
||||
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
const char* generic = nsnull;
|
||||
if (aGeneric && *aGeneric)
|
||||
generic = aGeneric;
|
||||
|
||||
int i;
|
||||
if(!gFontDetails)
|
||||
|
@ -428,7 +434,11 @@ NS_IMETHODIMP nsFontEnumeratorPh::EnumerateFonts( const char* aLangGroup, const
|
|||
int nCount = 0;
|
||||
for(i=0;i<gnFonts;i++)
|
||||
{
|
||||
if(stricmp(aGeneric, "monospace") == 0)
|
||||
if(!generic)
|
||||
{
|
||||
array[nCount++] = ToNewUnicode(*gFontNames[i]);
|
||||
}
|
||||
else if stricmp(generic, "monospace") == 0)
|
||||
{
|
||||
if(gFontDetails[i].flags & PHFONT_INFO_FIXED)
|
||||
array[nCount++] = ToNewUnicode(*gFontNames[i]);
|
||||
|
@ -455,6 +465,19 @@ NS_IMETHODIMP
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorPh::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorPh::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -5440,6 +5440,19 @@ nsFontEnumeratorWin::HaveFontFor(const char* aLangGroup, PRBool* aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorWin::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorWin::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -5772,13 +5772,18 @@ nsFontEnumeratorXlib::EnumerateFonts(const char* aLangGroup,
|
|||
*aResult = nsnull;
|
||||
NS_ENSURE_ARG_POINTER(aCount);
|
||||
*aCount = 0;
|
||||
NS_ENSURE_ARG_POINTER(aGeneric);
|
||||
NS_ENSURE_ARG_POINTER(aLangGroup);
|
||||
|
||||
nsCOMPtr<nsIAtom> langGroup = getter_AddRefs(NS_NewAtom(aLangGroup));
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
nsCOMPtr<nsIAtom> langGroup;
|
||||
if (aLangGroup && *aLangGroup)
|
||||
langGroup = do_GetAtom(aLangGroup);
|
||||
const char* generic = nsnull;
|
||||
if (aGeneric && *aGeneric)
|
||||
generic = aGeneric;
|
||||
|
||||
// XXX still need to implement aLangGroup and aGeneric
|
||||
return EnumFonts(global_fmctx, langGroup, aGeneric, aCount, aResult);
|
||||
return EnumFonts(global_fmctx, langGroup, generic, aCount, aResult);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -5793,6 +5798,19 @@ nsFontEnumeratorXlib::HaveFontFor(const char* aLangGroup, PRBool* aResult)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorXlib::GetDefaultFont(const char *aLangGroup,
|
||||
const char *aGeneric, PRUnichar **aResult)
|
||||
{
|
||||
// aLangGroup=null or "" means any (i.e., don't care)
|
||||
// aGeneric=null or "" means any (i.e, don't care)
|
||||
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsFontEnumeratorXlib::UpdateFontList(PRBool *updateFontList)
|
||||
{
|
||||
|
|
|
@ -243,21 +243,45 @@ listElement.prototype =
|
|||
function ( aLanguage, aFontType )
|
||||
{
|
||||
var i;
|
||||
var defaultFont = null;
|
||||
var count = { value: 0 };
|
||||
var fonts = getFontEnumerator().EnumerateFonts( aLanguage, aFontType, count );
|
||||
var popupNode = document.createElement( "menupopup" );
|
||||
|
||||
// always put the default system font at the front of the list
|
||||
var itemNode = document.createElement( "menuitem" );
|
||||
itemNode.setAttribute( "value", "" ); // special blank value
|
||||
itemNode.setAttribute( "label", gPrefutilitiesBundle.getString("systemDefault") );
|
||||
popupNode.appendChild( itemNode );
|
||||
|
||||
var separatorNode = null;
|
||||
if (fonts.length > 0)
|
||||
{
|
||||
separatorNode = document.createElement( "menuseparator" );
|
||||
popupNode.appendChild( separatorNode );
|
||||
defaultFont = getFontEnumerator().getDefaultFont( aLanguage, aFontType );
|
||||
}
|
||||
else
|
||||
{
|
||||
// if no specific fonts, relax 'aFontType' and try to get other
|
||||
// fonts for this language so that we can group them on top
|
||||
fonts = getFontEnumerator().EnumerateFonts( aLanguage, "", count );
|
||||
if (fonts.length > 0)
|
||||
{
|
||||
defaultFont = getFontEnumerator().getDefaultFont( aLanguage, "" );
|
||||
}
|
||||
}
|
||||
|
||||
var itemNode = null;
|
||||
var separatorNode = null;
|
||||
var popupNode = document.createElement( "menupopup" );
|
||||
|
||||
if (fonts.length > 0)
|
||||
{
|
||||
// always put the default font at the front of the list
|
||||
if (defaultFont)
|
||||
{
|
||||
var label = gPrefutilitiesBundle
|
||||
.getString("labelDefaultFont")
|
||||
.replace(/%font_family%/, defaultFont);
|
||||
itemNode = document.createElement( "menuitem" );
|
||||
itemNode.setAttribute( "label", label );
|
||||
itemNode.setAttribute( "value", "" ); // special blank value
|
||||
popupNode.appendChild( itemNode );
|
||||
|
||||
separatorNode = document.createElement( "menuseparator" );
|
||||
popupNode.appendChild( separatorNode );
|
||||
}
|
||||
|
||||
for (i = 0; i < fonts.length; i++)
|
||||
{
|
||||
itemNode = document.createElement( "menuitem" );
|
||||
|
@ -278,11 +302,12 @@ listElement.prototype =
|
|||
// the popup list
|
||||
if (globalFonts.length > fonts.length)
|
||||
{
|
||||
var menuItem = separatorNode ? separatorNode.nextSibling : null;
|
||||
var menuItem = separatorNode ? separatorNode.nextSibling : popupNode.firstChild;
|
||||
var menuValue = menuItem ? menuItem.getAttribute( "value" ) : null;
|
||||
|
||||
separatorNode = document.createElement( "menuseparator" );
|
||||
popupNode.appendChild( separatorNode );
|
||||
|
||||
for (i = 0; i < globalFonts.length; i++)
|
||||
{
|
||||
if (globalFonts[i] != menuValue)
|
||||
|
@ -315,12 +340,12 @@ function lazyAppendFontNames( i )
|
|||
}
|
||||
|
||||
// now build and populate the fonts for the requested font type
|
||||
var firstItem = null;
|
||||
var defaultItem = null;
|
||||
var selectElement = new listElement( fontTypes[i] );
|
||||
selectElement.clearList();
|
||||
try
|
||||
{
|
||||
firstItem = selectElement.appendFontNames( languageList.value, fontTypes[i] );
|
||||
defaultItem = selectElement.appendFontNames( languageList.value, fontTypes[i] );
|
||||
}
|
||||
catch(e) {
|
||||
dump("pref-fonts.js: " + e + "\nFailed to build the font list for " + fontTypes[i] + "\n");
|
||||
|
@ -329,23 +354,23 @@ function lazyAppendFontNames( i )
|
|||
|
||||
// now set the selected font item for the drop down list
|
||||
|
||||
if (!firstItem)
|
||||
if (!defaultItem)
|
||||
return; // nothing to select, so no need to bother
|
||||
|
||||
// the first item returned by default is our last resort fall-back
|
||||
var selectedItem = firstItem;
|
||||
// the item returned by default is our last resort fall-back
|
||||
var selectedItem = defaultItem;
|
||||
if( languageList.value in languageData )
|
||||
{
|
||||
// data exists for this language, pre-select items based on this information
|
||||
var dataVal = languageData[languageList.value].types[fontTypes[i]];
|
||||
if (!dataVal.length) // special blank means [System Default]
|
||||
if (!dataVal.length) // special blank means the default
|
||||
{
|
||||
selectedItem = firstItem;
|
||||
selectedItem = defaultItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
var dataEls = selectElement.listElement.getElementsByAttribute( "value", dataVal );
|
||||
selectedItem = dataEls.length ? dataEls[0] : firstItem;
|
||||
selectedItem = dataEls.length ? dataEls[0] : defaultItem;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -370,10 +395,10 @@ function lazyAppendFontNames( i )
|
|||
break; // exit loop if we find one
|
||||
}
|
||||
}
|
||||
selectedItem = dataEls.length ? dataEls[0] : firstItem;
|
||||
selectedItem = dataEls.length ? dataEls[0] : defaultItem;
|
||||
}
|
||||
catch(e) {
|
||||
selectedItem = firstItem;
|
||||
selectedItem = defaultItem;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -417,7 +442,7 @@ function saveFontPrefs()
|
|||
}
|
||||
else
|
||||
{
|
||||
// A font name can't be blank. The special blank means [System Default].
|
||||
// A font name can't be blank. The special blank means the default.
|
||||
// Unset the pref entirely, letting Gfx to decide. GfxXft will use what
|
||||
// Xft says, whereas GfxWin and others will use the built-in settings
|
||||
// that are shipped for font.name and font.name-list.
|
||||
|
|
|
@ -19,4 +19,4 @@ prefSaveFailedTitle=Save Error
|
|||
|
||||
groupIsSet=-- Home Page Group is Set --
|
||||
|
||||
systemDefault=[System Default]
|
||||
labelDefaultFont=Default (%font_family%)
|
||||
|
|
Загрузка…
Ссылка в новой задаче