]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/fontutil.cpp
added functions to read/write several elements at once (patch 754986)
[wxWidgets.git] / src / unix / fontutil.cpp
index 0e8aeaddd2d4750f7d1156cc15730450faafabea..b1e8be165a8a3443ab4aa5caffa43ecc0bc43e66 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     05.11.99
 // RCS-ID:      $Id$
 // Copyright:   (c) Vadim Zeitlin
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #include "wx/hash.h"
 #include "wx/module.h"
 
-#ifdef __WXGTK20__
+#if wxUSE_PANGO
+
+#include "pango/pango.h"
 
+#ifdef __WXGTK20__
 #include "wx/gtk/private.h"
+#else
+#include "wx/x11/private.h"
+#endif
 
 // ----------------------------------------------------------------------------
 // wxNativeFontInfo
@@ -71,7 +77,7 @@ wxFontStyle wxNativeFontInfo::GetStyle() const
             m_style = wxFONTSTYLE_SLANT;
             break;
     }
-    
+
     return m_style;
 }
 
@@ -100,7 +106,7 @@ wxFontWeight wxNativeFontInfo::GetWeight() const
             m_weight = wxFONTWEIGHT_BOLD;
             break;
     }
-    
+
     return m_weight;
 }
 
@@ -112,7 +118,7 @@ bool wxNativeFontInfo::GetUnderlined() const
 wxString wxNativeFontInfo::GetFaceName() const
 {
     wxString tmp = wxGTK_CONV_BACK( pango_font_description_get_family( description ) );
-    
+
     return tmp;
 }
 
@@ -138,7 +144,9 @@ bool wxNativeFontInfo::FromString(const wxString& s)
 
 wxString wxNativeFontInfo::ToString() const
 {
-    wxString tmp = wxGTK_CONV_BACK( pango_font_description_to_string( description ) );
+    char *str = pango_font_description_to_string( description );
+    wxString tmp = wxGTK_CONV_BACK(  str );
+    g_free( str );
 
     return tmp;
 }
@@ -178,8 +186,7 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
     return FALSE;
 }
 
-#else 
-   // __WXGTK20__
+#else // GTK+ 1.x
 
 #ifdef __X__
     #ifdef __VMS__
@@ -228,7 +235,10 @@ static wxHashTable *g_fontHash = (wxHashTable*) NULL;
 #elif defined(__WXGTK__)
     wxNativeFont wxLoadFont(const wxString& fontSpec)
     {
-       return gdk_font_load( wxConvertWX2MB(fontSpec) );
+        // use gdk_fontset_load() instead of gdk_font_load() because otherwise
+        // we have problems with Japanese (not terribly precise, I know, but
+        // this is all the patch said)
+        return gdk_fontset_load( wxConvertWX2MB(fontSpec) );
     }
 
     inline void wxFreeFont(wxNativeFont font)
@@ -385,7 +395,13 @@ bool wxNativeFontInfo::FromXFontName(const wxString& fontname)
     }
 
     // this should be all
-    return !tokenizer.HasMoreTokens();
+    if ( tokenizer.HasMoreTokens() )
+        return FALSE;
+
+    // we're initialized now
+    m_isDefault = FALSE;
+
+    return TRUE;
 }
 
 wxString wxNativeFontInfo::GetXFontName() const
@@ -446,6 +462,164 @@ void wxNativeFontInfo::SetXFontName(const wxString& xFontName_)
     m_isDefault = FALSE;
 }
 
+int wxNativeFontInfo::GetPointSize() const
+{
+    const wxString s = GetXFontComponent(wxXLFD_POINTSIZE);
+
+    // return -1 to indicate that the size is unknown
+    long l;
+    return s.ToLong(&l) ? l : -1;
+}
+
+wxFontStyle wxNativeFontInfo::GetStyle() const
+{
+    const wxString s = GetXFontComponent(wxXLFD_SLANT);
+
+    if ( s.length() != 1 )
+    {
+        // it is really unknown but we don't have any way to return it from
+        // here
+        return wxFONTSTYLE_NORMAL;
+    }
+
+    switch ( s[0] )
+    {
+        default:
+            // again, unknown but consider normal by default
+
+        case _T('r'):
+            return wxFONTSTYLE_NORMAL;
+
+        case _T('i'):
+            return wxFONTSTYLE_ITALIC;
+
+        case _T('o'):
+            return wxFONTSTYLE_SLANT;
+    }
+}
+
+wxFontWeight wxNativeFontInfo::GetWeight() const
+{
+    const wxString s = GetXFontComponent(wxXLFD_WEIGHT).MakeLower();
+    if ( s.find(_T("bold")) != wxString::npos || s == _T("black") )
+        return wxFONTWEIGHT_BOLD;
+    else if ( s == _T("light") )
+        return wxFONTWEIGHT_LIGHT;
+
+    return wxFONTWEIGHT_NORMAL;
+}
+
+bool wxNativeFontInfo::GetUnderlined() const
+{
+    // X fonts are never underlined
+    return FALSE;
+}
+
+wxString wxNativeFontInfo::GetFaceName() const
+{
+    // wxWindows facename probably more accurately corresponds to X family
+    return GetXFontComponent(wxXLFD_FAMILY);
+}
+
+wxFontFamily wxNativeFontInfo::GetFamily() const
+{
+    // and wxWindows family -- to X foundry, but we have to translate it to
+    // wxFontFamily somehow...
+    wxFAIL_MSG(_T("not implemented")); // GetXFontComponent(wxXLFD_FOUNDRY);
+
+    return wxFONTFAMILY_DEFAULT;
+}
+
+wxFontEncoding wxNativeFontInfo::GetEncoding() const
+{
+    // we already have the code for this but need to refactor it first
+    wxFAIL_MSG( _T("not implemented") );
+
+    return wxFONTENCODING_MAX;
+}
+
+void wxNativeFontInfo::SetPointSize(int pointsize)
+{
+    SetXFontComponent(wxXLFD_POINTSIZE, wxString::Format(_T("%d"), pointsize));
+}
+
+void wxNativeFontInfo::SetStyle(wxFontStyle style)
+{
+    wxString s;
+    switch ( style )
+    {
+        case wxFONTSTYLE_ITALIC:
+            s = _T('i');
+            break;
+
+        case wxFONTSTYLE_SLANT:
+            s = _T('o');
+            break;
+
+        case wxFONTSTYLE_NORMAL:
+            s = _T('r');
+
+        default:
+            wxFAIL_MSG( _T("unknown wxFontStyle in wxNativeFontInfo::SetStyle") );
+            return;
+    }
+
+    SetXFontComponent(wxXLFD_SLANT, s);
+}
+
+void wxNativeFontInfo::SetWeight(wxFontWeight weight)
+{
+    wxString s;
+    switch ( weight )
+    {
+        case wxFONTWEIGHT_BOLD:
+            s = _T("bold");
+            break;
+
+        case wxFONTWEIGHT_LIGHT:
+            s = _T("light");
+            break;
+
+        case wxFONTWEIGHT_NORMAL:
+            s = _T("medium");
+            break;
+
+        default:
+            wxFAIL_MSG( _T("unknown wxFontWeight in wxNativeFontInfo::SetWeight") );
+            return;
+    }
+
+    SetXFontComponent(wxXLFD_WEIGHT, s);
+}
+
+void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
+{
+    // can't do this under X
+}
+
+void wxNativeFontInfo::SetFaceName(wxString facename)
+{
+    SetXFontComponent(wxXLFD_FAMILY, facename);
+}
+
+void wxNativeFontInfo::SetFamily(wxFontFamily family)
+{
+    // wxFontFamily -> X foundry, anyone?
+    wxFAIL_MSG( _T("not implemented") );
+
+    // SetXFontComponent(wxXLFD_FOUNDRY, ...);
+}
+
+void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
+{
+    wxNativeEncodingInfo info;
+    if ( wxGetNativeFontEncoding(encoding, &info) )
+    {
+        SetXFontComponent(wxXLFD_ENCODING, info.xencoding);
+        SetXFontComponent(wxXLFD_REGISTRY, info.xregistry);
+    }
+}
+
 // ----------------------------------------------------------------------------
 // common functions
 // ----------------------------------------------------------------------------
@@ -489,6 +663,11 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
             info->xencoding = wxT("*");
             break;
 
+        case wxFONTENCODING_GB2312:
+            info->xregistry = wxT("GB2312");   // or the otherway round? 
+            info->xencoding = wxT("*");
+            break;
+
         case wxFONTENCODING_KOI8:
             info->xregistry = wxT("koi8");
 
@@ -800,7 +979,7 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
     // An alternative: assume that the screen is 72 dpi.
     //int pixelHeight = (int) (((float)pointSize / 720.0) * 72.0) ;
     //int pixelHeight = (int) ((float)pointSize / 10.0) ;
-    
+
     GR_LOGFONT logFont;
     logFont.lfHeight = pixelHeight;
     logFont.lfWidth = 0;
@@ -827,7 +1006,7 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
     fontInfo->fid = GrCreateFont((GR_CHAR*) facename.c_str(), pixelHeight, & logFont);
     GrGetFontInfo(fontInfo->fid, & fontInfo->info);
     return (wxNativeFont) fontInfo;
-    
+
 #else
     wxString fontSpec;
     if (!facename.IsEmpty())
@@ -1038,5 +1217,5 @@ void wxFontModule::OnExit()
     g_fontHash = (wxHashTable *)NULL;
 }
 
-#endif
-  // not GTK 2.0
+#endif // GTK 2.0/1.x
+