X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7ae4a62645d369fbd6b8b5f3f0e12ee86536da1..9154a136d5e1d79a4be2cf012e4a815fdc6df3ff:/src/dfb/fontmgr.cpp diff --git a/src/dfb/fontmgr.cpp b/src/dfb/fontmgr.cpp index 53849e210d..8d94c2300e 100644 --- a/src/dfb/fontmgr.cpp +++ b/src/dfb/fontmgr.cpp @@ -16,8 +16,15 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/log.h" +#endif + #include "wx/fileconf.h" #include "wx/filename.h" +#include "wx/tokenzr.h" +#include "wx/dir.h" #include "wx/private/fontmgr.h" #include "wx/dfb/wrapdfb.h" @@ -91,13 +98,16 @@ wxFontBundle::wxFontBundle(const wxString& name, // ---------------------------------------------------------------------------- /* - The code below parses font configuration file ${WXDFB_FONTDIR}/FontsIndex. - By default, the directory is $prefix/share/wx/fonts, but can be ovewritten - by setting WXDFB_FONTDIR environment variable. + The code below looks up and parses font configuration files FontsIndex. + The files are looked up in directories specified in the WXDFB_FONTPATH + environment variable (separated with :, similarly to the PATH variable). + If the variable is not set, $prefix/share/wx/fonts directory is used. + All subdirectories of directories on the path are scanned for FontsIndex + files. - The file is standard wxFileConfig file text file. Each toplevel group - specifies one font bundle, font's name is the name of group. Group's entries - look like this: + The FontsIndex file is standard wxFileConfig file text file. Each toplevel + group specifies one font bundle, font's name is the name of group. Group's + entries look like this: [Font Name] # font files (at least one of them must be present): @@ -125,14 +135,42 @@ wxFontBundle::wxFontBundle(const wxString& name, void wxFontsManager::AddAllFonts() { - wxString dir = _T(wxINSTALL_PREFIX "/share/wx/fonts"); - wxGetEnv(_T("WXDFB_FONTDIR"), &dir); + wxString path; + if ( !wxGetEnv(_T("WXDFB_FONTPATH"), &path) ) + path = _T(wxINSTALL_PREFIX "/share/wx/fonts"); + + wxStringTokenizer tkn(path, wxPATH_SEP); + while ( tkn.HasMoreTokens() ) + { + wxString dir = tkn.GetNextToken(); + + wxArrayString indexFiles; + if ( !wxDir::GetAllFiles(dir, &indexFiles, _T("FontsIndex")) ) + continue; + + for ( wxArrayString::const_iterator i = indexFiles.begin(); + i != indexFiles.end(); ++i ) + { + AddFontsFromDir(*i); + } + } + + if ( GetBundles().empty() ) + { + // wxDFB is unusable without fonts, so terminate the app + wxLogFatalError(_("No fonts found in %s."), path.c_str()); + } +} - wxString indexFile = dir + _T("/FontsIndex"); +void wxFontsManager::AddFontsFromDir(const wxString& indexFile) +{ + wxFileName fn(indexFile); + wxString dir = fn.GetPath(); - if ( !wxFileName::FileExists(indexFile) ) + if ( !fn.FileExists() ) { - wxLogWarning(_("No fonts found in %s"), dir.c_str()); + wxLogWarning(_("Fonts index file %s disappeared while loading fonts."), + indexFile.c_str()); return; }