/////////////////////////////////////////////////////////////////////////////
-// Name: unix/fontutil.cpp
+// Name: src/unix/fontutil.cpp
// Purpose: Font helper functions for X11 (GDK/X)
// Author: Vadim Zeitlin
// Modified by:
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "fontutil.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
bool wxNativeFontInfo::GetUnderlined() const
{
- return FALSE;
+ return false;
}
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;
+ // note: not passing -1 as the 2nd parameter to g_ascii_strdown to work
+ // around a bug in the 64-bit glib shipped with solaris 10, -1 causes it
+ // to try to allocate 2^32 bytes.
+ const char *family_name = pango_font_description_get_family( description );
+ char *family_text = g_ascii_strdown( family_name, family_name ? strlen( family_name ) : 0 );
+ // 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"
+#if defined(__WXGTK24__) || defined(HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE)
+ else
+#ifdef __WXGTK24__
+ if (!gtk_check_version(2,4,0))
+#endif
+ {
+ PangoFontFamily **families;
+ PangoFontFamily *family = NULL;
+ 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);
+
+ // Some gtk+ systems might query for a non-existing font from wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)
+ // on initialization, don't assert until wxSystemSettings::GetFont is checked for this - MR
+ // 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 (family != NULL && pango_font_family_is_monospace( family ))
+ ret = wxFONTFAMILY_TELETYPE; // is deemed a monospace font by pango
+ }
+#endif // gtk24 || HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE
- if (pango_font_family_is_monospace( family ))
- return wxFONTFAMILY_TELETYPE;
-#endif // pango_font_family_is_monospace
+ 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"
+ }
- return wxFONTFAMILY_SWISS;
+ free(family_text);
+ return ret;
}
wxFontEncoding wxNativeFontInfo::GetEncoding() const
}
-void wxNativeFontInfo::SetPointSize(int WXUNUSED(pointsize))
+void wxNativeFontInfo::SetPointSize(int pointsize)
{
- wxFAIL_MSG( _T("not implemented") );
+ pango_font_description_set_size( description, pointsize * PANGO_SCALE );
}
-void wxNativeFontInfo::SetStyle(wxFontStyle WXUNUSED(style))
+void wxNativeFontInfo::SetStyle(wxFontStyle style)
{
- wxFAIL_MSG( _T("not implemented") );
+ switch (style)
+ {
+ case wxFONTSTYLE_ITALIC:
+ pango_font_description_set_style( description, PANGO_STYLE_ITALIC );
+ break;
+ case wxFONTSTYLE_SLANT:
+ pango_font_description_set_style( description, PANGO_STYLE_OBLIQUE );
+ break;
+ default:
+ wxFAIL_MSG( _T("unknown font style") );
+ // fall through
+ case wxFONTSTYLE_NORMAL:
+ pango_font_description_set_style( description, PANGO_STYLE_NORMAL );
+ break;
+ }
}
-void wxNativeFontInfo::SetWeight(wxFontWeight WXUNUSED(weight))
+void wxNativeFontInfo::SetWeight(wxFontWeight weight)
{
- wxFAIL_MSG( _T("not implemented") );
+ switch (weight)
+ {
+ case wxFONTWEIGHT_BOLD:
+ pango_font_description_set_weight(description, PANGO_WEIGHT_BOLD);
+ break;
+ case wxFONTWEIGHT_LIGHT:
+ pango_font_description_set_weight(description, PANGO_WEIGHT_LIGHT);
+ break;
+ default:
+ wxFAIL_MSG( _T("unknown font weight") );
+ // fall through
+ case wxFONTWEIGHT_NORMAL:
+ pango_font_description_set_weight(description, PANGO_WEIGHT_NORMAL);
+ }
}
void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
wxFAIL_MSG( _T("not implemented") );
}
-void wxNativeFontInfo::SetFaceName(wxString WXUNUSED(facename))
+void wxNativeFontInfo::SetFaceName(const wxString& facename)
{
- wxFAIL_MSG( _T("not implemented") );
+ pango_font_description_set_family( description, wxGTK_CONV(facename) );
}
void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family))
description = pango_font_description_from_string( wxGTK_CONV( s ) );
- return TRUE;
+ return true;
}
wxString wxNativeFontInfo::ToString() const
// wxNativeEncodingInfo
// ----------------------------------------------------------------------------
-bool wxNativeEncodingInfo::FromString(const wxString& s)
+bool wxNativeEncodingInfo::FromString(const wxString& WXUNUSED(s))
{
- return FALSE;
+ return false;
}
wxString wxNativeEncodingInfo::ToString() const
return wxEmptyString;
}
-bool wxTestFontEncoding(const wxNativeEncodingInfo& info)
+bool wxTestFontEncoding(const wxNativeEncodingInfo& WXUNUSED(info))
{
- return TRUE;
+ return true;
}
bool wxGetNativeFontEncoding(wxFontEncoding encoding,
wxNativeEncodingInfo *info)
{
- // we *must* return true for default encoding as otherwise wxFontMapper
- // considers that we can't load any font and aborts with wxLogFatalError!
- if ( encoding == wxFONTENCODING_SYSTEM )
+ info->facename.clear();
+
+ switch ( encoding )
{
- info->facename.clear();
- info->encoding = wxFONTENCODING_SYSTEM;
- }
+ // we *must* return true for default encodings as otherwise wxFontMapper
+ // considers that we can't load any font and aborts with wxLogFatalError!
+ case wxFONTENCODING_DEFAULT:
+ case wxFONTENCODING_SYSTEM:
+ info->encoding = wxFONTENCODING_SYSTEM;
+ return true;
- // pretend that we support everything, it's better than to always return
- // false as the old code did
- return true;
+ case wxFONTENCODING_UTF8:
+ info->encoding = wxFONTENCODING_UTF8;
+ return true;
+
+ default:
+ // everything else must be converted to UTF-8
+ return false;
+ }
}
#else // GTK+ 1.x
wxString encid = tokenizer.GetNextToken();
long enc;
if ( !encid.ToLong(&enc) )
- return FALSE;
+ return false;
encoding = (wxFontEncoding)enc;
xregistry = tokenizer.GetNextToken();
if ( !xregistry )
- return FALSE;
+ return false;
xencoding = tokenizer.GetNextToken();
if ( !xencoding )
- return FALSE;
+ return false;
// ok even if empty
facename = tokenizer.GetNextToken();
- return TRUE;
+ return true;
}
wxString wxNativeEncodingInfo::ToString() const
{
wxString s;
s << (long)encoding << _T(';') << xregistry << _T(';') << xencoding;
- if ( !!facename )
+ if ( !facename.empty() )
{
s << _T(';') << facename;
}
void wxNativeFontInfo::Init()
{
- m_isDefault = TRUE;
+ m_isDefault = true;
}
bool wxNativeFontInfo::FromString(const wxString& s)
// check the version
wxString token = tokenizer.GetNextToken();
if ( token != _T('0') )
- return FALSE;
+ return false;
xFontName = tokenizer.GetNextToken();
// this should be the end
if ( tokenizer.HasMoreTokens() )
- return FALSE;
+ return false;
return FromXFontName(xFontName);
}
wxString wxNativeFontInfo::GetXFontComponent(wxXLFDField field) const
{
- wxCHECK_MSG( field < wxXLFD_MAX, _T(""), _T("invalid XLFD field") );
+ wxCHECK_MSG( field < wxXLFD_MAX, wxEmptyString, _T("invalid XLFD field") );
if ( !HasElements() )
{
// const_cast
if ( !((wxNativeFontInfo *)this)->FromXFontName(xFontName) )
- return _T("");
+ return wxEmptyString;
}
return fontElements[field];
// skip the leading, usually empty field (font name registry)
if ( !tokenizer.HasMoreTokens() )
- return FALSE;
+ return false;
(void)tokenizer.GetNextToken();
if ( !tokenizer.HasMoreTokens() )
{
// not enough elements in the XLFD - or maybe an alias
- return FALSE;
+ return false;
}
wxString field = tokenizer.GetNextToken();
if ( !field.empty() && field != _T('*') )
{
// we're really initialized now
- m_isDefault = FALSE;
+ m_isDefault = false;
}
fontElements[n] = field;
// this should be all
if ( tokenizer.HasMoreTokens() )
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
wxString wxNativeFontInfo::GetXFontName() const
xFontName = xFontName_;
- m_isDefault = FALSE;
+ m_isDefault = false;
}
int wxNativeFontInfo::GetPointSize() const
bool wxNativeFontInfo::GetUnderlined() const
{
// X fonts are never underlined
- return FALSE;
+ return false;
}
wxString wxNativeFontInfo::GetFaceName() const
// can't do this under X
}
-void wxNativeFontInfo::SetFaceName(wxString facename)
+void wxNativeFontInfo::SetFaceName(const wxString& facename)
{
SetXFontComponent(wxXLFD_FAMILY, facename);
}
-void wxNativeFontInfo::SetFamily(wxFontFamily family)
+void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family))
{
// wxFontFamily -> X foundry, anyone?
wxFAIL_MSG( _T("not implemented") );
bool wxGetNativeFontEncoding(wxFontEncoding encoding,
wxNativeEncodingInfo *info)
{
- wxCHECK_MSG( info, FALSE, _T("bad pointer in wxGetNativeFontEncoding") );
+ wxCHECK_MSG( info, false, _T("bad pointer in wxGetNativeFontEncoding") );
if ( encoding == wxFONTENCODING_DEFAULT )
{
default:
// don't know how to translate this encoding into X fontspec
- return FALSE;
+ return false;
}
info->encoding = encoding;
- return TRUE;
+ return true;
}
bool wxTestFontEncoding(const wxNativeEncodingInfo& info)
wxNativeFont font = 0;
// if we already have the X font name, try to use it
- if( xFontName && !xFontName->IsEmpty() )
+ if( xFontName && !xFontName->empty() )
{
//
// Make sure point size is correct for scale factor.
if ( !font )
{
font = wxLoadQueryFont(-1, wxDEFAULT, wxNORMAL, wxNORMAL,
- FALSE, wxEmptyString,
+ false, wxEmptyString,
info.xregistry, info.xencoding,
xFontName);
font = wxLoadQueryFont(-1,
wxDEFAULT, wxNORMAL, wxNORMAL,
- FALSE, wxEmptyString,
+ false, wxEmptyString,
_T("*"), _T("*"),
xFontName);
}
// private functions
// ----------------------------------------------------------------------------
-// returns TRUE if there are any fonts matching this font spec
+// returns true if there are any fonts matching this font spec
static bool wxTestFontSpec(const wxString& fontspec)
{
// some X servers will fail to load this font because there are too many
// matches so we must test explicitly for this
if ( fontspec == _T("-*-*-*-*-*-*-*-*-*-*-*-*-*-*") )
{
- return TRUE;
+ return true;
}
wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec );
if (test)
{
- return TRUE;
+ return true;
}
test = wxLoadFont(fontspec);
{
wxFreeFont(test);
- return TRUE;
+ return true;
}
else
{
- return FALSE;
+ return false;
}
}
#else
wxString fontSpec;
- if (!facename.IsEmpty())
+ if (!facename.empty())
{
fontSpec.Printf(wxT("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"),
facename.c_str());
{
g_fontHash = new wxHashTable( wxKEY_STRING );
- return TRUE;
+ return true;
}
void wxFontModule::OnExit()
}
#endif // GTK 2.0/1.x
-