]> git.lyx.org Git - features.git/commitdiff
Add xfonts to the font path if necessary.
authorDekel Tsur <dekelts@tau.ac.il>
Mon, 28 Oct 2002 07:45:39 +0000 (07:45 +0000)
committerDekel Tsur <dekelts@tau.ac.il>
Mon, 28 Oct 2002 07:45:39 +0000 (07:45 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5522 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt2/ChangeLog
src/frontends/qt2/qfont_loader.C
src/frontends/xforms/ChangeLog
src/frontends/xforms/xfont_loader.C

index a52b583522e3ea65f7613c169d4a0b6f9146e9be..a7a1d6d91f1d7485dcaa0cbbdff8a526a1a808d7 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-28  Dekel Tsur  <dekelts@tau.ac.il>
+
+       * qfont_loader.C (font_info): Add xfonts to the font path if
+       necessary.
+
 2002-10-21  Lars Gullik Bjønnes  <larsbj@birdstep.com>
 
        * QVCLog.C (update_contents): modify
index 5558d80ce4bd74b99cefec5433d281b9479297b8..8fe15bcb81a7f4209ff72248bbd842bab8c6a1de 100644 (file)
 #include "support/lstrings.h"
 #endif
 
+#ifdef Q_WS_X11
+#include <qwidget.h>
+#include <X11/Xlib.h>
+#include "support/systemcall.h"
+#include "support/filetools.h"
+#endif
+
 using std::endl;
 
 
@@ -68,35 +75,96 @@ QFont const & qfont_loader::get(LyXFont const & f)
        return ret;
 }
 
+namespace {
+
+string const symbolPattern(LyXFont::FONT_FAMILY family)
+{
+       switch (family) {
+       case LyXFont::SYMBOL_FAMILY:
+               return "-*-symbol-*-*-*-*-*-*-*-*-*-*-adobe-fontspecific";
+
+       case LyXFont::CMR_FAMILY:
+               return "-*-cmr10-medium-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::CMSY_FAMILY:
+               return "-*-cmsy10-*-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::CMM_FAMILY:
+               return "-*-cmmi10-medium-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::CMEX_FAMILY:
+               return "-*-cmex10-*-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::MSA_FAMILY:
+               return "-*-msam10-*-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::MSB_FAMILY:
+               return "-*-msbm10-*-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::EUFRAK_FAMILY:
+               return "-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*";
+
+       case LyXFont::WASY_FAMILY:
+               return "-*-wasy10-medium-*-*-*-*-*-*-*-*-*-*-*";
+
+       default:
+               return string();
+       }       
+}
+
+bool addFontPath()
+{
+#ifdef Q_WS_X11
+       string const dir =  OnlyPath(LibFileSearch("xfonts", "fonts.dir"));
+       if (!dir.empty()) {
+               QWidget w;
+               int n;
+               char ** p = XGetFontPath(w.x11Display(), &n);
+               if (std::find(p, p+n, dir) != p+n)
+                       return false;
+               lyxerr << "Adding " << dir << " to the font path.\n";
+               string const command = "xset fp+ " + dir;
+               Systemcall s;
+               if (!s.startscript(Systemcall::Wait, command)) 
+                       return true;
+               lyxerr << "Unable to add font path.\n";
+       }
+#endif
+       return false;
+}
+
+bool isAvailable(QFont const & font, LyXFont const & f) {
+#if QT_VERSION >= 300
+       return font.exactMatch();
+#else
+       string tmp = symbolPattern(f.family());
+       if (tmp.empty())
+               return false;
+       else
+               return token(tmp, '-', 2) == 
+                       token(font.rawName().latin1(), '-', 2);
+#endif
+}
+
+} // namespace anon
 
 qfont_loader::font_info::font_info(LyXFont const & f)
        : metrics(font)
 {
-       switch (f.family()) {
-               case LyXFont::SYMBOL_FAMILY:
-                       font.setRawName("-*-symbol-*-*-*-*-*-*-*-*-*-*-adobe-fontspecific");
-                       break;
-               case LyXFont::CMR_FAMILY:
-                       font.setRawName("-*-cmr10-medium-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::CMSY_FAMILY:
-                       font.setRawName("-*-cmsy10-*-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::CMM_FAMILY:
-                       font.setRawName("-*-cmmi10-medium-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::CMEX_FAMILY:
-                       font.setRawName("-*-cmex10-*-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::MSA_FAMILY:
-                       font.setRawName("-*-msam10-*-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::MSB_FAMILY:
-                       font.setRawName("-*-msbm10-*-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
-               case LyXFont::EUFRAK_FAMILY:
-                       font.setRawName("-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*");
-                       break;
+
+       string pat = symbolPattern(f.family());
+       if (!pat.empty()) {
+               static bool first_time = true;
+               font.setRawName(pat.c_str());
+               if (f.family() != LyXFont::SYMBOL_FAMILY &&
+                   !isAvailable(font, f) && first_time) {
+                       first_time = false;
+                       if (addFontPath()) {
+                               font.setRawName(pat.c_str());
+                       }
+               }
+       } else 
+               switch (f.family()) {
                case LyXFont::ROMAN_FAMILY:
                        font.setFamily("times");
                        break;
@@ -106,6 +174,8 @@ qfont_loader::font_info::font_info(LyXFont const & f)
                case LyXFont::TYPEWRITER_FAMILY:
                        font.setFamily("courier");
                        break;
+               default:
+                       break;
        }
 
        font.setPointSizeFloat(lyxrc.font_sizes[f.size()]
@@ -164,24 +234,5 @@ bool qfont_loader::available(LyXFont const & f)
        if (!lyxrc.use_gui)
                return false;
 
-#if QT_VERSION >= 300
-       return getfontinfo(f)->font.exactMatch();
-#else
-       string tmp;
-       switch (f.family()) {
-       case LyXFont::SYMBOL_FAMILY:  tmp = "symbol"; break;
-       case LyXFont::CMR_FAMILY:     tmp = "cmr10"; break;
-       case LyXFont::CMSY_FAMILY:    tmp = "cmsy10"; break;
-       case LyXFont::CMM_FAMILY:     tmp = "cmmi10"; break;
-       case LyXFont::CMEX_FAMILY:    tmp = "cmex10"; break;
-       case LyXFont::MSA_FAMILY:     tmp = "msam10"; break;
-       case LyXFont::MSB_FAMILY:     tmp = "msbm10"; break;
-       default: break;
-       }
-       if (tmp.empty())
-               return false;
-       else
-               return token(getfontinfo(f)->font.rawName().latin1(), '-', 2)
-                       == tmp;
-#endif
+       return isAvailable(getfontinfo(f)->font, f);
 }
index d35df674c83412cecefdecd1cf3c64a3c482f6f6..deabbc5657b460d0ca76d18d3f450a8ec6045dac 100644 (file)
@@ -1,3 +1,7 @@
+2002-10-28  Dekel Tsur  <dekelts@tau.ac.il>
+
+       * xfont_loader.C (getFontinfo): Cleanup.
+
 2002-10-26  John Levon  <levon@movementarian.org>
 
        * forms/form_preamble.fd: OK cannot be a RETURN_BUTTON ;)
index dc1694b4b6f61704199aebf960afbc7e63c59b32..5b1931f96a1addfb1e3a6a190eb0ff17453683fc 100644 (file)
@@ -92,6 +92,7 @@ void xfont_loader::unload()
 }
 
 namespace {
+
 string const symbolPattern(LyXFont::FONT_FAMILY family)
 {
        switch (family) {
@@ -127,8 +128,26 @@ string const symbolPattern(LyXFont::FONT_FAMILY family)
        }       
 }
 
+bool addFontPath()
+{
+       string const dir =  OnlyPath(LibFileSearch("xfonts", "fonts.dir"));
+       if (!dir.empty()) {
+               int n;
+               char ** p = XGetFontPath(fl_get_display(), &n);
+               if (std::find(p, p + n, dir) != p + n)
+                       return false;
+               lyxerr << "Adding " << dir << " to the font path.\n";
+               string const command = "xset fp+ " + dir;
+               Systemcall s;
+               if (!s.startscript(Systemcall::Wait, command)) 
+                       return true;
+               lyxerr << "Unable to add font path.\n";
+       }
+       return false;
 }
 
+} // namespace anon
+
 // Get font info
 /* Takes care of finding which font that can match the given request. Tries
 different alternatives. */
@@ -149,21 +168,9 @@ void xfont_loader::getFontinfo(LyXFont::FONT_FAMILY family,
                    !fontinfo[family][series][shape]->exist() &&
                    first_time) {
                        first_time = false;
-                       string const dir = 
-                               OnlyPath(LibFileSearch("xfonts", "fonts.dir"));
-                       if (!dir.empty()) {
-                               int n;
-                               char ** p = XGetFontPath(fl_get_display(), &n);
-                               if (std::find(p, p+n, dir) != p+n)
-                                       return;
-                               lyxerr << "Adding " << dir << " to the font path.\n";
-                               string const command = "xset fp+ " + dir;
-                               Systemcall s;
-                               if (!s.startscript(Systemcall::Wait, command)) {
-                                       delete fontinfo[family][series][shape];
-                                       fontinfo[family][series][shape] = new FontInfo(pat);    
-                               } else
-                                       lyxerr << "Unable to add font path.\n";
+                       if (addFontPath()) {
+                               delete fontinfo[family][series][shape];
+                               fontinfo[family][series][shape] = new FontInfo(pat);    
                        }
                }
                return;