]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/fontutil.cpp
define WXGTK12 for GTK+ 1.2.7+ as well
[wxWidgets.git] / src / unix / fontutil.cpp
index 2c371f3c1f4357ff440dd9ab42981ee56dc7c9ee..9411fc8df67349dba1539c427c3aa1f8b4feb719 100644 (file)
 #endif // PCH
 
 #ifdef __X__
-#ifdef __VMS__
-#pragma message disable nosimpint
-#endif
-#include <X11/Xlib.h>
-#ifdef __VMS__
-#pragma message enable nosimpint
-#endif
+    #ifdef __VMS__
+        #pragma message disable nosimpint
+    #endif
+
+    #include <X11/Xlib.h>
+
+    #ifdef __VMS__
+        #pragma message enable nosimpint
+    #endif
 
     #include "wx/utils.h"       // for wxGetDisplay()
 #elif defined(__WXGTK__)
-    #include "gdk/gdk.h"
+    // we have to declare struct tm to avoid problems with first forward
+    // declaring it in C code (glib.h included from gdk.h does it) and then
+    // defining it when time.h is included from the headers below - this is
+    // known not to work at least with Sun CC 6.01
+    #include <time.h>
+
+    #include <gdk/gdk.h>
 #endif
 
 #include "wx/fontutil.h"
@@ -110,8 +118,8 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
 //      encodingid;registry;encoding[;facename]
 bool wxNativeEncodingInfo::FromString(const wxString& s)
 {
+    // use ";", not "-" because it may be part of encoding name
     wxStringTokenizer tokenizer(s, _T(";"));
-            // cannot use "-" because it may be part of encoding name
 
     wxString encid = tokenizer.GetNextToken();
     long enc;
@@ -183,6 +191,13 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
             }
             break;
 
+        case wxFONTENCODING_UTF8:
+            // FIXME: this is probably false, but this is how they are called on
+            //        my system and I don't know what the standard XFLD is (VZ)
+            info->xregistry = wxT("iso646.1991");
+            info->xencoding = wxT("*");
+            break;
+
         case wxFONTENCODING_KOI8:
             info->xregistry = wxT("koi8");
 
@@ -263,7 +278,9 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
         if ( !wxGetNativeFontEncoding(encoding, &info) ||
              !wxTestFontEncoding(info) )
         {
+#if wxUSE_FONTMAP
             if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+#endif // wxUSE_FONTMAP
             {
                 // unspported encoding - replace it with the default
                 //
@@ -274,19 +291,43 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
             }
         }
     }
-    
+
     // OK, we have the correct xregistry/xencoding in info structure
     wxNativeFont font = 0;
 
     // if we already have the X font name, try to use it
     if( xFontName && !xFontName->IsEmpty() )
-        font = wxLoadFont(*xFontName);
+    {
+        //
+        //  Make sure point size is correct for scale factor.
+        //
+        wxStringTokenizer tokenizer(*xFontName, _T("-"), wxTOKEN_RET_DELIMS);
+        wxString newFontName;
+
+        for(int i = 0; i < 8; i++)
+          newFontName += tokenizer.NextToken();
+
+        (void) tokenizer.NextToken();
+
+        newFontName += wxString::Format("%d-", pointSize);
+
+        while(tokenizer.HasMoreTokens())
+          newFontName += tokenizer.GetNextToken();
 
+        font = wxLoadFont(newFontName);
+
+        if(font)
+          *xFontName = newFontName;
+    }
+
+    // try to load exactly the font requested first
     if( !font )
+    {
         font = wxLoadQueryFont( pointSize, family, style, weight,
-                                         underlined, facename,
+                                underlined, facename,
                                 info.xregistry, info.xencoding,
                                 xFontName );
+    }
 
     if ( !font )
     {
@@ -321,22 +362,49 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
                                    xFontName );
         }
 
-        // Bogus font I
+        // ignore size, family, style and weight but try to find font with the
+        // given facename and encoding
         if ( !font )
         {
             font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
                                    underlined, facename,
                                    info.xregistry, info.xencoding,
                                    xFontName);
-        }
 
-        // Bogus font II
-        if ( !font )
-        {
-            font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
-                                   underlined, wxEmptyString,
-                                   info.xregistry, info.xencoding,
-                                   xFontName);
+            // ignore family as well
+            if ( !font )
+            {
+                font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
+                                       underlined, wxEmptyString,
+                                       info.xregistry, info.xencoding,
+                                       xFontName);
+
+                // if it still failed, try to get the font of any size but
+                // with the requested encoding: this can happen if the
+                // encoding is only available in one size which happens to be
+                // different from 120
+                if ( !font )
+                {
+                    font = wxLoadQueryFont(-1, wxDEFAULT, wxNORMAL, wxNORMAL,
+                                           FALSE, wxEmptyString,
+                                           info.xregistry, info.xencoding,
+                                           xFontName);
+
+                    // this should never happen as we had tested for it in the
+                    // very beginning, but if it does, do return something non
+                    // NULL or we'd crash in wxFont code
+                    if ( !font )
+                    {
+                        wxFAIL_MSG( _T("this encoding should be available!") );
+
+                        font = wxLoadQueryFont(-1,
+                                               wxDEFAULT, wxNORMAL, wxNORMAL,
+                                               FALSE, wxEmptyString,
+                                               _T("*"), _T("*"),
+                                               xFontName);
+                    }
+                }
+            }
         }
     }
 
@@ -360,13 +428,12 @@ static bool wxTestFontSpec(const wxString& fontspec)
     wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec );
     if (test)
     {
-//        printf( "speed up\n" );
         return TRUE;
     }
 
     test = wxLoadFont(fontspec);
     g_fontHash->Put( fontspec, (wxObject*) test );
-    
+
     if ( test )
     {
         wxFreeFont(test);
@@ -556,10 +623,21 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
         default:           xweight = wxT("*"); break;
     }
 
+    // if pointSize is -1, don't specify any
+    wxString sizeSpec;
+    if ( fontSpec == -1 )
+    {
+        sizeSpec = _T('*');
+    }
+    else
+    {
+        sizeSpec.Printf(_T("%d"), pointSize);
+    }
+
     // construct the X font spec from our data
-    fontSpec.Printf(wxT("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-%s-%s"),
+    fontSpec.Printf(wxT("-*-%s-%s-%s-normal-*-*-%s-*-*-*-*-%s-%s"),
                     xfamily.c_str(), xweight.c_str(), xstyle.c_str(),
-                    pointSize, xregistry.c_str(), xencoding.c_str());
+                    sizeSpec.c_str(), xregistry.c_str(), xencoding.c_str());
 
     if( xFontName )
         *xFontName = fontSpec;