+ &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 )
+ {
+ family = families[i];
+ break;
+ }
+ }
+
+ 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, "No appropriate PangoFontFamily found for ::description" );
+
+ if (family != NULL && pango_font_family_is_monospace( family ))
+ ret = wxFONTFAMILY_TELETYPE; // is deemed a monospace font by pango
+ }
+#endif // GTK+ 2 || HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE
+
+ if (ret == wxFONTFAMILY_UNKNOWN)
+ {
+ if (strstr( family_text, "sans" ) != NULL || 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 || strstr( family_text, "Serif" ) != NULL)
+ ret = wxFONTFAMILY_ROMAN; // contains "Serif"
+ else if (strncasecmp( family_text, "times", 5 ) == 0)
+ ret = wxFONTFAMILY_ROMAN; // begins with "Times"
+ else if (strncasecmp( family_text, "old", 3 ) == 0)
+ ret = wxFONTFAMILY_DECORATIVE; // begins with "Old" - "Old English", "Old Town"
+ }
+
+ return ret;
+}
+
+wxFontEncoding wxNativeFontInfo::GetEncoding() const
+{
+ return wxFONTENCODING_SYSTEM;
+}
+
+void wxNativeFontInfo::SetPointSize(int pointsize)
+{
+ pango_font_description_set_size( description, pointsize * PANGO_SCALE );
+}
+
+void wxNativeFontInfo::SetStyle(wxFontStyle style)
+{
+ 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( "unknown font style" );
+ // fall through
+ case wxFONTSTYLE_NORMAL:
+ pango_font_description_set_style( description, PANGO_STYLE_NORMAL );
+ break;
+ }
+}
+
+void wxNativeFontInfo::SetWeight(wxFontWeight weight)
+{
+ 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( "unknown font weight" );
+ // fall through
+ case wxFONTWEIGHT_NORMAL:
+ pango_font_description_set_weight(description, PANGO_WEIGHT_NORMAL);
+ }
+}
+
+void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
+{
+ // wxWindowDCImpl::DoDrawText will take care of rendering font with
+ // the underline attribute!
+ wxFAIL_MSG( "not implemented" );
+}
+
+bool wxNativeFontInfo::SetFaceName(const wxString& facename)
+{
+ pango_font_description_set_family(description, wxPANGO_CONV(facename));
+
+ // we return true because Pango doesn't tell us if the call failed or not;
+ // instead on wxGTK wxFont::SetFaceName() will call wxFontBase::SetFaceName()
+ // which does the check
+ return true;
+}
+
+void wxNativeFontInfo::SetFamily(wxFontFamily family)
+{
+ wxArrayString facename;
+
+ // the list of fonts associated with a family was partially
+ // taken from http://www.codestyle.org/css/font-family
+
+ switch ( family )
+ {
+ case wxFONTFAMILY_SCRIPT:
+ // corresponds to the cursive font family in the page linked above
+ facename.Add(wxS("URW Chancery L"));
+ facename.Add(wxS("Comic Sans MS"));
+ break;
+
+ case wxFONTFAMILY_DECORATIVE:
+ // corresponds to the fantasy font family in the page linked above
+ facename.Add(wxS("Impact"));
+ break;
+
+ case wxFONTFAMILY_ROMAN:
+ // corresponds to the serif font family in the page linked above
+ facename.Add(wxS("Century Schoolbook L"));
+ facename.Add(wxS("URW Bookman L"));
+ facename.Add(wxS("URW Palladio L"));
+ facename.Add(wxS("DejaVu Serif"));
+ facename.Add(wxS("FreeSerif"));
+ facename.Add(wxS("Times New Roman"));
+ facename.Add(wxS("Times"));
+ break;
+
+ case wxFONTFAMILY_TELETYPE:
+ case wxFONTFAMILY_MODERN:
+ // corresponds to the monospace font family in the page linked above
+ facename.Add(wxS("DejaVu Sans Mono"));
+ facename.Add(wxS("Nimbus Mono L"));
+ facename.Add(wxS("Bitstream Vera Sans Mono"));
+ facename.Add(wxS("Andale Mono"));
+ facename.Add(wxS("Lucida Sans Typewriter"));
+ facename.Add(wxS("FreeMono"));
+ facename.Add(wxS("Courier New"));
+ facename.Add(wxS("Courier"));
+ break;
+
+ case wxFONTFAMILY_SWISS:
+ case wxFONTFAMILY_DEFAULT:
+ default:
+ // corresponds to the sans-serif font family in the page linked above
+ facename.Add(wxS("DejaVu Sans"));
+ facename.Add(wxS("URW Gothic L"));
+ facename.Add(wxS("Nimbus Sans L"));
+ facename.Add(wxS("Bitstream Vera Sans"));
+ facename.Add(wxS("Lucida Sans"));
+ facename.Add(wxS("Arial"));
+ facename.Add(wxS("FreeSans"));
+ break;
+ }
+
+ SetFaceName(facename);
+}
+
+void wxNativeFontInfo::SetEncoding(wxFontEncoding WXUNUSED(encoding))
+{
+ wxFAIL_MSG( "not implemented: Pango encoding is always UTF8" );
+}
+
+bool wxNativeFontInfo::FromString(const wxString& s)
+{
+ if (description)
+ pango_font_description_free( description );
+
+ // there is a bug in at least pango <= 1.13 which makes it (or its backends)
+ // segfault for very big point sizes and for negative point sizes.
+ // To workaround that bug for pango <= 1.13
+ // (see http://bugzilla.gnome.org/show_bug.cgi?id=340229)
+ // we do the check on the size here using same (arbitrary) limits used by
+ // pango > 1.13. Note that the segfault could happen also for pointsize
+ // smaller than this limit !!
+ wxString str(s);
+ const size_t pos = str.find_last_of(wxS(" "));
+ double size;
+ if ( pos != wxString::npos && wxString(str, pos + 1).ToDouble(&size) )
+ {
+ wxString sizeStr;
+ if ( size < 1 )
+ sizeStr = wxS("1");
+ else if ( size >= 1E6 )
+ sizeStr = wxS("1E6");
+
+ if ( !sizeStr.empty() )
+ {
+ // replace the old size with the adjusted one
+ str = wxString(s, 0, pos) + sizeStr;
+ }
+ }
+
+ description = pango_font_description_from_string(wxPANGO_CONV(str));
+
+#if wxUSE_FONTENUM
+ // ensure a valid facename is selected
+ if (!wxFontEnumerator::IsValidFacename(GetFaceName()))
+ SetFaceName(wxNORMAL_FONT->GetFaceName());
+#endif // wxUSE_FONTENUM
+
+ return true;
+}
+
+wxString wxNativeFontInfo::ToString() const
+{
+ wxGtkString str(pango_font_description_to_string( description ));
+
+ return wxPANGO_CONV_BACK(str);
+}
+
+bool wxNativeFontInfo::FromUserString(const wxString& s)
+{
+ return FromString( s );
+}
+
+wxString wxNativeFontInfo::ToUserString() const
+{
+ return ToString();
+}
+
+#else // GTK+ 1.x
+
+#ifdef __X__
+ #ifdef __VMS__
+ #pragma message disable nosimpint
+ #endif
+
+ #include <X11/Xlib.h>
+
+ #ifdef __VMS__
+ #pragma message enable nosimpint
+ #endif