]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/font.cpp
[ 1508778 ] Fix for wxOwnerDrawnComboBox list selection rendering.
[wxWidgets.git] / src / x11 / font.cpp
index be44d65a0ddbdb73da7800aa7442350d4ab3b55d..9cbc28fa1e940031c0757a1f9638e3ead3785810 100644 (file)
@@ -9,6 +9,9 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 // ============================================================================
 // declarations
 // ============================================================================
 // ============================================================================
 // declarations
 // ============================================================================
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "font.h"
-#endif
-
 #ifdef __VMS
 #pragma message disable nosimpint
 #include "wx/vms_x_fix.h"
 #ifdef __VMS
 #pragma message disable nosimpint
 #include "wx/vms_x_fix.h"
 #pragma message enable nosimpint
 #endif
 
 #pragma message enable nosimpint
 #endif
 
-#include "wx/defs.h"
-#include "wx/string.h"
 #include "wx/font.h"
 #include "wx/font.h"
-#include "wx/gdicmn.h"
-#include "wx/utils.h"       // for wxGetDisplay()
+
+#ifndef WX_PRECOMP
+    #include "wx/string.h"
+    #include "wx/utils.h"       // for wxGetDisplay()
+    #include "wx/settings.h"
+    #include "wx/gdicmn.h"
+#endif
+
 #include "wx/fontutil.h"    // for wxNativeFontInfo
 #include "wx/tokenzr.h"
 #include "wx/fontutil.h"    // for wxNativeFontInfo
 #include "wx/tokenzr.h"
-#include "wx/settings.h"
 
 #include "wx/x11/private.h"
 
 
 #include "wx/x11/private.h"
 
@@ -79,10 +81,10 @@ wxXFont::wxXFont()
 
 wxXFont::~wxXFont()
 {
 
 wxXFont::~wxXFont()
 {
-    // TODO: why does freeing the font produce a segv???
-    // Note that XFreeFont wasn't called in wxWin 1.68 either.
-    // XFontStruct* fontStruct = (XFontStruct*) m_fontStruct;
-    //        XFreeFont((Display*) m_display, fontStruct);
+    // Freeing the font used to produce a segv, but
+    // appears to be OK now (bug fix in X11?)
+    XFontStruct* fontStruct = (XFontStruct*) m_fontStruct;
+    XFreeFont((Display*) m_display, fontStruct);
 }
 #endif
 
 }
 #endif
 
@@ -99,7 +101,7 @@ public:
                   int family = wxDEFAULT,
                   int style = wxDEFAULT,
                   int weight = wxDEFAULT,
                   int family = wxDEFAULT,
                   int style = wxDEFAULT,
                   int weight = wxDEFAULT,
-                  bool underlined = FALSE,
+                  bool underlined = false,
                   const wxString& faceName = wxEmptyString,
                   wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
 
                   const wxString& faceName = wxEmptyString,
                   wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
 
@@ -119,10 +121,10 @@ public:
     void SetStyle(int style);
     void SetWeight(int weight);
     void SetUnderlined(bool underlined);
     void SetStyle(int style);
     void SetWeight(int weight);
     void SetUnderlined(bool underlined);
-    void SetFaceName(const wxString& facename);
+    bool SetFaceName(const wxString& facename);
     void SetEncoding(wxFontEncoding encoding);
 
     void SetEncoding(wxFontEncoding encoding);
 
-    void SetNoAntiAliasing( bool no = TRUE ) { m_noAA = no; }
+    void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
     bool GetNoAntiAliasing() const { return m_noAA; }
 
     // and this one also modifies all the other font data fields
     bool GetNoAntiAliasing() const { return m_noAA; }
 
     // and this one also modifies all the other font data fields
@@ -202,7 +204,7 @@ void wxFontRefData::Init(int pointSize,
         case wxFONTFAMILY_TELETYPE:
            pango_font_description_set_family( m_nativeFontInfo.description, "monospace" );
            break;
         case wxFONTFAMILY_TELETYPE:
            pango_font_description_set_family( m_nativeFontInfo.description, "monospace" );
            break;
-        case wxFONTFAMILY_SWISS:
+        case wxFONTFAMILY_ROMAN:
            pango_font_description_set_family( m_nativeFontInfo.description, "serif" );
            break;
         default:
            pango_font_description_set_family( m_nativeFontInfo.description, "serif" );
            break;
         default:
@@ -217,7 +219,7 @@ void wxFontRefData::Init(int pointSize,
 
 void wxFontRefData::InitFromNative()
 {
 
 void wxFontRefData::InitFromNative()
 {
-    m_noAA = FALSE;
+    m_noAA = false;
 
 #if wxUSE_UNICODE
     // Get native info
 
 #if wxUSE_UNICODE
     // Get native info
@@ -277,7 +279,7 @@ void wxFontRefData::InitFromNative()
     }
 
     // Pango description are never underlined (?)
     }
 
     // Pango description are never underlined (?)
-    m_underlined = FALSE;
+    m_underlined = false;
 
     // Cannot we choose that
     m_encoding = wxFONTENCODING_SYSTEM;
 
     // Cannot we choose that
     m_encoding = wxFONTENCODING_SYSTEM;
@@ -347,7 +349,7 @@ void wxFontRefData::InitFromNative()
     }
 
     // X fonts are never underlined...
     }
 
     // X fonts are never underlined...
-    m_underlined = FALSE;
+    m_underlined = false;
 
     // deal with font encoding
     wxString
 
     // deal with font encoding
     wxString
@@ -501,9 +503,10 @@ void wxFontRefData::SetUnderlined(bool underlined)
     // the XLFD doesn't have "underlined" field anyhow
 }
 
     // the XLFD doesn't have "underlined" field anyhow
 }
 
-void wxFontRefData::SetFaceName(const wxString& facename)
+bool wxFontRefData::SetFaceName(const wxString& facename)
 {
     m_faceName = facename;
 {
     m_faceName = facename;
+    return true;
 }
 
 void wxFontRefData::SetEncoding(wxFontEncoding encoding)
 }
 
 void wxFontRefData::SetEncoding(wxFontEncoding encoding)
@@ -526,14 +529,8 @@ void wxFontRefData::SetNativeFontInfo(const wxNativeFontInfo& info)
 // wxFont
 // ----------------------------------------------------------------------------
 
 // wxFont
 // ----------------------------------------------------------------------------
 
-void wxFont::Init()
-{
-}
-
 wxFont::wxFont(const wxNativeFontInfo& info)
 {
 wxFont::wxFont(const wxNativeFontInfo& info)
 {
-    Init();
-
 #if wxUSE_UNICODE
     Create( info.GetPointSize(),
             info.GetFamily(),
 #if wxUSE_UNICODE
     Create( info.GetPointSize(),
             info.GetFamily(),
@@ -560,7 +557,7 @@ bool wxFont::Create(int pointSize,
     m_refData = new wxFontRefData(pointSize, family, style, weight,
                                   underlined, faceName, encoding);
 
     m_refData = new wxFontRefData(pointSize, family, style, weight,
                                   underlined, faceName, encoding);
 
-    return TRUE;
+    return true;
 }
 
 #if !wxUSE_UNICODE
 }
 
 #if !wxUSE_UNICODE
@@ -570,7 +567,7 @@ bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
     if( !fontname )
     {
         *this = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT);
     if( !fontname )
     {
         *this = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT);
-        return TRUE;
+        return true;
     }
 
     m_refData = new wxFontRefData();
     }
 
     m_refData = new wxFontRefData();
@@ -663,9 +660,9 @@ bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
         }
         //else: unknown encoding - may be give a warning here?
         else
         }
         //else: unknown encoding - may be give a warning here?
         else
-            return FALSE;
+            return false;
     }
     }
-    return TRUE;
+    return true;
 }
 #endif // !wxUSE_UNICODE
 
 }
 #endif // !wxUSE_UNICODE
 
@@ -705,7 +702,7 @@ int wxFont::GetPointSize() const
 
 wxString wxFont::GetFaceName() const
 {
 
 wxString wxFont::GetFaceName() const
 {
-    wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") );
+    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
 
     return M_FONTDATA->m_faceName;
 }
 
     return M_FONTDATA->m_faceName;
 }
@@ -733,7 +730,7 @@ int wxFont::GetWeight() const
 
 bool wxFont::GetUnderlined() const
 {
 
 bool wxFont::GetUnderlined() const
 {
-    wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
 
     return M_FONTDATA->m_underlined;
 }
 
     return M_FONTDATA->m_underlined;
 }
@@ -767,13 +764,13 @@ const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 
 bool wxFont::IsFixedWidth() const
 {
 
 bool wxFont::IsFixedWidth() const
 {
-    wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
 
 #if wxUSE_UNICODE
    return wxFontBase::IsFixedWidth();
 #else
     // Robert, is this right? HasNativeFont doesn't exist.
 
 #if wxUSE_UNICODE
    return wxFontBase::IsFixedWidth();
 #else
     // Robert, is this right? HasNativeFont doesn't exist.
-    if ( TRUE )
+    if ( true )
     //    if ( M_FONTDATA->HasNativeFont() )
     {
         // the monospace fonts are supposed to have "M" in the spacing field
     //    if ( M_FONTDATA->HasNativeFont() )
     {
         // the monospace fonts are supposed to have "M" in the spacing field
@@ -820,11 +817,12 @@ void wxFont::SetWeight(int weight)
     M_FONTDATA->SetWeight(weight);
 }
 
     M_FONTDATA->SetWeight(weight);
 }
 
-void wxFont::SetFaceName(const wxString& faceName)
+bool wxFont::SetFaceName(const wxString& faceName)
 {
     Unshare();
 
 {
     Unshare();
 
-    M_FONTDATA->SetFaceName(faceName);
+    return M_FONTDATA->SetFaceName(faceName) &&
+        wxFontBase::SetFaceName(faceName);
 }
 
 void wxFont::SetUnderlined(bool underlined)
 }
 
 void wxFont::SetUnderlined(bool underlined)
@@ -883,6 +881,11 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
         node = node->GetNext();
     }
 
         node = node->GetNext();
     }
 
+    wxString xFontName = M_FONTDATA->m_nativeFontInfo.GetXFontName();
+    if (xFontName == "-*-*-*-*-*--*-*-*-*-*-*-*-*")
+      // wxFont constructor not called with native font info parameter => take M_FONTDATA values
+      xFontName.Clear();
+
     // not found, create a new one
     XFontStruct *font = (XFontStruct *)
                         wxLoadQueryNearestFont(pointSize,
     // not found, create a new one
     XFontStruct *font = (XFontStruct *)
                         wxLoadQueryNearestFont(pointSize,
@@ -891,7 +894,8 @@ wxXFont* wxFont::GetInternalFont(double scale, WXDisplay* display) const
                                                M_FONTDATA->m_weight,
                                                M_FONTDATA->m_underlined,
                                                wxT(""),
                                                M_FONTDATA->m_weight,
                                                M_FONTDATA->m_underlined,
                                                wxT(""),
-                                               M_FONTDATA->m_encoding);
+                                               M_FONTDATA->m_encoding,
+                                               & xFontName);
 
     if ( !font )
     {
 
     if ( !font )
     {