X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/17a1ebd101f0653e69736416a2a28d0ada423141..22fec94aa95d2e1340dfa4bc7f00cea79b868977:/src/unix/fontenum.cpp diff --git a/src/unix/fontenum.cpp b/src/unix/fontenum.cpp index cf11e65ba8..25ab081632 100644 --- a/src/unix/fontenum.cpp +++ b/src/unix/fontenum.cpp @@ -20,13 +20,17 @@ // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/dynarray.h" -#include "wx/string.h" +#include "wx/fontenum.h" + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/app.h" + #include "wx/utils.h" +#endif + #include "wx/regex.h" -#include "wx/utils.h" -#include "wx/app.h" #include "wx/fontmap.h" -#include "wx/fontenum.h" #include "wx/fontutil.h" #include "wx/encinfo.h" @@ -41,7 +45,7 @@ #ifdef __WXGTK20__ #include "gtk/gtk.h" extern GtkWidget *wxGetRootWindow(); -#endif +#endif // __WXGTK20__ extern "C" int wxCMPFUNC_CONV wxCompareFamilies (const void *a, const void *b) @@ -52,25 +56,31 @@ wxCompareFamilies (const void *a, const void *b) return g_utf8_collate (a_name, b_name); } -// I admit I don't yet understand encodings with Pango bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool fixedWidthOnly) { + if ( encoding != wxFONTENCODING_SYSTEM && encoding != wxFONTENCODING_UTF8 ) + { + // Pango supports only UTF-8 encoding (and system means any, so we + // accept it too) + return false; + } + #if defined(__WXGTK20__) || !defined(HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE) if ( fixedWidthOnly #if defined(__WXGTK24__) && (gtk_check_version(2,4,0) != NULL) #endif ) -{ + { OnFacename( wxT("monospace") ); } - else -#endif + else // !fixedWidthOnly +#endif // __WXGTK20__ || !HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE { PangoFontFamily **families = NULL; gint n_families = 0; - pango_context_list_families ( + pango_context_list_families ( #ifdef __WXGTK20__ gtk_widget_get_pango_context( wxGetRootWindow() ), #else @@ -97,17 +107,40 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, g_free(families); } - return TRUE; + return true; } -bool wxFontEnumerator::EnumerateEncodings(const wxString& family) +bool wxFontEnumerator::EnumerateEncodings(const wxString& facename) { - return FALSE; + // name of UTF-8 encoding: no need to use wxFontMapper for it as it's + // unlikely to change + const wxString utf8(_T("UTF-8")); + + + // all fonts are in UTF-8 only when using Pango + if ( !facename.empty() ) + { + OnFontEncoding(facename, utf8); + return true; + } + + // so enumerating all facenames supporting this encoding is the same as + // enumerating all facenames + const wxArrayString facenames(GetFacenames(wxFONTENCODING_UTF8)); + const size_t count = facenames.size(); + if ( !count ) + return false; + + for ( size_t n = 0; n < count; n++ ) + { + OnFontEncoding(facenames[n], utf8); + } + + return true; } -#else - // Pango +#else // !wxUSE_PANGO #ifdef __VMS__ // Xlib.h for VMS is not (yet) compatible with C++ // The resulting warnings are switched off here @@ -194,6 +227,7 @@ static bool ProcessFamiliesFromFontList(wxFontEnumerator *This, continue; } + // coverity[returned_null] char *dash = strchr(font + 1, '-'); char *family = dash + 1; dash = strchr(family, '-'); @@ -205,7 +239,7 @@ static bool ProcessFamiliesFromFontList(wxFontEnumerator *This, if ( !This->OnFacename(fam) ) { // stop enumerating - return FALSE; + return false; } families.Add(fam); @@ -213,7 +247,7 @@ static bool ProcessFamiliesFromFontList(wxFontEnumerator *This, //else: already seen } - return TRUE; + return true; } #endif // wxUSE_NANOX @@ -226,14 +260,14 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool fixedWidthOnly) { #if wxUSE_NANOX - return FALSE; + return false; #else int nFonts; char **fonts; if ( fixedWidthOnly ) { - bool cont = TRUE; + bool cont = true; fonts = CreateFontList(wxT('m'), encoding, &nFonts); if ( fonts ) { @@ -244,13 +278,13 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, if ( !cont ) { - return TRUE; + return true; } fonts = CreateFontList(wxT('c'), encoding, &nFonts); if ( !fonts ) { - return TRUE; + return true; } } else @@ -264,14 +298,14 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, wxASSERT_MSG(encoding != wxFONTENCODING_SYSTEM, wxT("No fonts at all on this system?")); - return FALSE; + return false; } } (void)ProcessFamiliesFromFontList(this, fonts, nFonts); XFreeFontNames(fonts); - return TRUE; + return true; #endif // wxUSE_NANOX } @@ -279,11 +313,11 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool wxFontEnumerator::EnumerateEncodings(const wxString& family) { #if wxUSE_NANOX - return FALSE; + return false; #else wxString pattern; pattern.Printf(wxT("-*-%s-*-*-*-*-*-*-*-*-*-*-*-*"), - family.IsEmpty() ? wxT("*") : family.c_str()); + family.empty() ? wxT("*") : family.c_str()); // get the list of all fonts int nFonts; @@ -293,7 +327,7 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) if ( !fonts ) { // unknown family? - return FALSE; + return false; } // extract the list of (unique) encodings @@ -313,7 +347,7 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) dash = strchr(familyFont, '-'); *dash = '\0'; // !NULL because Matches() above succeeded - if ( !family.IsEmpty() && (family != familyFont) ) + if ( !family.empty() && (family != familyFont) ) { // family doesn't match continue; @@ -344,10 +378,9 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) XFreeFontNames(fonts); - return TRUE; + return true; #endif // wxUSE_NANOX } -#endif - // __WXGTK20__ +#endif // !wxUSE_PANGO