Only show the system default font on platforms where applicable, b=206782, r=jshin, sr=blizzard

This commit is contained in:
rbs%maths.uq.edu.au 2003-05-29 03:57:30 +00:00
Родитель 0d74636d72
Коммит 1de2cd1928
11 изменённых файлов: 257 добавлений и 47 удалений

Просмотреть файл

@ -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%)