]> git.saurik.com Git - wxWidgets.git/commitdiff
Lots of work to set PangoFontDescription as the
authorRobert Roebling <robert@roebling.de>
Tue, 6 Aug 2002 16:41:31 +0000 (16:41 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 6 Aug 2002 16:41:31 +0000 (16:41 +0000)
   native font info data. WIP.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16379 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/defs.h
include/wx/fontenc.h
include/wx/fontutil.h
src/gtk/dcclient.cpp
src/gtk/font.cpp
src/gtk/fontdlg.cpp
src/gtk1/dcclient.cpp
src/gtk1/font.cpp
src/gtk1/fontdlg.cpp
src/unix/fontenum.cpp
src/unix/fontutil.cpp

index f77634db5e41b7fcbabb7bd42457b7db59d6b35e..f96214f092538fe41ac21e5e447f5105aaaeab1d 100644 (file)
@@ -1785,7 +1785,7 @@ enum wxPrintMode
 // ----------------------------------------------------------------------------
 
 // define this macro if font handling is done using the X font names
-#if defined(__WXGTK__) || defined(__X__)
+#if (defined(__WXGTK__) && !defined(__WXGTK20__)) || defined(__X__)
     #define _WX_X_FONTLIKE
 #endif
 
index 73c832a771f93c11661d8d94ae379b689a8b1921..2ec2bc147aba2f03729f256988ad3b59a62e1a30 100644 (file)
@@ -113,6 +113,9 @@ struct WXDLLEXPORT wxNativeEncodingInfo
 #elif defined(_WX_X_FONTLIKE)
     wxString xregistry,
              xencoding;
+#elif defined(__WXGTK20__)
+    // No way to specify this in Pango as this
+    // seems to be handled internally.
 #elif defined(__WXMGL__)
     int      mglEncoding;
 #else
index 0fba84773103d251903ada4efee0a69ba0b3d35e..26369c39d2412d711f42e5c802a3a5741a8d8d75 100644 (file)
@@ -113,6 +113,8 @@ public:
     FATTRS       fa;
     FONTMETRICS  fm;
     FACENAMEDESC fn;
+#elif defined(__WXGTK20__)
+    PangoFontDescription *description;
 #else // other platforms
     //
     //  This is a generic implementation that should work on all ports
index 84b8ede60f579404dcd573548ecf6d7c495179c3..eea9ffd7c3ae2cffa6d3f3098f90aea01c379e1e 100644 (file)
@@ -20,6 +20,7 @@
 #include "wx/image.h"
 #include "wx/module.h"
 #include "wx/log.h"
+#include "wx/fontutil.h"
 
 #include "wx/gtk/win_gtk.h"
 
@@ -1656,7 +1657,7 @@ void wxWindowDC::SetFont( const wxFont &font )
 
     m_font = font;
 #ifdef __WXGTK20__
-    // fix fontdesc?
+    m_fontdesc = m_font.GetNativeFontInfo()->description;
 #endif
 }
 
index 8e1b604d0dca3eb29dafe5548624d138bac5002b..315cb82736272d36fd8f1daec94eb9a0840cfe23 100644 (file)
@@ -78,7 +78,11 @@ public:
     // do we have the native font info?
     bool HasNativeFont() const
     {
+#ifdef __WXGTK20__
+        return TRUE;  // ?
+#else
         return !m_nativeFontInfo.IsDefault();
+#endif
     }
 
     // setters: all of them also take care to modify m_nativeFontInfo if we
@@ -95,7 +99,7 @@ public:
     //
     // VZ: I need this as my gdb either shows wildly wrong values or crashes
     //     when I ask it to "p fontRefData" :-(
-#ifdef __WXDEBUG__
+#if defined(__WXDEBUG__) && !defined(__WXGTK20__)
     void Dump() const
     {
         wxPrintf(_T("%s-%s-%s-%d-%d\n"),
@@ -122,8 +126,10 @@ protected:
               wxFontEncoding encoding);
 
 private:
+#ifndef __WXGTK20__
     // the map of font sizes to "GdkFont *"
     wxScaledFontList  m_scaled_xfonts;
+#endif
 
     // the broken down font parameters
     int             m_pointSize;
@@ -132,9 +138,10 @@ private:
                     m_weight;
     bool            m_underlined;
     wxString        m_faceName;
-    wxFontEncoding  m_encoding;
+    wxFontEncoding  m_encoding;  // Unused under GTK 2.0
 
-    // the native font info, basicly an XFLD
+    // The native font info, basicly an XFLD under GTK 1.2 and
+    // the pango font description under GTK 2.0.
     wxNativeFontInfo m_nativeFontInfo;
 
     friend class wxFont;
@@ -199,6 +206,71 @@ wxFontRefData::wxFontRefData(int size, int family, int style,
 
 wxFontRefData::wxFontRefData(const wxString& fontname)
 {
+#ifdef __WXGTK20__
+    m_nativeFontInfo.FromString( fontname );
+    
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    // init fields
+    m_faceName = wxGTK_CONV_BACK( pango_font_description_get_family( desc ) );
+    
+    m_pointSize = pango_font_description_get_size( desc ) / PANGO_SCALE;
+    
+    switch (pango_font_description_get_style( desc ))
+    {
+        case PANGO_STYLE_NORMAL:
+            m_style = wxFONTSTYLE_NORMAL;
+            break;
+        case PANGO_STYLE_ITALIC:
+            m_style = wxFONTSTYLE_ITALIC;
+            break;
+        case PANGO_STYLE_OBLIQUE:
+            m_style = wxFONTSTYLE_SLANT;
+            break;
+    }
+
+    switch (pango_font_description_get_weight( desc ))
+    {
+        case PANGO_WEIGHT_ULTRALIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_LIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_NORMAL:
+            m_weight = wxFONTWEIGHT_NORMAL;
+            break;
+        case PANGO_WEIGHT_BOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_ULTRABOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_HEAVY:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+    }
+    
+    if (m_faceName == wxT("monospaced"))
+    {
+        m_family = wxFONTFAMILY_TELETYPE;
+    }
+    else if (m_faceName == wxT("sans"))
+    {
+        m_family = wxFONTFAMILY_SWISS;
+    }
+    else
+    {
+        m_family = wxFONTFAMILY_UNKNOWN;
+    }
+
+    // Pango description are never underlined (?)
+    m_underlined = FALSE;
+
+    // Cannot we choose that
+    m_encoding = wxFONTENCODING_SYSTEM;
+#else
     // remember the X font name
     m_nativeFontInfo.SetXFontName(fontname);
 
@@ -299,10 +371,12 @@ wxFontRefData::wxFontRefData(const wxString& fontname)
         // may be give a warning here?
         m_encoding = wxFONTENCODING_SYSTEM;
     }
+#endif
 }
 
 wxFontRefData::~wxFontRefData()
 {
+#ifndef __WXGTK20__
     wxNode *node = m_scaled_xfonts.First();
     while (node)
     {
@@ -311,6 +385,7 @@ wxFontRefData::~wxFontRefData()
         gdk_font_unref( font );
         node = next;
     }
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -321,6 +396,12 @@ void wxFontRefData::SetPointSize(int pointSize)
 {
     m_pointSize = pointSize;
 
+#ifdef __WXGTK20__
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    pango_font_description_set_size( desc, m_pointSize * PANGO_SCALE );
+#else
     if ( HasNativeFont() )
     {
         wxString size;
@@ -331,6 +412,7 @@ void wxFontRefData::SetPointSize(int pointSize)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_POINTSIZE, size);
     }
+#endif
 }
 
 void wxFontRefData::SetFamily(int family)
@@ -344,6 +426,26 @@ void wxFontRefData::SetStyle(int style)
 {
     m_style = style;
 
+#ifdef __WXGTK20__
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    switch ( style )
+    {
+        case wxFONTSTYLE_ITALIC:
+            pango_font_description_set_style( desc, PANGO_STYLE_ITALIC );
+            break;
+        case wxFONTSTYLE_SLANT:
+            pango_font_description_set_style( desc, PANGO_STYLE_OBLIQUE );
+            break;
+        default:
+            wxFAIL_MSG( _T("unknown font style") );
+            // fall through
+        case wxFONTSTYLE_NORMAL:
+            pango_font_description_set_style( desc, PANGO_STYLE_NORMAL );
+            break;
+    }
+#else
     if ( HasNativeFont() )
     {
         wxString slant;
@@ -367,12 +469,14 @@ void wxFontRefData::SetStyle(int style)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_SLANT, slant);
     }
+#endif
 }
 
 void wxFontRefData::SetWeight(int weight)
 {
     m_weight = weight;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         wxString boldness;
@@ -397,6 +501,7 @@ void wxFontRefData::SetWeight(int weight)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_WEIGHT, boldness);
     }
+#endif
 }
 
 void wxFontRefData::SetUnderlined(bool underlined)
@@ -410,16 +515,19 @@ void wxFontRefData::SetFaceName(const wxString& facename)
 {
     m_faceName = facename;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         m_nativeFontInfo.SetXFontComponent(wxXLFD_FAMILY, facename);
     }
+#endif
 }
 
 void wxFontRefData::SetEncoding(wxFontEncoding encoding)
 {
     m_encoding = encoding;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         wxNativeEncodingInfo info;
@@ -429,6 +537,7 @@ void wxFontRefData::SetEncoding(wxFontEncoding encoding)
             m_nativeFontInfo.SetXFontComponent(wxXLFD_ENCODING, info.xencoding);
         }
     }
+#endif
 }
 
 // ============================================================================
@@ -449,7 +558,17 @@ wxFont::wxFont(const wxNativeFontInfo& info)
 {
     Init();
 
+#ifdef __WXGTK20__
+    Create( info.GetPointSize(), 
+            info.GetFamily(),
+            info.GetStyle(),
+            info.GetWeight(),
+            info.GetUnderlined(),
+            info.GetFaceName(),
+            info.GetEncoding() );
+#else
     Create(info.GetXFontName());
+#endif
 }
 
 bool wxFont::Create( int pointSize,
@@ -559,8 +678,10 @@ wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 {
     wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") );
 
+#ifndef __WXGTK20__  // ???
     if ( M_FONTDATA->m_nativeFontInfo.GetXFontName().empty() )
         GetInternalFont();
+#endif
 
     return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
 }
@@ -569,6 +690,7 @@ bool wxFont::IsFixedWidth() const
 {
     wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
 
+#ifndef __WXGTK20__
     if ( M_FONTDATA->HasNativeFont() )
     {
         // the monospace fonts are supposed to have "M" in the spacing field
@@ -577,6 +699,7 @@ bool wxFont::IsFixedWidth() const
 
         return spacing.Upper() == _T('M');
     }
+#endif
 
     return wxFontBase::IsFixedWidth();
 }
@@ -588,7 +711,7 @@ bool wxFont::IsFixedWidth() const
 void wxFont::SetPointSize(int pointSize)
 {
     Unshare();
-
+        
     M_FONTDATA->SetPointSize(pointSize);
 }
 
@@ -681,7 +804,19 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
 
     wxCHECK_MSG( Ok(), font, wxT("invalid font") )
 
-    long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
+#ifdef __WXGTK20__
+    if (*this == wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT))
+    {
+        font = GtkGetDefaultGuiFont();
+    }
+    else
+    {
+        PangoFontDescription *font_description = GetNativeFontInfo()->description;
+        
+        font = gdk_font_from_description( font_description );
+    }
+#else
+    long int_scale = long(scale * 100.0 + 0.5); // key for fontlist
     int point_scale = (int)((M_FONTDATA->m_pointSize * 10 * int_scale) / 100);
 
     wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale);
@@ -728,6 +863,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
             M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
         }
     }
+#endif  // GTK 2.0
 
     // it's quite useless to make it a wxCHECK because we're going to crash
     // anyhow...
index 3444d52f6a70fbfcde8e1a48b6a9e6b91462b41c..4582a5c0022fbdaa5ebd77da726096c963615d9d 100644 (file)
@@ -74,6 +74,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
     }
 
     gchar *fontname = gtk_font_selection_dialog_get_font_name(fontdlg);
+    
+    // printf( "font %s\n", fontname );
 
     dialog->SetChosenFont(fontname);
 
@@ -145,6 +147,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
     gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
         GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this );
 
+#ifndef __WXGTK20__
     wxFont font = m_fontData.GetInitialFont();
     if( font.Ok() )
     {
@@ -167,6 +170,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
             wxFAIL_MSG(_T("font is ok but no native font info?"));
         }
     }
+#endif
 
     return TRUE;
 }
index 84b8ede60f579404dcd573548ecf6d7c495179c3..eea9ffd7c3ae2cffa6d3f3098f90aea01c379e1e 100644 (file)
@@ -20,6 +20,7 @@
 #include "wx/image.h"
 #include "wx/module.h"
 #include "wx/log.h"
+#include "wx/fontutil.h"
 
 #include "wx/gtk/win_gtk.h"
 
@@ -1656,7 +1657,7 @@ void wxWindowDC::SetFont( const wxFont &font )
 
     m_font = font;
 #ifdef __WXGTK20__
-    // fix fontdesc?
+    m_fontdesc = m_font.GetNativeFontInfo()->description;
 #endif
 }
 
index 8e1b604d0dca3eb29dafe5548624d138bac5002b..315cb82736272d36fd8f1daec94eb9a0840cfe23 100644 (file)
@@ -78,7 +78,11 @@ public:
     // do we have the native font info?
     bool HasNativeFont() const
     {
+#ifdef __WXGTK20__
+        return TRUE;  // ?
+#else
         return !m_nativeFontInfo.IsDefault();
+#endif
     }
 
     // setters: all of them also take care to modify m_nativeFontInfo if we
@@ -95,7 +99,7 @@ public:
     //
     // VZ: I need this as my gdb either shows wildly wrong values or crashes
     //     when I ask it to "p fontRefData" :-(
-#ifdef __WXDEBUG__
+#if defined(__WXDEBUG__) && !defined(__WXGTK20__)
     void Dump() const
     {
         wxPrintf(_T("%s-%s-%s-%d-%d\n"),
@@ -122,8 +126,10 @@ protected:
               wxFontEncoding encoding);
 
 private:
+#ifndef __WXGTK20__
     // the map of font sizes to "GdkFont *"
     wxScaledFontList  m_scaled_xfonts;
+#endif
 
     // the broken down font parameters
     int             m_pointSize;
@@ -132,9 +138,10 @@ private:
                     m_weight;
     bool            m_underlined;
     wxString        m_faceName;
-    wxFontEncoding  m_encoding;
+    wxFontEncoding  m_encoding;  // Unused under GTK 2.0
 
-    // the native font info, basicly an XFLD
+    // The native font info, basicly an XFLD under GTK 1.2 and
+    // the pango font description under GTK 2.0.
     wxNativeFontInfo m_nativeFontInfo;
 
     friend class wxFont;
@@ -199,6 +206,71 @@ wxFontRefData::wxFontRefData(int size, int family, int style,
 
 wxFontRefData::wxFontRefData(const wxString& fontname)
 {
+#ifdef __WXGTK20__
+    m_nativeFontInfo.FromString( fontname );
+    
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    // init fields
+    m_faceName = wxGTK_CONV_BACK( pango_font_description_get_family( desc ) );
+    
+    m_pointSize = pango_font_description_get_size( desc ) / PANGO_SCALE;
+    
+    switch (pango_font_description_get_style( desc ))
+    {
+        case PANGO_STYLE_NORMAL:
+            m_style = wxFONTSTYLE_NORMAL;
+            break;
+        case PANGO_STYLE_ITALIC:
+            m_style = wxFONTSTYLE_ITALIC;
+            break;
+        case PANGO_STYLE_OBLIQUE:
+            m_style = wxFONTSTYLE_SLANT;
+            break;
+    }
+
+    switch (pango_font_description_get_weight( desc ))
+    {
+        case PANGO_WEIGHT_ULTRALIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_LIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_NORMAL:
+            m_weight = wxFONTWEIGHT_NORMAL;
+            break;
+        case PANGO_WEIGHT_BOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_ULTRABOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_HEAVY:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+    }
+    
+    if (m_faceName == wxT("monospaced"))
+    {
+        m_family = wxFONTFAMILY_TELETYPE;
+    }
+    else if (m_faceName == wxT("sans"))
+    {
+        m_family = wxFONTFAMILY_SWISS;
+    }
+    else
+    {
+        m_family = wxFONTFAMILY_UNKNOWN;
+    }
+
+    // Pango description are never underlined (?)
+    m_underlined = FALSE;
+
+    // Cannot we choose that
+    m_encoding = wxFONTENCODING_SYSTEM;
+#else
     // remember the X font name
     m_nativeFontInfo.SetXFontName(fontname);
 
@@ -299,10 +371,12 @@ wxFontRefData::wxFontRefData(const wxString& fontname)
         // may be give a warning here?
         m_encoding = wxFONTENCODING_SYSTEM;
     }
+#endif
 }
 
 wxFontRefData::~wxFontRefData()
 {
+#ifndef __WXGTK20__
     wxNode *node = m_scaled_xfonts.First();
     while (node)
     {
@@ -311,6 +385,7 @@ wxFontRefData::~wxFontRefData()
         gdk_font_unref( font );
         node = next;
     }
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -321,6 +396,12 @@ void wxFontRefData::SetPointSize(int pointSize)
 {
     m_pointSize = pointSize;
 
+#ifdef __WXGTK20__
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    pango_font_description_set_size( desc, m_pointSize * PANGO_SCALE );
+#else
     if ( HasNativeFont() )
     {
         wxString size;
@@ -331,6 +412,7 @@ void wxFontRefData::SetPointSize(int pointSize)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_POINTSIZE, size);
     }
+#endif
 }
 
 void wxFontRefData::SetFamily(int family)
@@ -344,6 +426,26 @@ void wxFontRefData::SetStyle(int style)
 {
     m_style = style;
 
+#ifdef __WXGTK20__
+    // Get native info
+    PangoFontDescription *desc = m_nativeFontInfo.description;
+    
+    switch ( style )
+    {
+        case wxFONTSTYLE_ITALIC:
+            pango_font_description_set_style( desc, PANGO_STYLE_ITALIC );
+            break;
+        case wxFONTSTYLE_SLANT:
+            pango_font_description_set_style( desc, PANGO_STYLE_OBLIQUE );
+            break;
+        default:
+            wxFAIL_MSG( _T("unknown font style") );
+            // fall through
+        case wxFONTSTYLE_NORMAL:
+            pango_font_description_set_style( desc, PANGO_STYLE_NORMAL );
+            break;
+    }
+#else
     if ( HasNativeFont() )
     {
         wxString slant;
@@ -367,12 +469,14 @@ void wxFontRefData::SetStyle(int style)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_SLANT, slant);
     }
+#endif
 }
 
 void wxFontRefData::SetWeight(int weight)
 {
     m_weight = weight;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         wxString boldness;
@@ -397,6 +501,7 @@ void wxFontRefData::SetWeight(int weight)
 
         m_nativeFontInfo.SetXFontComponent(wxXLFD_WEIGHT, boldness);
     }
+#endif
 }
 
 void wxFontRefData::SetUnderlined(bool underlined)
@@ -410,16 +515,19 @@ void wxFontRefData::SetFaceName(const wxString& facename)
 {
     m_faceName = facename;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         m_nativeFontInfo.SetXFontComponent(wxXLFD_FAMILY, facename);
     }
+#endif
 }
 
 void wxFontRefData::SetEncoding(wxFontEncoding encoding)
 {
     m_encoding = encoding;
 
+#ifndef __WXGTK20__
     if ( HasNativeFont() )
     {
         wxNativeEncodingInfo info;
@@ -429,6 +537,7 @@ void wxFontRefData::SetEncoding(wxFontEncoding encoding)
             m_nativeFontInfo.SetXFontComponent(wxXLFD_ENCODING, info.xencoding);
         }
     }
+#endif
 }
 
 // ============================================================================
@@ -449,7 +558,17 @@ wxFont::wxFont(const wxNativeFontInfo& info)
 {
     Init();
 
+#ifdef __WXGTK20__
+    Create( info.GetPointSize(), 
+            info.GetFamily(),
+            info.GetStyle(),
+            info.GetWeight(),
+            info.GetUnderlined(),
+            info.GetFaceName(),
+            info.GetEncoding() );
+#else
     Create(info.GetXFontName());
+#endif
 }
 
 bool wxFont::Create( int pointSize,
@@ -559,8 +678,10 @@ wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 {
     wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") );
 
+#ifndef __WXGTK20__  // ???
     if ( M_FONTDATA->m_nativeFontInfo.GetXFontName().empty() )
         GetInternalFont();
+#endif
 
     return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
 }
@@ -569,6 +690,7 @@ bool wxFont::IsFixedWidth() const
 {
     wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
 
+#ifndef __WXGTK20__
     if ( M_FONTDATA->HasNativeFont() )
     {
         // the monospace fonts are supposed to have "M" in the spacing field
@@ -577,6 +699,7 @@ bool wxFont::IsFixedWidth() const
 
         return spacing.Upper() == _T('M');
     }
+#endif
 
     return wxFontBase::IsFixedWidth();
 }
@@ -588,7 +711,7 @@ bool wxFont::IsFixedWidth() const
 void wxFont::SetPointSize(int pointSize)
 {
     Unshare();
-
+        
     M_FONTDATA->SetPointSize(pointSize);
 }
 
@@ -681,7 +804,19 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
 
     wxCHECK_MSG( Ok(), font, wxT("invalid font") )
 
-    long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
+#ifdef __WXGTK20__
+    if (*this == wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT))
+    {
+        font = GtkGetDefaultGuiFont();
+    }
+    else
+    {
+        PangoFontDescription *font_description = GetNativeFontInfo()->description;
+        
+        font = gdk_font_from_description( font_description );
+    }
+#else
+    long int_scale = long(scale * 100.0 + 0.5); // key for fontlist
     int point_scale = (int)((M_FONTDATA->m_pointSize * 10 * int_scale) / 100);
 
     wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale);
@@ -728,6 +863,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
             M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
         }
     }
+#endif  // GTK 2.0
 
     // it's quite useless to make it a wxCHECK because we're going to crash
     // anyhow...
index 3444d52f6a70fbfcde8e1a48b6a9e6b91462b41c..4582a5c0022fbdaa5ebd77da726096c963615d9d 100644 (file)
@@ -74,6 +74,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
     }
 
     gchar *fontname = gtk_font_selection_dialog_get_font_name(fontdlg);
+    
+    // printf( "font %s\n", fontname );
 
     dialog->SetChosenFont(fontname);
 
@@ -145,6 +147,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
     gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
         GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this );
 
+#ifndef __WXGTK20__
     wxFont font = m_fontData.GetInitialFont();
     if( font.Ok() )
     {
@@ -167,6 +170,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
             wxFAIL_MSG(_T("font is ok but no native font info?"));
         }
     }
+#endif
 
     return TRUE;
 }
index 653aa52679f9afa8e763dca55e45704df8022c2f..4c5392c094c00b6195ff861c0688462ed95708d7 100644 (file)
 #include "wx/fontenum.h"
 #include "wx/fontutil.h"
 
+// ----------------------------------------------------------------------------
+// GTK 2.0
+// ----------------------------------------------------------------------------
+
+#ifdef __WXGTK20__
+
+#include "wx/gtk/private.h"
+
+extern GtkWidget *wxGetRootWindow();
+
+static int
+cmp_families (const void *a, const void *b)
+{
+  const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a);
+  const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b);
+  
+  return g_utf8_collate (a_name, b_name);
+}
+
+// I admit I don't yet understand encodings with Pango
+bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
+                                          bool fixedWidthOnly)
+{
+    if ( fixedWidthOnly )
+    {
+        OnFacename( wxT("monospaced") );
+    }
+    else
+    {
+        PangoFontFamily **families = NULL;
+        gint n_families = 0;
+        pango_context_list_families ( 
+            gtk_widget_get_pango_context( wxGetRootWindow() ),
+            &families, &n_families );
+        qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
+
+        for (int i=0; i<n_families; i++)
+        {
+            const gchar *name = pango_font_family_get_name( families[i] );
+            
+            wxString tmp( name, wxConvUTF8 );
+            OnFacename( tmp );
+        }
+    }
+    
+    return TRUE;
+}
+
+bool wxFontEnumerator::EnumerateEncodings(const wxString& family)
+{
+    return FALSE;
+}
+
+
+#else
+  // GTK 2.0
+
 #ifdef __VMS__ // Xlib.h for VMS is not (yet) compatible with C++
                // The resulting warnings are switched off here
 #pragma message disable nosimpint
@@ -107,12 +164,7 @@ static bool ProcessFamiliesFromFontList(wxFontEnumerator *This,
     {
         char *font = fonts[n];
 #if wxUSE_REGEX
-#if wxUSE_UNICODE
-        wxString sfont( wxConvLocal.cMB2WC( font ) );
-        if ( !re.Matches(sfont) )
-#else
         if ( !re.Matches(font) )
-#endif        
 #else // !wxUSE_REGEX
         if ( !wxString(font).Matches(wxT("-*-*-*-*-*-*-*-*-*-*-*-*-*-*")) )
 #endif // wxUSE_REGEX/!wxUSE_REGEX
@@ -125,11 +177,7 @@ static bool ProcessFamiliesFromFontList(wxFontEnumerator *This,
         char *family = dash + 1;
         dash = strchr(family, '-');
         *dash = '\0'; // !NULL because Matches() above succeeded
-#if wxUSE_UNICODE
-       wxString fam( wxConvLocal.cMB2WC( family ) );
-#else        
         wxString fam(family);
-#endif
 
         if ( families.Index(fam) == wxNOT_FOUND )
         {
@@ -279,3 +327,6 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family)
 #endif
     // wxUSE_NANOX
 }
+
+#endif
+   // __WXGTK20__
index 169ae54a1d72c99606087c1bd86d0022bddcdb2a..08a6f769c332dd80471b2d53f2bfca41dc1d4d12 100644 (file)
 #ifndef WX_PRECOMP
 #endif // PCH
 
+#include "wx/fontutil.h"
+#include "wx/fontmap.h"
+#include "wx/tokenzr.h"
+#include "wx/hash.h"
+#include "wx/module.h"
+
+#ifdef __WXGTK20__
+
+#include "wx/gtk/private.h"
+
+// ----------------------------------------------------------------------------
+// wxNativeFontInfo
+// ----------------------------------------------------------------------------
+
+void wxNativeFontInfo::Init()
+{
+    description = NULL;
+}
+
+int wxNativeFontInfo::GetPointSize() const
+{
+    return pango_font_description_get_size( description ) / PANGO_SCALE;
+}
+
+wxFontStyle wxNativeFontInfo::GetStyle() const
+{
+    wxFontStyle m_style = wxFONTSTYLE_NORMAL;
+
+    switch (pango_font_description_get_style( description ))
+    {
+        case PANGO_STYLE_NORMAL:
+            m_style = wxFONTSTYLE_NORMAL;
+            break;
+        case PANGO_STYLE_ITALIC:
+            m_style = wxFONTSTYLE_ITALIC;
+            break;
+        case PANGO_STYLE_OBLIQUE:
+            m_style = wxFONTSTYLE_SLANT;
+            break;
+    }
+    
+    return m_style;
+}
+
+wxFontWeight wxNativeFontInfo::GetWeight() const
+{
+    wxFontWeight m_weight = wxFONTWEIGHT_NORMAL;
+
+    switch (pango_font_description_get_weight( description ))
+    {
+        case PANGO_WEIGHT_ULTRALIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_LIGHT:
+            m_weight = wxFONTWEIGHT_LIGHT;
+            break;
+        case PANGO_WEIGHT_NORMAL:
+            m_weight = wxFONTWEIGHT_NORMAL;
+            break;
+        case PANGO_WEIGHT_BOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_ULTRABOLD:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+        case PANGO_WEIGHT_HEAVY:
+            m_weight = wxFONTWEIGHT_BOLD;
+            break;
+    }
+    
+    return m_weight;
+}
+
+bool wxNativeFontInfo::GetUnderlined() const
+{
+    return FALSE;
+}
+
+wxString wxNativeFontInfo::GetFaceName() const
+{
+    wxString tmp = wxGTK_CONV_BACK( pango_font_description_get_family( description ) );
+    
+    return tmp;
+}
+
+wxFontFamily wxNativeFontInfo::GetFamily() const
+{
+    return wxFONTFAMILY_SWISS;
+}
+
+wxFontEncoding wxNativeFontInfo::GetEncoding() const
+{
+    return wxFONTENCODING_SYSTEM;
+}
+
+bool wxNativeFontInfo::FromString(const wxString& s)
+{
+    if (description)
+        pango_font_description_free( description );
+
+    description = pango_font_description_from_string( wxGTK_CONV( s ) );
+
+    return TRUE;
+}
+
+wxString wxNativeFontInfo::ToString() const
+{
+    wxString tmp = wxGTK_CONV_BACK( pango_font_description_to_string( description ) );
+
+    return tmp;
+}
+
+bool wxNativeFontInfo::FromUserString(const wxString& s)
+{
+    return FromString( s );
+}
+
+wxString wxNativeFontInfo::ToUserString() const
+{
+    return ToString();
+}
+
+// ----------------------------------------------------------------------------
+// wxNativeEncodingInfo
+// ----------------------------------------------------------------------------
+
+bool wxNativeEncodingInfo::FromString(const wxString& s)
+{
+    return FALSE;
+}
+
+wxString wxNativeEncodingInfo::ToString() const
+{
+    return wxEmptyString;
+}
+
+bool wxTestFontEncoding(const wxNativeEncodingInfo& info)
+{
+    return TRUE;
+}
+
+bool wxGetNativeFontEncoding(wxFontEncoding encoding,
+                             wxNativeEncodingInfo *info)
+{
+    return FALSE;
+}
+
+#else 
+   // __WXGTK20__
+
 #ifdef __X__
     #ifdef __VMS__
         #pragma message disable nosimpint
     #include <gdk/gdk.h>
 #endif
 
-#include "wx/fontutil.h"
-#include "wx/fontmap.h"
-#include "wx/tokenzr.h"
-#include "wx/hash.h"
-#include "wx/module.h"
 
 // ----------------------------------------------------------------------------
 // private data
@@ -892,3 +1037,7 @@ void wxFontModule::OnExit()
 
     g_fontHash = (wxHashTable *)NULL;
 }
+
+#endif
+  // not GTK 2.0
+  
\ No newline at end of file