From c4a0172a197ba74f0172d213908a87f01962234e Mon Sep 17 00:00:00 2001 From: Dekel Tsur Date: Mon, 28 Oct 2002 07:45:39 +0000 Subject: [PATCH] Add xfonts to the font path if necessary. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5522 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/qt2/ChangeLog | 5 + src/frontends/qt2/qfont_loader.C | 141 +++++++++++++++++++--------- src/frontends/xforms/ChangeLog | 4 + src/frontends/xforms/xfont_loader.C | 37 +++++--- 4 files changed, 127 insertions(+), 60 deletions(-) diff --git a/src/frontends/qt2/ChangeLog b/src/frontends/qt2/ChangeLog index a52b583522..a7a1d6d91f 100644 --- a/src/frontends/qt2/ChangeLog +++ b/src/frontends/qt2/ChangeLog @@ -1,3 +1,8 @@ +2002-10-28 Dekel Tsur + + * qfont_loader.C (font_info): Add xfonts to the font path if + necessary. + 2002-10-21 Lars Gullik Bjønnes * QVCLog.C (update_contents): modify diff --git a/src/frontends/qt2/qfont_loader.C b/src/frontends/qt2/qfont_loader.C index 5558d80ce4..8fe15bcb81 100644 --- a/src/frontends/qt2/qfont_loader.C +++ b/src/frontends/qt2/qfont_loader.C @@ -26,6 +26,13 @@ #include "support/lstrings.h" #endif +#ifdef Q_WS_X11 +#include +#include +#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); } diff --git a/src/frontends/xforms/ChangeLog b/src/frontends/xforms/ChangeLog index d35df674c8..deabbc5657 100644 --- a/src/frontends/xforms/ChangeLog +++ b/src/frontends/xforms/ChangeLog @@ -1,3 +1,7 @@ +2002-10-28 Dekel Tsur + + * xfont_loader.C (getFontinfo): Cleanup. + 2002-10-26 John Levon * forms/form_preamble.fd: OK cannot be a RETURN_BUTTON ;) diff --git a/src/frontends/xforms/xfont_loader.C b/src/frontends/xforms/xfont_loader.C index dc1694b4b6..5b1931f96a 100644 --- a/src/frontends/xforms/xfont_loader.C +++ b/src/frontends/xforms/xfont_loader.C @@ -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; -- 2.39.5