X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7941ba111cac53f21eafdeeeed6b543c3a2ba610..c5124240c43bd7949275aac7eb9ee7e33bc24fa7:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index a957f4f68a..74864d1882 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -26,10 +26,13 @@ #include "wx/log.h" #include "wx/gdicmn.h" #include "wx/tokenzr.h" +#include "wx/settings.h" #include #include +#include +#include // ---------------------------------------------------------------------------- // wxFontRefData @@ -68,7 +71,9 @@ private: wxString m_faceName; wxFontEncoding m_encoding; - friend wxFont; + wxNativeFontInfo m_nativeFontInfo; + + friend class wxFont; }; // ============================================================================ @@ -117,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() @@ -140,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 // ---------------------------------------------------------------------------- @@ -148,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 @@ -187,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 @@ -211,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(), @@ -240,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; } @@ -273,8 +332,6 @@ void wxFont::Unshare() wxFont::~wxFont() { - if (wxTheFontList) - wxTheFontList->DeleteObject( this ); } // ---------------------------------------------------------------------------- @@ -331,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 // ---------------------------------------------------------------------------- @@ -340,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) @@ -347,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) @@ -354,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) @@ -361,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) @@ -368,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) @@ -382,12 +455,49 @@ 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; } // ---------------------------------------------------------------------------- // get internal representation of font // ---------------------------------------------------------------------------- +static GdkFont *g_systemDefaultGuiFont = (GdkFont*) NULL; + +GdkFont *GtkGetDefaultGuiFont() +{ + if (!g_systemDefaultGuiFont) + { + GtkWidget *widget = gtk_button_new(); + GtkStyle *def = gtk_rc_get_style( widget ); + 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; +} + GdkFont *wxFont::GetInternalFont( float scale ) const { if (!Ok()) @@ -408,18 +518,11 @@ GdkFont *wxFont::GetInternalFont( float scale ) const } else { -#if 0 - if ((int_scale == 100) && - (M_FONTDATA->m_family == wxSWISS) && - (M_FONTDATA->m_style == wxNORMAL) && - (M_FONTDATA->m_pointSize == 12) && - (M_FONTDATA->m_weight == wxNORMAL) && - (M_FONTDATA->m_underlined == FALSE)) + if (*this == wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT)) { - font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" ); + font = GtkGetDefaultGuiFont(); } - else -#endif // 0 + if (!font) { font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_family, @@ -427,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 );