X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..4efb5650d15789f9f409b963eb4f9f6de999b51e:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 83010c18da..74864d1882 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -71,6 +71,8 @@ private: wxString m_faceName; wxFontEncoding m_encoding; + wxNativeFontInfo m_nativeFontInfo; + friend class wxFont; }; @@ -120,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() @@ -143,6 +146,37 @@ wxFontRefData::~wxFontRefData() } } +// ---------------------------------------------------------------------------- +// wxNativeFontInfo +// ---------------------------------------------------------------------------- + +bool wxNativeFontInfo::FromString(const wxString& s) +{ + wxStringTokenizer tokenizer(s, _T(";")); + + wxString token = tokenizer.GetNextToken(); + // + // Ignore the version for now + // + + xFontName = tokenizer.GetNextToken(); + if(!xFontName) + return FALSE; + + return TRUE; +} + +wxString wxNativeFontInfo::ToString() const +{ + wxString s; + + s.Printf(_T("%d;%s"), + 0, // version + xFontName.c_str()); + + return s; +} + // ---------------------------------------------------------------------------- // wxFont // ---------------------------------------------------------------------------- @@ -151,18 +185,46 @@ 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::GetSystemFont( 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("-") ); @@ -170,6 +232,7 @@ wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) tn.GetNextToken(); // skip initial empty token tn.GetNextToken(); // foundry + M_FONTDATA->m_faceName = tn.GetNextToken(); // family tmp = tn.GetNextToken().MakeUpper(); // weight @@ -218,7 +281,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(), @@ -247,20 +310,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; } @@ -280,8 +332,6 @@ void wxFont::Unshare() wxFont::~wxFont() { - if (wxTheFontList) - wxTheFontList->DeleteObject( this ); } // ---------------------------------------------------------------------------- @@ -338,6 +388,17 @@ 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); +} + + // ---------------------------------------------------------------------------- // change font attributes // ---------------------------------------------------------------------------- @@ -347,6 +408,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) @@ -354,6 +416,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) @@ -361,6 +424,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) @@ -368,6 +432,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) @@ -375,6 +440,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) @@ -389,6 +455,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; } // ---------------------------------------------------------------------------- @@ -415,6 +489,12 @@ 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; } @@ -450,7 +530,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 );