]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/font.cpp
Fox around a bug in GTK's GtkNotebook
[wxWidgets.git] / src / gtk / font.cpp
index 119b9cc83ce96797f5bfc731653a6a3265ab36a5..c521e7b3b34e1b045958ad1cabc1abce8a49b9f6 100644 (file)
@@ -2,9 +2,9 @@
 // Name:        font.cpp
 // Purpose:
 // Author:      Robert Roebling
-// Id:          $id$
+// Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
-// Licence:    wxWindows licence
+// Licence:       wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 
 #include "wx/font.h"
 #include "wx/utils.h"
+#include "wx/log.h"
 #include <strings.h>
 
+#include "gdk/gdk.h"
+
 //-----------------------------------------------------------------------------
 // local data
 //-----------------------------------------------------------------------------
 
+/*
 extern wxFontNameDirectory *wxTheFontNameDirectory;
+*/
 
 //-----------------------------------------------------------------------------
 // wxFont
@@ -27,53 +32,59 @@ extern wxFontNameDirectory *wxTheFontNameDirectory;
 
 class wxFontRefData: public wxObjectRefData
 {
-  public:
-  
-    wxFontRefData(void);
-    ~wxFontRefData(void);
-    wxList   m_scaled_xfonts;
-    int      m_pointSize;
-    int      m_family, m_style, m_weight;
-    bool     m_underlined;
-    int      m_fontId;
-    char*    m_faceName;
-     
-    bool     m_byXFontName;
-    GdkFont *m_font;
-    
+public:
+
+    wxFontRefData();
+    wxFontRefData( const wxFontRefData& data );
+    ~wxFontRefData();
+
+    wxList    m_scaled_xfonts;
+    int       m_pointSize;
+    int       m_family, m_style, m_weight;
+    bool      m_underlined;
+    wxString  m_faceName;
+
+    bool      m_byXFontName;
+    GdkFont  *m_font;
+
     friend wxFont;
 };
 
-wxFontRefData::wxFontRefData(void) : m_scaled_xfonts(wxKEY_INTEGER)
-{
-  m_byXFontName = FALSE;
-  m_pointSize = 12;
-  m_family = wxSWISS;
-  m_style = wxNORMAL;
-  m_weight = wxNORMAL;
-  m_underlined = FALSE;
-  m_fontId = 0;
-  m_faceName = (char *) NULL;
-  m_font = (GdkFont *) NULL;
-}
-
-wxFontRefData::~wxFontRefData(void)
-{
-  wxNode *node = m_scaled_xfonts.First();
-  while (node) 
-  {
-    GdkFont *font = (GdkFont*)node->Data();
-    wxNode *next = node->Next();
-    gdk_font_unref( font );
-    node = next;
-  }
-  if (m_faceName) 
-  {
-    delete m_faceName;
-    m_faceName = (char *) NULL;
-  }
-  if (m_font) gdk_font_unref( m_font );
+wxFontRefData::wxFontRefData() : m_scaled_xfonts(wxKEY_INTEGER)
+{
+    m_byXFontName = FALSE;
+    m_pointSize = 12;
+    m_family = wxSWISS;
+    m_style = wxNORMAL;
+    m_weight = wxNORMAL;
+    m_underlined = FALSE;
+    m_font = (GdkFont *) NULL;
+}
+
+wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER)
+{
+    m_byXFontName = FALSE;
+    m_pointSize = data.m_pointSize;
+    m_family = data.m_family;
+    m_style = data.m_style;
+    m_weight = data.m_weight;
+    m_underlined = data.m_underlined;
+    m_faceName = data.m_faceName;
+    m_font = (GdkFont *) NULL;
+    if (data.m_font) m_font = gdk_font_ref( data.m_font );
+}
+
+wxFontRefData::~wxFontRefData()
+{
+    wxNode *node = m_scaled_xfonts.First();
+    while (node)
+    {
+        GdkFont *font = (GdkFont*)node->Data();
+        wxNode *next = node->Next();
+        gdk_font_unref( font );
+        node = next;
+    }
+    if (m_font) gdk_font_unref( m_font );
 }
 
 //-----------------------------------------------------------------------------
@@ -82,344 +93,378 @@ wxFontRefData::~wxFontRefData(void)
 
 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 
-wxFont::wxFont(void)
+wxFont::wxFont()
 {
-  if (wxTheFontList) wxTheFontList->Append( this );
+    if (wxTheFontList) wxTheFontList->Append( this );
 }
 
 wxFont::wxFont( char *xFontName )
 {
-  if (!xFontName) return;
-  
-  m_refData = new wxFontRefData();
-  
-  M_FONTDATA->m_byXFontName = TRUE;
-  M_FONTDATA->m_font = gdk_font_load( xFontName );
+    if (!xFontName) return;
+
+    m_refData = new wxFontRefData();
+
+    M_FONTDATA->m_byXFontName = TRUE;
+    M_FONTDATA->m_font = gdk_font_load( xFontName );
 }
 
-wxFont::wxFont(int PointSize, int FontIdOrFamily, int Style, int Weight,
-              bool Underlined, const char* Face)
+wxFont::wxFont( int pointSize, int family, int style, int weight, bool underlined, const wxString& face )
 {
-  m_refData = new wxFontRefData();
+    m_refData = new wxFontRefData();
+
+    if (family == wxDEFAULT) 
+        M_FONTDATA->m_family = wxSWISS;
+    else
+        M_FONTDATA->m_family = family;
+    
+    if (!face.IsEmpty()) M_FONTDATA->m_faceName = face;
+
+    if (style == wxDEFAULT) 
+        M_FONTDATA->m_style = wxNORMAL;
+    else
+        M_FONTDATA->m_style = style;
+    
+    if (weight == wxDEFAULT) 
+        M_FONTDATA->m_weight = wxNORMAL;
+    else
+        M_FONTDATA->m_weight = weight;
+    
+    if (pointSize == wxDEFAULT) 
+        M_FONTDATA->m_pointSize = 12;
+    else
+        M_FONTDATA->m_pointSize = pointSize;
+    
+    M_FONTDATA->m_underlined = underlined;
+
+    if (wxTheFontList) wxTheFontList->Append( this );
   
-  if ((M_FONTDATA->m_faceName = (Face) ? copystring(Face) : (char*)NULL) ) 
-  {
-    M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( Face, FontIdOrFamily );
-    M_FONTDATA->m_family  = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
-  }
-  else 
-  {
-    M_FONTDATA->m_fontId = FontIdOrFamily;
-    M_FONTDATA->m_family  = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
-  }
-  if (Style == wxDEFAULT) Style = wxSWISS;
-  M_FONTDATA->m_style = Style;
-  if (Weight == wxDEFAULT) Weight = wxNORMAL;
-  M_FONTDATA->m_weight = Weight;
-  if (PointSize == wxDEFAULT) PointSize = 10;
-  M_FONTDATA->m_pointSize = PointSize;
-  M_FONTDATA->m_underlined = Underlined;
-
-  if (wxTheFontList) wxTheFontList->Append( this );
-}
-
-wxFont::wxFont(int PointSize, const char *Face, int Family, int Style, 
-              int Weight, bool Underlined)
-{
-  m_refData = new wxFontRefData();
-
-  M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( Face, Family );
-  M_FONTDATA->m_faceName = (Face) ? copystring(Face) : (char*)NULL;
-  M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( M_FONTDATA->m_fontId );
-  M_FONTDATA->m_style = Style;
-  M_FONTDATA->m_weight = Weight;
-  M_FONTDATA->m_pointSize = PointSize;
-  M_FONTDATA->m_underlined = Underlined;
-
-  if (wxTheFontList) wxTheFontList->Append( this );
 }
 
 wxFont::wxFont( const wxFont& font )
-{ 
-  Ref( font ); 
-  
-  if (wxTheFontList) wxTheFontList->Append( this );
-}
+{
+    Ref( font );
 
-wxFont::wxFont( const wxFont* font ) 
-{ 
-  UnRef(); 
-  if (font) Ref( *font ); 
-  
-  if (wxTheFontList) wxTheFontList->Append( this );
+    if (wxTheFontList) wxTheFontList->Append( this );
 }
 
-wxFont::~wxFont(void)
+wxFont::~wxFont()
 {
-  if (wxTheFontList) wxTheFontList->DeleteObject( this );
+    if (wxTheFontList) wxTheFontList->DeleteObject( this );
 }
 
-wxFont& wxFont::operator = ( const wxFont& font ) 
-{ 
-  if (*this == font) return (*this); 
-  Ref( font ); 
-  return *this; 
+wxFont& wxFont::operator = ( const wxFont& font )
+{
+    if (*this == font) return (*this);
+    Ref( font );
+    return *this;
 }
 
-bool wxFont::operator == ( const wxFont& font ) 
-{ 
-  return m_refData == font.m_refData; 
+bool wxFont::operator == ( const wxFont& font )
+{
+    return m_refData == font.m_refData;
 }
 
-bool wxFont::operator != ( const wxFont& font ) 
-{ 
-  return m_refData != font.m_refData; 
+bool wxFont::operator != ( const wxFont& font )
+{
+    return m_refData != font.m_refData;
 }
 
 bool wxFont::Ok() const
 {
-  return (m_refData != NULL);
+    return (m_refData != NULL);
 }
 
-int wxFont::GetPointSize(void) const
+int wxFont::GetPointSize() const
 {
-  if (!Ok()) 
-  {
-    wxFAIL_MSG( "invalid font" );
-    return 0;
-  }
-  
-  return M_FONTDATA->m_pointSize;
+    wxCHECK_MSG( Ok(), 0, _T("invalid font") );
+
+    return M_FONTDATA->m_pointSize;
 }
 
-wxString wxFont::GetFaceString(void) const
+wxString wxFont::GetFaceName() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-     return "";
-  }
-  
-  wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
-  return s;
+    wxCHECK_MSG( Ok(), _T(""), _T("invalid font") );
+
+    return M_FONTDATA->m_faceName;
 }
 
-wxString wxFont::GetFaceName(void) const
+int wxFont::GetFamily() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-     return "";
-  }
-  
-  wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
-  return s; 
+    wxCHECK_MSG( Ok(), 0, _T("invalid font") );
+
+    return M_FONTDATA->m_family;
 }
 
-int wxFont::GetFamily(void) const
+wxString wxFont::GetFamilyString() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-     return 0;
-  }
-  
-  return M_FONTDATA->m_family;
+    wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") );
+
+    switch (M_FONTDATA->m_family)
+    {
+        case wxDECORATIVE:   return wxString(_T("wxDECORATIVE"));
+        case wxROMAN:        return wxString(_T("wxROMAN"));
+        case wxSCRIPT:       return wxString(_T("wxSCRIPT"));
+        case wxSWISS:        return wxString(_T("wxSWISS"));
+        case wxMODERN:       return wxString(_T("wxMODERN"));
+        case wxTELETYPE:     return wxString(_T("wxTELETYPE"));
+        default:             return _T("wxDEFAULT");
+    }
+
+    return "wxDEFAULT";
 }
 
-wxString wxFont::GetFamilyString(void) const
+int wxFont::GetStyle() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return "wxDEFAULT";
-  }
-  
-  switch (M_FONTDATA->m_family)
-  {
-    case wxDECORATIVE:   return wxString("wxDECORATIVE");
-    case wxROMAN:        return wxString("wxROMAN");
-    case wxSCRIPT:       return wxString("wxSCRIPT");
-    case wxSWISS:        return wxString("wxSWISS");
-    case wxMODERN:       return wxString("wxMODERN");
-    case wxTELETYPE:     return wxString("wxTELETYPE");
-    default:             return "wxDEFAULT";
-  }
+    wxCHECK_MSG( Ok(), 0, _T("invalid font") );
 
-  return "wxDEFAULT";
+    return M_FONTDATA->m_style;
 }
 
-int wxFont::GetFontId(void) const
+wxString wxFont::GetStyleString() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return 0;
-  }
-  
-  return M_FONTDATA->m_fontId; // stub
+    wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") );
+
+    switch (M_FONTDATA->m_style)
+    {
+        case wxNORMAL:   return wxString(_T("wxNORMAL"));
+        case wxSLANT:    return wxString(_T("wxSLANT"));
+        case wxITALIC:   return wxString(_T("wxITALIC"));
+        default:         return wxString(_T("wxDEFAULT"));
+    }
+
+    return wxString(_T("wxDEFAULT"));
 }
 
-int wxFont::GetStyle(void) const
+int wxFont::GetWeight() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return 0;
-  }
-  
-  return M_FONTDATA->m_style;
+    wxCHECK_MSG( Ok(), 0, _T("invalid font") );
+
+    return M_FONTDATA->m_weight;
 }
 
-wxString wxFont::GetStyleString(void) const
+wxString wxFont::GetWeightString() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return "wxDEFAULT";
-  }
-  
-  switch (M_FONTDATA->m_style)
-  {
-    case wxNORMAL:   return wxString("wxNORMAL");
-    case wxSLANT:    return wxString("wxSLANT");
-    case wxITALIC:   return wxString("wxITALIC");
-    default:         return wxString("wxDEFAULT");
-  }
-    
-  return wxString("wxDEFAULT");
+    wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") );
+
+    switch (M_FONTDATA->m_weight)
+    {
+        case wxNORMAL:   return wxString(_T("wxNORMAL"));
+        case wxBOLD:     return wxString(_T("wxBOLD"));
+        case wxLIGHT:    return wxString(_T("wxLIGHT"));
+        default:         return wxString(_T("wxDEFAULT"));
+    }
+
+    return wxString(_T("wxDEFAULT"));
 }
 
-int wxFont::GetWeight(void) const
+bool wxFont::GetUnderlined() const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return 0;
-  }
+    wxCHECK_MSG( Ok(), FALSE, _T("invalid font") );
 
-  return M_FONTDATA->m_weight;
+    return M_FONTDATA->m_underlined;
 }
 
-wxString wxFont::GetWeightString(void) const
+void wxFont::Unshare()
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return "wxDEFAULT";
-  }
-
-  switch (M_FONTDATA->m_weight)
-  {
-    case wxNORMAL:   return wxString("wxNORMAL");
-    case wxBOLD:     return wxString("wxBOLD");
-    case wxLIGHT:    return wxString("wxLIGHT");
-    default:         return wxString("wxDEFAULT");
-  }
-  
-  return wxString("wxDEFAULT");
+    if (!m_refData)
+    {
+       m_refData = new wxFontRefData();
+    }
+    else
+    {
+       wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData);
+       UnRef();
+       m_refData = ref;
+    }
 }
 
-bool wxFont::GetUnderlined(void) const
+void wxFont::SetPointSize(int pointSize)
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return FALSE;
-  }
-  
-  return M_FONTDATA->m_underlined;
+    Unshare();
+
+    M_FONTDATA->m_pointSize = pointSize;
+}
+
+void wxFont::SetFamily(int family)
+{
+    Unshare();
+
+    M_FONTDATA->m_family = family;
+}
+
+void wxFont::SetStyle(int style)
+{
+    Unshare();
+
+    M_FONTDATA->m_style = style;
+}
+
+void wxFont::SetWeight(int weight)
+{
+    Unshare();
+
+    M_FONTDATA->m_weight = weight;
+}
+
+void wxFont::SetFaceName(const wxString& faceName)
+{
+    Unshare();
+
+    M_FONTDATA->m_faceName = faceName;
+}
+
+void wxFont::SetUnderlined(bool underlined)
+{
+    Unshare();
+
+    M_FONTDATA->m_underlined = underlined;
 }
 
 //-----------------------------------------------------------------------------
 // get internal representation of font
 //-----------------------------------------------------------------------------
 
-// local help function
-static GdkFont *wxLoadQueryNearestFont(int point_size, int fontid,
-                                          int style, int weight, 
-                                          bool underlined);
+static GdkFont *wxLoadQueryNearestFont( int point_size, int family, int style, int weight, 
+                                        bool underlined, const wxString &facename );
 
-GdkFont *wxFont::GetInternalFont(float scale) const
+GdkFont *wxFont::GetInternalFont( float scale ) const
 {
-  if (!Ok())
-  {
-    wxFAIL_MSG( "invalid font" );
-    return (GdkFont*) NULL;
-  }
-  
-  if (M_FONTDATA->m_byXFontName) return M_FONTDATA->m_font;
-   
-  long int_scale = long(scale * 100.0 + 0.5); // key for fontlist
-  int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
-  GdkFont *font = (GdkFont *) NULL;
-
-  wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale);
-  if (node) 
-  {
-    font = (GdkFont*)node->Data(); 
-  } 
-  else 
-  {
-     font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_fontId, M_FONTDATA->m_style,
-                                   M_FONTDATA->m_weight, M_FONTDATA->m_underlined );
-     M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
-  }
-  if (!font)
-       printf("could not load any font");
-//     wxError("could not load any font", "wxFont");
-  return font;
+    if (!Ok())
+    {
+        wxFAIL_MSG( _T("invalid font") );
+        return (GdkFont*) NULL;
+    }
+
+    /* short cut if the special X font constructor has been used */
+    if (M_FONTDATA->m_byXFontName) return M_FONTDATA->m_font;
+
+    long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
+    int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
+    GdkFont *font = (GdkFont *) NULL;
+
+    wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale);
+    if (node)
+    {
+        font = (GdkFont*)node->Data();
+    }
+    else
+    {
+/*
+        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))
+        {
+            font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" );
+        }
+        else
+*/
+        {
+            font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_family, M_FONTDATA->m_style,
+                    M_FONTDATA->m_weight, M_FONTDATA->m_underlined, M_FONTDATA->m_faceName );
+        }
+        M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
+    }
+    
+    if (!font)
+    {
+        wxLogError(_T("could not load any font"));
+    }
+       
+    return font;
 }
 
 //-----------------------------------------------------------------------------
 // local utilities to find a X font
 //-----------------------------------------------------------------------------
 
-static GdkFont *wxLoadQueryFont(int point_size, int fontid, int style,
-                                   int weight, bool WXUNUSED(underlined))
+static GdkFont*wxLoadQueryFont( int pointSize, int family, int style, int weight, 
+                                bool underlined, const wxString &facename )
 {
-    char buffer[512];
-    char *name = wxTheFontNameDirectory->GetScreenName( fontid, weight, style );
-
-    if (!name)
-       name = "-*-*-*-*-*-*-*-%d-*-*-*-*-*-*";
-    sprintf(buffer, name, point_size);
-
-    return gdk_font_load( buffer );
+    wxChar *xfamily = (wxChar*) NULL;
+    wxChar *xstyle = (wxChar*) NULL;
+    wxChar *xweight = (wxChar*) NULL;
+    
+    switch (family)
+    {
+        case wxDECORATIVE: xfamily = _T("lucida"); break;
+        case wxROMAN:      xfamily = _T("times");  break;
+        case wxMODERN:     xfamily = _T("courier"); break;
+        case wxSWISS:      xfamily = _T("helvetica"); break;
+       case wxTELETYPE:   xfamily = _T("lucidatypewriter"); break;
+       case wxSCRIPT:     xfamily = _T("utopia"); break;
+        default:           xfamily = _T("*");
+    }
+    
+    if (!facename.IsEmpty())
+    {
+        wxSprintf( wxBuffer, _T("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"), facename.c_str() );
+        GdkFont *test = gdk_font_load( wxConv_libc.cWX2MB(wxBuffer) );
+        if (test)
+       {
+           gdk_font_unref( test );
+           xfamily = WXSTRINGCAST facename;
+       }
+    }
+    
+    switch (style)
+    {
+        case wxITALIC:     xstyle = _T("i"); break;
+        case wxSLANT:      xstyle = _T("o"); break;
+        case wxNORMAL:     xstyle = _T("r"); break;
+        default:           xstyle = _T("*"); break;
+    }
+    switch (weight)
+    {
+        case wxBOLD:       xweight = _T("bold"); break;
+        case wxLIGHT:
+        case wxNORMAL:     xweight = _T("medium"); break;
+        default:           xweight = _T("*"); break;
+    }
+    
+    wxSprintf( wxBuffer, _T("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-*-*"),
+        xfamily, xweight, xstyle, pointSize);
+    
+    return gdk_font_load( wxConv_libc.cWX2MB(wxBuffer) );
 }
 
-static GdkFont *wxLoadQueryNearestFont(int point_size, int fontid,
-                                          int style, int weight,
-                                          bool underlined)
+static GdkFont *wxLoadQueryNearestFont( int point_size, int family, int style, int weight, 
+                                       bool underlined, const wxString &facename )
 {
-    GdkFont *font;
+    GdkFont *font = wxLoadQueryFont( point_size, family, style, weight, underlined, facename );
 
-    font = wxLoadQueryFont( point_size, fontid, style, weight, underlined );
+    if (!font) 
+    {
+        /* search up and down by stepsize 10 */
+        int max_size = point_size + 20 * (1 + (point_size/180));
+        int min_size = point_size - 20 * (1 + (point_size/180));
 
-    if (!font) {
-       // search up and down by stepsize 10
-       int max_size = point_size + 20 * (1 + (point_size/180));
-       int min_size = point_size - 20 * (1 + (point_size/180));
-       int i;
+        int i;
 
-       // Search for smaller size (approx.)
-       for (i=point_size-10; !font && i >= 10 && i >= min_size; i -= 10)
-           font = wxLoadQueryFont(i, fontid, style, weight, underlined);
-       // Search for larger size (approx.)
-       for (i=point_size+10; !font && i <= max_size; i += 10)
-           font = wxLoadQueryFont(i, fontid, style, weight, underlined);
-       // Try default family
-       if (!font && fontid != wxDEFAULT)
-           font = wxLoadQueryFont(point_size, wxDEFAULT, style, 
-                                  weight, underlined);
-       // Bogus font
-       if (!font)
-           font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
-                                   underlined);
+        /* Search for smaller size (approx.) */
+        for (i=point_size-10; !font && i >= 10 && i >= min_size; i -= 10)
+            font = wxLoadQueryFont(i, family, style, weight, underlined, facename );
+
+        /* Search for larger size (approx.) */
+        for (i=point_size+10; !font && i <= max_size; i += 10)
+            font = wxLoadQueryFont( i, family, style, weight, underlined, facename );
+
+        /* Try default family */
+        if (!font && family != wxDEFAULT)
+            font = wxLoadQueryFont( point_size, wxDEFAULT, style, weight, underlined, facename );
+
+        /* Bogus font */
+        if (!font)
+            font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, underlined, facename );
     }
+    
     return font;
 }
 
+/*
+
 //-----------------------------------------------------------------------------
 // face names and index functions
 //-----------------------------------------------------------------------------
@@ -443,7 +488,7 @@ static char *font_defaults[] = {
     "AfmTimes", "Times",
     "AfmHelvetica", "Helv",
     "AfmCourier", "Cour",
-    
+
     "Afm___", "${AfmTimes,$[weight],$[style]}",
 
     "AfmTimes__", "${AfmTimes}${Afm$[weight]}${Afm$[style]}",
@@ -466,7 +511,7 @@ static char *font_defaults[] = {
     "PostScriptBoldStraight", "-Bold",
     "PostScriptBoldItalic", "-BoldOblique",
     "PostScriptBoldSlant", "-BoldOblique",
-    
+
 #if WX_NORMALIZED_PS_FONTS
     "PostScript___", "${PostScriptTimes,$[weight],$[style]}",
 #else
@@ -500,7 +545,8 @@ static char *font_defaults[] = {
     "ScreenItalic", "i",
     "ScreenSlant", "o",
 
-    "ScreenDefaultBase", "misc-fixed",
+    "ScreenDefaultBase", "*-times",
+    
     "ScreenRomanBase", "*-times",
     "ScreenDecorativeBase", "*-helvetica",
     "ScreenModernBase", "*-courier",
@@ -509,7 +555,7 @@ static char *font_defaults[] = {
     "ScreenScriptBase", "*-zapfchancery",
 
     "ScreenStdSuffix", "-${Screen$[weight]}-${Screen$[style]}"
-    "-normal-*-*-%d-*-*-*-*-*-*",
+        "-normal-*-*-%d-*-*-*-*-*-*",
 
     "Screen___",
     "-${ScreenDefaultBase}${ScreenStdSuffix}",
@@ -533,21 +579,23 @@ enum {wxSTYLE_NORMAL,  wxSTYLE_ITALIC, wxSTYLE_SLANT,  wxNUM_STYLES};
 
 static int WCoordinate(int w)
 {
-    switch (w) {
-    case wxBOLD:   return wxWEIGHT_BOLD;
-    case wxLIGHT:  return wxWEIGHT_LIGHT;
-    case wxNORMAL:
-    default:       return wxWEIGHT_NORMAL;
+    switch (w) 
+    {
+        case wxBOLD:   return wxWEIGHT_BOLD;
+        case wxLIGHT:  return wxWEIGHT_LIGHT;
+        case wxNORMAL:
+        default:       return wxWEIGHT_NORMAL;
     }
 };
 
 static int SCoordinate(int s)
 {
-    switch (s) {
-    case wxITALIC: return wxSTYLE_ITALIC;
-    case wxSLANT:  return wxSTYLE_SLANT;
-    case wxNORMAL:
-    default:       return wxSTYLE_NORMAL;
+    switch (s) 
+    {
+        case wxITALIC: return wxSTYLE_ITALIC;
+        case wxSLANT:  return wxSTYLE_SLANT;
+        case wxNORMAL:
+        default:       return wxSTYLE_NORMAL;
     }
 };
 
@@ -555,68 +603,97 @@ static int SCoordinate(int s)
 // wxSuffixMap
 //-----------------------------------------------------------------------------
 
-class wxSuffixMap {
+class wxSuffixMap 
+{
 public:
-    ~wxSuffixMap(void);
+    ~wxSuffixMap();
 
     inline char *GetName(int weight, int style)
     {
-       return ( map [WCoordinate(weight)] [SCoordinate(style)] );
+        return ( map [WCoordinate(weight)] [SCoordinate(style)] );
     }
 
     char *map[wxNUM_WEIGHTS][wxNUM_STYLES];
     void Initialize(const char *, const char *);
 };
 
-//#if !USE_RESOURCES
-#define wxGetResource(a, b, c) 0
-//#endif
-
 static void SearchResource(const char *prefix, const char **names, int count, char **v)
 {
     int k, i, j;
     char resource[1024], **defaults, *internal;
 
     k = 1 << count;
-    
+
     *v = (char *) NULL;
     internal = (char *) NULL;
 
-    for (i = 0; i < k; i++) {
-       strcpy(resource, prefix);
-       for (j = 0; j < count; j++) {
-           if (!(i & (1 << j)))
-               strcat(resource, names[j]);
-           else
-               strcat(resource, "_");
+    for (i = 0; i < k; i++) 
+    {
+        strcpy(resource, prefix);
+        for (j = 0; j < count; j++) 
+       {
+           // upon failure to find a matching fontname 
+           //   in the default fonts above, we substitute more
+           //   and more values by _ so that at last ScreenMyFontBoldNormal
+           //   would turn into Screen___ and this will then get
+           //   converted to -${ScreenDefaultBase}${ScreenStdSuffix}
+       
+            if (!(i & (1 << j)))
+                strcat(resource, names[j]);
+            else
+                strcat(resource, "_");
+        }
+       
+        // we previously search the Xt-resources here 
+
+        if (!internal) 
+       {
+            defaults = font_defaults;
+            while (*defaults) 
+           {
+                if (!strcmp(*defaults, resource)) 
+               {
+                    internal = defaults[1];
+                    break;
+                }
+                defaults += 2;
+            }
+        }
+    }
+    
+    if (internal)
+    {
+        if ((strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 0) &&
+           (strcmp(names[0], "Default") != 0))
+       {
+           // we did not find any font name in the standard list.
+           //   this can (hopefully does) mean that someone supplied
+           //   the facename in the wxFont constructor so we insert
+           //   it here 
+       
+           strcpy( resource,"-*-" );                  // any producer               
+           strcat( resource, names[0] );              // facename                   
+           strcat( resource, "${ScreenStdSuffix}" );  // add size params later on   
+           *v = copystring(resource);
        }
-       if (wxGetResource(wxAPP_CLASS, (char *)resource, v))
-           return;
-       if (!internal) {
-           defaults = font_defaults;
-           while (*defaults) {
-               if (!strcmp(*defaults, resource)) {
-                   internal = defaults[1];
-                   break;
-               }
-               defaults += 2;
-           }
+       else
+       {
+            *v = copystring(internal);
        }
     }
-    if (internal)
-       *v = copystring(internal);
 }
 
-wxSuffixMap::~wxSuffixMap(void)
+wxSuffixMap::~wxSuffixMap()
 {
     int k, j;
 
     for (k = 0; k < wxNUM_WEIGHTS; ++k)
-       for (j = 0; j < wxNUM_STYLES; ++j)
-           if (map[k][j]) {
-               delete[] map[k][j];
-               map[k][j] = (char *) NULL;
-           }
+        for (j = 0; j < wxNUM_STYLES; ++j)
+            if (map[k][j]) 
+           {
+                delete[] map[k][j];
+                map[k][j] = (char *) NULL;
+            }
 }
 
 void wxSuffixMap::Initialize(const char *resname, const char *devresname)
@@ -626,101 +703,112 @@ void wxSuffixMap::Initialize(const char *resname, const char *devresname)
     int i, j, k;
     const char *names[3];
 
-    for (k = 0; k < wxNUM_WEIGHTS; k++) {
-       switch (k) {
-       case wxWEIGHT_NORMAL: weight = "Medium"; break;
-       case wxWEIGHT_LIGHT:  weight = "Light"; break;
-       case wxWEIGHT_BOLD:
-       default:              weight = "Bold";
-       }
-       for (j = 0; j < wxNUM_STYLES; j++) {
-           switch (j) {
-           case wxSTYLE_NORMAL: style = "Straight"; break;
-           case wxSTYLE_ITALIC: style = "Italic"; break;
-           case wxSTYLE_SLANT:
-           default:             style = "Slant";
-           }
-           names[0] = resname;
-           names[1] = weight;
-           names[2] = style;
-
-           SearchResource(devresname, names, 3, &v);
-
-           /* Expand macros in the found string: */
-       found:
-           int len, closer = 0, startpos = 0;
-           
-           len = (v ? strlen(v) : 0);
-           for (i = 0; i < len; i++) {
-               if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) {
-                   startpos = i;
-                   closer   = (v[i+1] == '[') ? ']' : '}';
-                   ++i;
-               } else if (v[i] == closer) {
-                   int newstrlen;
-                   const char *r = (char *) NULL; bool delete_r = FALSE;
-                   char *name;
-         
-                   name = v + startpos + 2;
-                   v[i] = 0;
-
-                   if (closer == '}') {
-                       int i, count, len;
-                       char **names;
-
-                       for (i = 0, count = 1; name[i]; i++)
-                           if (name[i] == ',')
-                               count++;
+    for (k = 0; k < wxNUM_WEIGHTS; k++) 
+    {
+        switch (k) 
+       {
+            case wxWEIGHT_NORMAL: weight = "Medium"; break;
+            case wxWEIGHT_LIGHT:  weight = "Light"; break;
+            case wxWEIGHT_BOLD:
+            default:              weight = "Bold";
+        }
+        for (j = 0; j < wxNUM_STYLES; j++) 
+       {
+            switch (j) 
+           {
+                case wxSTYLE_NORMAL: style = "Straight"; break;
+                case wxSTYLE_ITALIC: style = "Italic"; break;
+                case wxSTYLE_SLANT:
+                default:         style = "Slant";
+            }
+            names[0] = resname;
+            names[1] = weight;
+            names[2] = style;
+
+            SearchResource(devresname, names, 3, &v);
            
-                       len = i;
-
-                       names = new char*[count];
-                       names[0] = name;
-                       for (i = 0, count = 1; i < len; i++)
-                           if (name[i] == ',') {
-                               names[count++] = name + i + 1;
-                               name[i] = 0;
-                           }
-
-                       SearchResource("", (const char **)names, count, (char **)&r);
-                       delete_r = (r != 0);
-                       delete[] names;
-                       
-                       if (!r) {
-                           for (i = 0; i < len; i++)
-                               if (!name[i])
-                                   name[i] = ',';
-                           r = "";
-                           printf("Bad resource name \"%s\" in font lookup\n", name);
-                       }
-                   } else if (!strcmp(name, "weight")) {
-                       r = weight;
-                   } else if (!strcmp(name, "style")) {
-                       r = style;
-                   } else if (!strcmp(name, "family")) {
-                       r = resname;
-                   } else {
-                       r = "";
-                       printf("Bad font macro name \"%s\"\n", name);
-                   }
-
-                   // add r to v
-                   newstrlen = strlen(r);
-                   char *naya = new char[startpos + newstrlen + len - i];
-                   memcpy(naya, v, startpos);
-                   memcpy(naya + startpos, r, newstrlen);
-                   memcpy(naya + startpos + newstrlen, v + i + 1, len - i);
-                   if (delete_r)
-                     delete[] (char*)r;
-                   delete[] v;
-                   v = naya;
-                   
-                   goto found;
-               }
-           }
-           /* We have a final value: */
-           map[k][j] = v;
-       }
+            // Expand macros in the found string: 
+found:
+            int len, closer = 0, startpos = 0;
+
+            len = (v ? strlen(v) : 0);
+            for (i = 0; i < len; i++) 
+           {
+                if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) 
+               {
+                    startpos = i;
+                    closer   = (v[i+1] == '[') ? ']' : '}';
+                    ++i;
+                } 
+               else if (v[i] == closer) 
+               {
+                    int newstrlen;
+                    const char *r = (char *) NULL; bool delete_r = FALSE;
+                    char *name;
+
+                    name = v + startpos + 2;
+                    v[i] = 0;
+
+                    if (closer == '}') 
+                   {
+                        int i, count, len;
+                        char **names;
+
+                        for (i = 0, count = 1; name[i]; i++)
+                            if (name[i] == ',')
+                                count++;
+
+                        len = i;
+
+                        names = new char*[count];
+                        names[0] = name;
+                        for (i = 0, count = 1; i < len; i++)
+                            if (name[i] == ',') 
+                           {
+                                names[count++] = name + i + 1;
+                                name[i] = 0;
+                            }
+
+                        SearchResource("", (const char **)names, count, (char **)&r);
+                        delete_r = (r != 0);
+                        delete[] names;
+
+                        if (!r) 
+                       {
+                            for (i = 0; i < len; i++)
+                                if (!name[i])
+                                    name[i] = ',';
+                            r = "";
+                            wxLogError( "Bad resource name in font lookup." );
+                        }
+                    } else if (!strcmp(name, "weight")) {
+                        r = weight;
+                    } else if (!strcmp(name, "style")) {
+                        r = style;
+                    } else if (!strcmp(name, "family")) {
+                        r = resname;
+                    } else {
+                        r = "";
+                        wxLogError( "Bad font macro name." );
+                    }
+
+                    // add r to v
+                    newstrlen = strlen(r);
+                    char *naya = new char[startpos + newstrlen + len - i];
+                    memcpy(naya, v, startpos);
+                    memcpy(naya + startpos, r, newstrlen);
+                    memcpy(naya + startpos + newstrlen, v + i + 1, len - i);
+                    if (delete_r)
+                        delete[] (char*)r;
+                    delete[] v;
+                    v = naya;
+
+                    goto found;
+                }
+            }
+            // We have a final value: 
+            map[k][j] = v;
+        }
     }
 }
 
@@ -728,28 +816,29 @@ void wxSuffixMap::Initialize(const char *resname, const char *devresname)
 // wxFontNameItem
 //-----------------------------------------------------------------------------
 
-class wxFontNameItem : public wxObject {
-DECLARE_DYNAMIC_CLASS(wxFontNameItem)
+class wxFontNameItem : public wxObject 
+{
+    DECLARE_DYNAMIC_CLASS(wxFontNameItem)
 public:
-    wxFontNameItem(const char *name, int id, int family);
-    ~wxFontNameItem();
-
-    inline char* GetScreenName(int w, int s)     {return screen.GetName(w, s);}
-    inline char* GetPostScriptName(int w, int s) {return printing.GetName(w, s);}
-    inline char* GetAFMName(int w, int s)        {return afm.GetName(w, s);}
-    inline char* GetName(void)                   {return name;}
-    inline int   GetFamily(void)                 {return family;}
-    inline int   GetId(void)                     {return id;}
-    inline bool  IsRoman(void)                   {return isroman;}
-#if WXDEBUG
-    void Dump(ostream& str);
+        wxFontNameItem(const char *name, int id, int family);
+        ~wxFontNameItem();
+
+        inline char* GetScreenName(int w, int s)     {return screen.GetName(w, s);}
+        inline char* GetPostScriptName(int w, int s) {return printing.GetName(w, s);}
+        inline char* GetAFMName(int w, int s)        {return afm.GetName(w, s);}
+        inline char* GetName()                   {return name;}
+        inline int   GetFamily()                 {return family;}
+        inline int   GetId()                     {return id;}
+        inline bool  IsRoman()                   {return isroman;}
+#if defined(__WXDEBUG__)
+        void Dump(ostream& str);
 #endif
 
-    int id;
-    int family;
-    char *name;
-    wxSuffixMap screen, printing, afm;
-    bool isroman;
+        int id;
+        int family;
+        char *name;
+        wxSuffixMap screen, printing, afm;
+        bool isroman;
 };
 
 IMPLEMENT_ABSTRACT_CLASS(wxFontNameItem, wxObject)
@@ -765,14 +854,14 @@ wxFontNameItem::wxFontNameItem(const char *Name, int Id, int Family)
     afm.     Initialize(name, "Afm");
 }
 
-wxFontNameItem::~wxFontNameItem(void)
+wxFontNameItem::~wxFontNameItem()
 {
     if (name)
-       delete[] name;
+        delete[] name;
     name = (char *) NULL;
 }
 
-#if WXDEBUG
+#if defined(__WXDEBUG__)
 void wxFontNameItem::Dump(ostream& str)
 {
     str << "wxFontNameItem(" << name << ")";
@@ -785,7 +874,7 @@ void wxFontNameItem::Dump(ostream& str)
 
 IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
 
-wxFontNameDirectory::wxFontNameDirectory(void)
+wxFontNameDirectory::wxFontNameDirectory()
 {
     table = new wxHashTable(wxKEY_INTEGER, 20);
     nextFontId = -1;
@@ -796,15 +885,16 @@ wxFontNameDirectory::~wxFontNameDirectory()
     // Cleanup wxFontNameItems allocated
     table->BeginFind();
     wxNode *node = table->Next();
-    while (node) {
-       wxFontNameItem *item = (wxFontNameItem*)node->Data();
-       delete item;
-       node = table->Next();
+    while (node) 
+    {
+        wxFontNameItem *item = (wxFontNameItem*)node->Data();
+        delete item;
+        node = table->Next();
     }
     delete table;
 }
 
-int wxFontNameDirectory::GetNewFontId(void)
+int wxFontNameDirectory::GetNewFontId()
 {
     return (nextFontId--);
 }
@@ -823,18 +913,20 @@ void wxFontNameDirectory::Initialize()
 void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname)
 {
     char *fam, resource[256];
-  
+
     sprintf(resource, "Family%s", resname);
     SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
-    if (fam) {
-       if      (!strcmp(fam, "Default"))       family = wxDEFAULT;
-       else if (!strcmp(fam, "Roman"))         family = wxROMAN;
-       else if (!strcmp(fam, "Decorative"))    family = wxDECORATIVE;
-       else if (!strcmp(fam, "Modern"))        family = wxMODERN;
-       else if (!strcmp(fam, "Teletype"))      family = wxTELETYPE;
-       else if (!strcmp(fam, "Swiss"))         family = wxSWISS;
-       else if (!strcmp(fam, "Script"))        family = wxSCRIPT;
-       delete[] fam; // free resource
+    
+    if (fam) 
+    {
+        if      (!strcmp(fam, "Default"))    family = wxDEFAULT;
+        else if (!strcmp(fam, "Roman"))        family = wxROMAN;
+        else if (!strcmp(fam, "Decorative"))    family = wxDECORATIVE;
+        else if (!strcmp(fam, "Modern"))    family = wxMODERN;
+        else if (!strcmp(fam, "Teletype"))    family = wxTELETYPE;
+        else if (!strcmp(fam, "Swiss"))        family = wxSWISS;
+        else if (!strcmp(fam, "Script"))    family = wxSCRIPT;
+        delete[] fam; // free resource
     }
     table->Put(fontid, new wxFontNameItem(resname, fontid, family));
 }
@@ -842,9 +934,10 @@ void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname
 int wxFontNameDirectory::FindOrCreateFontId(const char *name, int family)
 {
     int id;
-
+    
     // font exists -> return id
     if ( (id = GetFontId(name)) ) return id;
+    
     // create new font
     Initialize(id=GetNewFontId(), family, name);
     return id;
@@ -854,7 +947,8 @@ char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style)
 {
     wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
     if (item)
-       return item->GetScreenName(weight, style);
+        return item->GetScreenName(weight, style);
+       
     // font does not exist
     return (char *) NULL;
 }
@@ -863,7 +957,8 @@ char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style)
 {
     wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
     if (item)
-       return item->GetPostScriptName(weight, style);
+        return item->GetPostScriptName(weight, style);
+       
     // font does not exist
     return (char *) NULL;
 }
@@ -872,7 +967,7 @@ char *wxFontNameDirectory::GetAFMName(int fontid, int weight, int style)
 {
     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
     if (item)
-       return item->GetAFMName(weight, style);
+        return item->GetAFMName(weight, style);
     // font does not exist
     return (char *) NULL;
 }
@@ -881,7 +976,8 @@ char *wxFontNameDirectory::GetFontName(int fontid)
 {
     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
     if (item)
-       return item->GetName();
+        return item->GetName();
+       
     // font does not exist
     return (char *) NULL;
 }
@@ -892,11 +988,13 @@ int wxFontNameDirectory::GetFontId(const char *name)
 
     table->BeginFind();
 
-    while ( (node = table->Next()) ) {
-       wxFontNameItem *item = (wxFontNameItem*)node->Data();
-       if (!strcmp(name, item->name))
-           return item->id;
+    while ( (node = table->Next()) ) 
+    {
+        wxFontNameItem *item = (wxFontNameItem*)node->Data();
+        if (!strcmp(name, item->name))
+            return item->id;
     }
+    
     // font does not exist
     return 0;
 }
@@ -904,9 +1002,12 @@ int wxFontNameDirectory::GetFontId(const char *name)
 int wxFontNameDirectory::GetFamily(int fontid)
 {
     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid);
-  
+
     if (item)
-       return item->family;
+        return item->family;
+       
     // font does not exist
     return wxDEFAULT;
 }
+
+*/