X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e6527f9dd4ed313b3d651e977f8c1219114e38d4..847341dbebd752290cb450dbbbc4c2bc9b6a6ac8:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 5e9d1ce629..940b38d81a 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -31,6 +31,7 @@ #include #include +#include #include // ---------------------------------------------------------------------------- @@ -70,7 +71,9 @@ private: wxString m_faceName; wxFontEncoding m_encoding; - friend wxFont; + wxNativeFontInfo m_nativeFontInfo; + + friend class wxFont; }; // ============================================================================ @@ -119,15 +122,16 @@ wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER) { Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, - data.m_underlined, data.m_faceName, data.m_encoding); + data.m_underlined, data.m_faceName, data.m_encoding); } wxFontRefData::wxFontRefData(int size, int family, int style, - int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding ) + int weight, bool underlined, + const wxString& faceName, + wxFontEncoding encoding) : m_scaled_xfonts(wxKEY_INTEGER) { - Init(size, family, style, weight, - underlined, faceName, encoding); + Init(size, family, style, weight, underlined, faceName, encoding); } wxFontRefData::~wxFontRefData() @@ -150,24 +154,54 @@ IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) void wxFont::Init() { - if (wxTheFontList) - wxTheFontList->Append( this ); } -wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) +wxFont::wxFont(const wxNativeFontInfo& info) { Init(); - wxCHECK_RET( !!fontname, _T("invalid font spec") ); + Create(info.xFontName); +} + +bool wxFont::Create(const wxNativeFontInfo& info) +{ + return Create(info.xFontName); +} + +bool wxFont::Create( int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString& face, + wxFontEncoding encoding) +{ + m_refData = new wxFontRefData(pointSize, family, style, weight, + underlined, face, encoding); + + return TRUE; +} + +bool wxFont::Create(const wxString& fontname, wxFontEncoding enc) +{ + if( !fontname ) + { + *this = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT); + return TRUE; + } m_refData = new wxFontRefData(); + M_FONTDATA->m_nativeFontInfo.xFontName = fontname; // X font name + wxString tmp; wxStringTokenizer tn( fontname, wxT("-") ); + tn.GetNextToken(); // skip initial empty token tn.GetNextToken(); // foundry + M_FONTDATA->m_faceName = tn.GetNextToken(); // family tmp = tn.GetNextToken().MakeUpper(); // weight @@ -189,8 +223,11 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) tn.GetNextToken(); // pixel size tmp = tn.GetNextToken(); // pointsize - long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10); - M_FONTDATA->m_pointSize = (int)(num / 10); + if (tmp != wxT("*")) + { + long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10); + M_FONTDATA->m_pointSize = (int)(num / 10); + } tn.GetNextToken(); // x-res tn.GetNextToken(); // y-res @@ -213,7 +250,7 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) tn.GetNextToken(); // avg width // deal with font encoding - M_FONTDATA->m_encoding = fontdata.GetEncoding(); + M_FONTDATA->m_encoding = enc; if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) { wxString registry = tn.GetNextToken().MakeUpper(), @@ -242,20 +279,9 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) M_FONTDATA->m_encoding = wxFONTENCODING_KOI8; } //else: unknown encoding - may be give a warning here? + else + return FALSE; } -} - -bool wxFont::Create( int pointSize, - int family, - int style, - int weight, - bool underlined, - const wxString& face, - wxFontEncoding encoding ) -{ - m_refData = new wxFontRefData(pointSize, family, style, weight, - underlined, face, encoding); - return TRUE; } @@ -275,14 +301,17 @@ void wxFont::Unshare() wxFont::~wxFont() { - if (wxTheFontList) - wxTheFontList->DeleteObject( this ); } // ---------------------------------------------------------------------------- // accessors // ---------------------------------------------------------------------------- +bool wxFont::HasNativeFont() const +{ + return !M_FONTDATA->m_nativeFontInfo.xFontName.empty(); +} + int wxFont::GetPointSize() const { wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); @@ -333,6 +362,32 @@ wxFontEncoding wxFont::GetEncoding() const return M_FONTDATA->m_encoding; } +wxNativeFontInfo *wxFont::GetNativeFontInfo() const +{ + wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") ); + + if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty()) + GetInternalFont(); + + return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo); +} + +bool wxFont::IsFixedWidth() const +{ + wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") ); + + if ( HasNativeFont() ) + { + // the monospace fonts are supposed to have "M" in the spacing field + wxString spacing = M_FONTDATA-> + m_nativeFontInfo.GetXFontComponent(wxXLFD_SPACING); + + return spacing.Upper() == _T('M'); + } + + return wxFontBase::IsFixedWidth(); +} + // ---------------------------------------------------------------------------- // change font attributes // ---------------------------------------------------------------------------- @@ -342,6 +397,7 @@ void wxFont::SetPointSize(int pointSize) Unshare(); M_FONTDATA->m_pointSize = pointSize; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now } void wxFont::SetFamily(int family) @@ -349,6 +405,7 @@ void wxFont::SetFamily(int family) Unshare(); M_FONTDATA->m_family = family; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now } void wxFont::SetStyle(int style) @@ -356,6 +413,7 @@ void wxFont::SetStyle(int style) Unshare(); M_FONTDATA->m_style = style; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now } void wxFont::SetWeight(int weight) @@ -363,6 +421,7 @@ void wxFont::SetWeight(int weight) Unshare(); M_FONTDATA->m_weight = weight; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now } void wxFont::SetFaceName(const wxString& faceName) @@ -370,6 +429,7 @@ void wxFont::SetFaceName(const wxString& faceName) Unshare(); M_FONTDATA->m_faceName = faceName; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now } void wxFont::SetUnderlined(bool underlined) @@ -384,6 +444,14 @@ void wxFont::SetEncoding(wxFontEncoding encoding) Unshare(); M_FONTDATA->m_encoding = encoding; + M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now +} + +void wxFont::SetNativeFontInfo(const wxNativeFontInfo& info) +{ + Unshare(); + + M_FONTDATA->m_nativeFontInfo = info; } // ---------------------------------------------------------------------------- @@ -392,7 +460,7 @@ void wxFont::SetEncoding(wxFontEncoding encoding) static GdkFont *g_systemDefaultGuiFont = (GdkFont*) NULL; -static GdkFont *GtkGetDefaultGuiFont() +GdkFont *GtkGetDefaultGuiFont() { if (!g_systemDefaultGuiFont) { @@ -410,6 +478,12 @@ static GdkFont *GtkGetDefaultGuiFont() } gtk_widget_destroy( widget ); } + else + { + // already have it, but ref it once more before returning + gdk_font_ref(g_systemDefaultGuiFont); + } + return g_systemDefaultGuiFont; } @@ -433,7 +507,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const } else { - if (*this == wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT)) + if (*this == wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT)) { font = GtkGetDefaultGuiFont(); } @@ -445,7 +519,8 @@ GdkFont *wxFont::GetInternalFont( float scale ) const M_FONTDATA->m_weight, M_FONTDATA->m_underlined, M_FONTDATA->m_faceName, - M_FONTDATA->m_encoding ); + M_FONTDATA->m_encoding, + &M_FONTDATA->m_nativeFontInfo.xFontName ); } M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );