From: Mart Raudsepp Date: Mon, 22 Aug 2005 23:19:57 +0000 (+0000) Subject: [wxGTK2] Do what we (I) can wrt the win32 centric wxNativeFontInfo::GetFamily X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b67d14bee00c26521752c1dbd2dd73533bd8a677 [wxGTK2] Do what we (I) can wrt the win32 centric wxNativeFontInfo::GetFamily git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35271 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index a31e07b949..54cff23c0c 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -747,8 +747,15 @@ int wxFont::GetFamily() const wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); #if wxUSE_PANGO - return M_FONTDATA->HasNativeFont() ? M_FONTDATA->m_nativeFontInfo.GetFamily() - : M_FONTDATA->m_family; + int ret = M_FONTDATA->m_family; + if (M_FONTDATA->HasNativeFont()) + // wxNativeFontInfo::GetFamily is expensive, must not call more than once + ret = M_FONTDATA->m_nativeFontInfo.GetFamily(); + + if (ret == wxFONTFAMILY_DEFAULT) + ret = M_FONTDATA->m_family; + + return ret; #else return M_FONTDATA->m_family; #endif diff --git a/src/gtk1/font.cpp b/src/gtk1/font.cpp index a31e07b949..54cff23c0c 100644 --- a/src/gtk1/font.cpp +++ b/src/gtk1/font.cpp @@ -747,8 +747,15 @@ int wxFont::GetFamily() const wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); #if wxUSE_PANGO - return M_FONTDATA->HasNativeFont() ? M_FONTDATA->m_nativeFontInfo.GetFamily() - : M_FONTDATA->m_family; + int ret = M_FONTDATA->m_family; + if (M_FONTDATA->HasNativeFont()) + // wxNativeFontInfo::GetFamily is expensive, must not call more than once + ret = M_FONTDATA->m_nativeFontInfo.GetFamily(); + + if (ret == wxFONTFAMILY_DEFAULT) + ret = M_FONTDATA->m_family; + + return ret; #else return M_FONTDATA->m_family; #endif diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index 08e33a21c1..413694227d 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -138,43 +138,62 @@ wxString wxNativeFontInfo::GetFaceName() const wxFontFamily wxNativeFontInfo::GetFamily() const { -#ifndef HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE - if (g_ascii_strcasecmp( pango_font_description_get_family( description ), "monospace" ) == 0) - return wxFONTFAMILY_TELETYPE; -#else - - PangoFontFamily **families; - PangoFontFamily *family; - int n_families; - pango_context_list_families( + wxFontFamily ret = wxFONTFAMILY_DEFAULT; + char *family_text = g_ascii_strdown( pango_font_description_get_family( description ), -1 ); + // Check for some common fonts, to salvage what we can from the current win32 centric wxFont API: + if (strncmp( family_text, "monospace", 9 ) == 0) + ret = wxFONTFAMILY_TELETYPE; // begins with "Monospace" + else if (strncmp( family_text, "courier", 7 ) == 0) + ret = wxFONTFAMILY_TELETYPE; // begins with "Courier" +#ifdef HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE + else + { + PangoFontFamily **families; + PangoFontFamily *family; + int n_families; + pango_context_list_families( #ifdef __WXGTK20__ - gtk_widget_get_pango_context( wxGetRootWindow() ), + gtk_widget_get_pango_context( wxGetRootWindow() ), #else - wxTheApp->GetPangoContext(), + wxTheApp->GetPangoContext(), #endif - &families, &n_families); + &families, &n_families); - for (int i = 0;i < n_families;++i) - { - if (g_ascii_strcasecmp(pango_font_family_get_name( families[i] ), pango_font_description_get_family( description )) == 0 ) + for (int i = 0;i < n_families;++i) { - family = families[i]; - break; + if (g_ascii_strcasecmp(pango_font_family_get_name( families[i] ), pango_font_description_get_family( description )) == 0 ) + { + family = families[i]; + break; + } } - } - g_free(families); + g_free(families); - wxASSERT_MSG( family, wxT("wxNativeFontInfo::GetFamily() - No appropriate PangoFontFamily found for ::description") ); + wxASSERT_MSG( family, wxT("wxNativeFontInfo::GetFamily() - No appropriate PangoFontFamily found for ::description") ); - //BCI: Cache the wxFontFamily inside the class. Validate cache with - //BCI: g_ascii_strcasecmp(pango_font_description_get_family(description), pango_font_family_get_name(family)) == 0 + //BCI: Cache the wxFontFamily inside the class. Validate cache with + //BCI: g_ascii_strcasecmp(pango_font_description_get_family(description), pango_font_family_get_name(family)) == 0 - if (pango_font_family_is_monospace( family )) - return wxFONTFAMILY_TELETYPE; + if (pango_font_family_is_monospace( family )) + ret = wxFONTFAMILY_TELETYPE; // is deemed a monospace font by pango + } #endif // pango_font_family_is_monospace - return wxFONTFAMILY_SWISS; + if (ret == wxFONTFAMILY_DEFAULT) + { + if (strstr( family_text, "sans" ) != NULL) // checked before serif, so that "* Sans Serif" fonts are detected correctly + ret = wxFONTFAMILY_SWISS; // contains "Sans" + else if (strstr( family_text, "serif" ) != NULL) + ret = wxFONTFAMILY_ROMAN; // contains "Serif" + else if (strncmp( family_text, "times", 5 ) == 0) + ret = wxFONTFAMILY_ROMAN; // begins with "Times" + else if (strncmp( family_text, "old", 3 ) == 0) + ret = wxFONTFAMILY_DECORATIVE; // Begins with "Old" - "Old English", "Old Town" + } + + free(family_text); + return ret; } wxFontEncoding wxNativeFontInfo::GetEncoding() const