X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c79853685d09ba1d7eaef604395c40b731ed2f34..4efb5650d15789f9f409b963eb4f9f6de999b51e:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index a486103090..74864d1882 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() @@ -142,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 // ---------------------------------------------------------------------------- @@ -150,24 +185,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::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("-") ); + tn.GetNextToken(); // skip initial empty token tn.GetNextToken(); // foundry + M_FONTDATA->m_faceName = tn.GetNextToken(); // family tmp = tn.GetNextToken().MakeUpper(); // weight @@ -189,8 +254,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 +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(), @@ -242,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; } @@ -275,8 +332,6 @@ void wxFont::Unshare() wxFont::~wxFont() { - if (wxTheFontList) - wxTheFontList->DeleteObject( this ); } // ---------------------------------------------------------------------------- @@ -333,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 // ---------------------------------------------------------------------------- @@ -342,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) @@ -349,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) @@ -356,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) @@ -363,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) @@ -370,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) @@ -384,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; } // ---------------------------------------------------------------------------- @@ -392,15 +471,30 @@ void wxFont::SetEncoding(wxFontEncoding encoding) static GdkFont *g_systemDefaultGuiFont = (GdkFont*) NULL; -static GdkFont *GtkGetDefaultGuiFont() +GdkFont *GtkGetDefaultGuiFont() { if (!g_systemDefaultGuiFont) { GtkWidget *widget = gtk_button_new(); GtkStyle *def = gtk_rc_get_style( widget ); - g_systemDefaultGuiFont = gdk_font_ref( def->font ); + if (def) + { + g_systemDefaultGuiFont = gdk_font_ref( def->font ); + } + else + { + def = gtk_widget_get_default_style(); + if (def) + g_systemDefaultGuiFont = gdk_font_ref( def->font ); + } gtk_widget_destroy( widget ); } + else + { + // already have it, but ref it once more before returning + gdk_font_ref(g_systemDefaultGuiFont); + } + return g_systemDefaultGuiFont; } @@ -428,7 +522,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const { font = GtkGetDefaultGuiFont(); } - else + if (!font) { font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_family, @@ -436,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 );