From 568ce36c5cf412aa610dce7a685c3c6c58a84172 Mon Sep 17 00:00:00 2001 From: Dekel Tsur Date: Wed, 27 Nov 2002 21:49:50 +0000 Subject: [PATCH] lyxrc.*_font_foundry git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5737 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ChangeLog | 4 ++ src/frontends/qt2/ChangeLog | 8 +++ src/frontends/qt2/Makefile.am | 2 + src/frontends/qt2/QPrefs.C | 78 +++++++++++++++----------- src/frontends/qt2/qfont_loader.C | 10 +++- src/frontends/qt2/qt_helpers.C | 49 ++++++++++++++++ src/frontends/qt2/qt_helpers.h | 26 +++++++++ src/frontends/xforms/ChangeLog | 6 ++ src/frontends/xforms/FormPreferences.C | 54 +++++++++++++----- src/frontends/xforms/xfont_loader.C | 21 ++++++- src/lyxrc.C | 63 ++++++++++++++++++++- src/lyxrc.h | 9 +++ 12 files changed, 275 insertions(+), 55 deletions(-) create mode 100644 src/frontends/qt2/qt_helpers.C create mode 100644 src/frontends/qt2/qt_helpers.h diff --git a/src/ChangeLog b/src/ChangeLog index 7a4fba5b24..ccd94505f0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2002-11-27 Dekel Tsur + + * lyxrc.[Ch]: Add {roman,sans,typewriter}_font_foundry variables. + 2002-11-27 Lars Gullik Bjønnes * tabular.C (asciiPrintCell): use string(size, char) instead of diff --git a/src/frontends/qt2/ChangeLog b/src/frontends/qt2/ChangeLog index ef73b4fa0e..f9452814e5 100644 --- a/src/frontends/qt2/ChangeLog +++ b/src/frontends/qt2/ChangeLog @@ -1,3 +1,11 @@ +2002-11-27 Dekel Tsur + + * qfont_loader.C (font_info): Use lyxrc.*_font_foundry. + + * QPrefs.C: Handle lyxrc.*_font_foundry. + + * qt_helpers.C: New file. + 2002-11-27 John Levon * qsetborder.h: diff --git a/src/frontends/qt2/Makefile.am b/src/frontends/qt2/Makefile.am index 462deef459..9ee32ce63a 100644 --- a/src/frontends/qt2/Makefile.am +++ b/src/frontends/qt2/Makefile.am @@ -83,6 +83,8 @@ libqt2_la_SOURCES = \ qscreen.C \ qsetborder.h \ qsetborder.C \ + qt_helpers.h \ + qt_helpers.C \ qttableview.h \ qttableview.C \ $(DIALOGSOURCES) diff --git a/src/frontends/qt2/QPrefs.C b/src/frontends/qt2/QPrefs.C index 647024c0aa..12eca43528 100644 --- a/src/frontends/qt2/QPrefs.C +++ b/src/frontends/qt2/QPrefs.C @@ -39,8 +39,11 @@ #include "lyxrc.h" #include "frnt_lang.h" #include "helper_funcs.h" +#include "qt_helpers.h" #include "debug.h" +#include + #include #include #include @@ -51,6 +54,7 @@ #include "qcoloritem.h" using std::vector; +using std::pair; using std::ostringstream; using std::setfill; using std::setw; @@ -230,10 +234,14 @@ void QPrefs::apply() QPrefScreenFontsModule * fontmod(dialog_->screenfontsModule); LyXRC const oldrc(rc); + + boost::tie(rc.roman_font_name, rc.roman_font_foundry) + = parseFontName(fontmod->screenRomanCO->currentText().latin1()); + boost::tie(rc.sans_font_name, rc.sans_font_foundry) = + parseFontName(fontmod->screenSansCO->currentText().latin1()); + boost::tie(rc.typewriter_font_name, rc.typewriter_font_foundry) = + parseFontName(fontmod->screenTypewriterCO->currentText().latin1()); - rc.roman_font_name = fontmod->screenRomanCO->currentText().latin1(); - rc.sans_font_name = fontmod->screenSansCO->currentText().latin1(); - rc.typewriter_font_name = fontmod->screenTypewriterCO->currentText().latin1(); rc.zoom = fontmod->screenZoomSB->value(); rc.dpi = fontmod->screenDpiSB->value(); rc.font_sizes[LyXFont::SIZE_TINY] = strToDbl(fontmod->screenTinyED->text().latin1()); @@ -299,6 +307,29 @@ findPos(std::vector const & vec, A const & val) return std::distance(vec.begin(), it); } +void setComboxFont(QComboBox * cb, + string const & family, string const & foundry) +{ + + string const name = makeFontName(family, foundry); + for (int i = 0; i < cb->count(); ++i) { + if (compare_no_case(cb->text(i).latin1(), name) == 0) { + cb->setCurrentItem(i); + return; + } + } + + // Try matching without foundary name + for (int i = cb->count() - 1; i >= 0; --i) { + // We count in reverse in order to prefer the Xft foundry + pair tmp = parseFontName(cb->text(i).latin1()); + if (compare_no_case(tmp.first, family) == 0) { + cb->setCurrentItem(i); + return; + } + } +} + } void QPrefs::update_contents() @@ -436,36 +467,17 @@ void QPrefs::update_contents() QPrefScreenFontsModule * fontmod(dialog_->screenfontsModule); - QString roman(rc.roman_font_name.c_str()); - QString sans(rc.sans_font_name.c_str()); - QString typewriter(rc.typewriter_font_name.c_str()); - - for (int i = 0; i < fontmod->screenRomanCO->count(); ++i) { - if (fontmod->screenRomanCO->text(i) == roman) { - fontmod->screenRomanCO->setCurrentItem(i); - break; - } - } - - for (int i = 0; i < fontmod->screenSansCO->count(); ++i) { - if (fontmod->screenSansCO->text(i) == sans) { - fontmod->screenSansCO->setCurrentItem(i); - break; - } - } - - for (int i = 0; i < fontmod->screenTypewriterCO->count(); ++i) { - if (fontmod->screenTypewriterCO->text(i) == typewriter) { - fontmod->screenTypewriterCO->setCurrentItem(i); - break; - } - } - - // Fucked if I know why we need this. But we do - dialog_->select_roman(roman); - dialog_->select_sans(sans); - dialog_->select_typewriter(typewriter); - + setComboxFont(fontmod->screenRomanCO, + rc.roman_font_name, rc.roman_font_foundry); + setComboxFont(fontmod->screenSansCO, + rc.sans_font_name, rc.sans_font_foundry); + setComboxFont(fontmod->screenTypewriterCO, + rc.typewriter_font_name, rc.typewriter_font_foundry); + + dialog_->select_roman(fontmod->screenRomanCO->currentText()); + dialog_->select_sans(fontmod->screenSansCO->currentText()); + dialog_->select_typewriter(fontmod->screenTypewriterCO->currentText()); + fontmod->screenZoomSB->setValue(rc.zoom); fontmod->screenDpiSB->setValue(int(rc.dpi)); fontmod->screenTinyED->setText(tostr(rc.font_sizes[LyXFont::SIZE_TINY]).c_str()); diff --git a/src/frontends/qt2/qfont_loader.C b/src/frontends/qt2/qfont_loader.C index 2e34c41b8d..4584052587 100644 --- a/src/frontends/qt2/qfont_loader.C +++ b/src/frontends/qt2/qfont_loader.C @@ -20,6 +20,7 @@ #include "debug.h" #include "lyxrc.h" #include "BufferView.h" +#include "qt_helpers.h" #include #if QT_VERSION < 300 @@ -176,13 +177,16 @@ qfont_loader::font_info::font_info(LyXFont const & f) } else switch (f.family()) { case LyXFont::ROMAN_FAMILY: - font.setFamily(lyxrc.roman_font_name.c_str()); + font.setFamily(makeFontName(lyxrc.roman_font_name, + lyxrc.roman_font_foundry).c_str()); break; case LyXFont::SANS_FAMILY: - font.setFamily(lyxrc.sans_font_name.c_str()); + font.setFamily(makeFontName(lyxrc.sans_font_name, + lyxrc.sans_font_foundry).c_str()); break; case LyXFont::TYPEWRITER_FAMILY: - font.setFamily(lyxrc.typewriter_font_name.c_str()); + font.setFamily(makeFontName(lyxrc.typewriter_font_name, + lyxrc.typewriter_font_foundry).c_str()); break; default: break; diff --git a/src/frontends/qt2/qt_helpers.C b/src/frontends/qt2/qt_helpers.C new file mode 100644 index 0000000000..2c0beeddb8 --- /dev/null +++ b/src/frontends/qt2/qt_helpers.C @@ -0,0 +1,49 @@ +/** + * \file qt_helpers.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Dekel Tsur + * + * Full author contact details are available in file CREDITS + */ + +#include + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "qt_helpers.h" + +#include + + +string makeFontName(string const & family, string const & foundry) +{ + if (foundry.empty()) + return family; +#if QT_VERSION >= 300 + return family + " [" + foundry + ']'; +#else + return foundry + '-' + family; +#endif +} + + +pair parseFontName(string const & name) +{ +#if QT_VERSION >= 300 + string::size_type const idx = name.find('['); + if (idx == string::npos || idx == 0) + return make_pair(name, string()); + return make_pair(name.substr(0, idx - 1), + name.substr(idx + 1, name.size() - idx - 2)); +#else + string::size_type const idx = name.find('-'); + if (idx == string::npos || idx == 0) + return make_pair(name, string()); + return make_pair(name.substr(idx + 1), + name.substr(0, idx)); +#endif +} diff --git a/src/frontends/qt2/qt_helpers.h b/src/frontends/qt2/qt_helpers.h new file mode 100644 index 0000000000..244db7b7d1 --- /dev/null +++ b/src/frontends/qt2/qt_helpers.h @@ -0,0 +1,26 @@ +// -*- C++ -*- +/** + * \file qt_helpers.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Dekel Tsur + * + * Full author contact details are available in file CREDITS + */ + +#ifndef QTHELPERS_H +#define QTHELPERS_H + +#ifdef __GNUG__ +#pragma interface +#endif + +#include "LString.h" + +#include + +string makeFontName(string const & family, string const & foundry); +std::pair parseFontName(string const & name); + +#endif // QTHELPERS_H diff --git a/src/frontends/xforms/ChangeLog b/src/frontends/xforms/ChangeLog index 3556f4ad7b..fe292594e0 100644 --- a/src/frontends/xforms/ChangeLog +++ b/src/frontends/xforms/ChangeLog @@ -1,3 +1,9 @@ +2002-11-27 Dekel Tsur + + * xfont_loader.C (getFontinfo): Use lyxrc.*_font_foundry. + + * FormPreferences.C: Handle lyxrc.*_font_foundry. + 2002-11-27 Angus Leeming * forms/fdfix.sh: diff --git a/src/frontends/xforms/FormPreferences.C b/src/frontends/xforms/FormPreferences.C index af881c7581..1b613f8287 100644 --- a/src/frontends/xforms/FormPreferences.C +++ b/src/frontends/xforms/FormPreferences.C @@ -70,6 +70,24 @@ namespace { Formats local_formats; Converters local_converters; +string makeFontName(string const & family, string const & foundry) +{ + if (foundry.empty()) + return family; + return family + ',' + foundry; +} + + +pair parseFontName(string const & name) +{ + string::size_type const idx = name.find(','); + if (idx == string::npos) + return make_pair(name, string()); + return make_pair(name.substr(0, idx), + name.substr(idx+1)); +} + + } // namespace anon @@ -2435,25 +2453,32 @@ void FormPreferences::ScreenFonts::apply(LyXRC & rc) const { bool changed = false; - string str = fl_get_input(dialog_->input_roman); - if (rc.roman_font_name != str) { + pair tmp = + parseFontName(fl_get_input(dialog_->input_roman)); + if (rc.roman_font_name != tmp.first || + rc.roman_font_foundry != tmp.second) { changed = true; - rc.roman_font_name = str; + rc.roman_font_name = tmp.first; + rc.roman_font_foundry = tmp.second; } - str = fl_get_input(dialog_->input_sans); - if (rc.sans_font_name != str) { + tmp = parseFontName(fl_get_input(dialog_->input_sans)); + if (rc.sans_font_name != tmp.first || + rc.sans_font_foundry != tmp.second) { changed = true; - rc.sans_font_name = str; + rc.sans_font_name = tmp.first; + rc.sans_font_foundry = tmp.second; } - str = fl_get_input(dialog_->input_typewriter); - if (rc.typewriter_font_name != str) { + tmp = parseFontName(fl_get_input(dialog_->input_typewriter)); + if (rc.typewriter_font_name != tmp.first || + rc.typewriter_font_foundry != tmp.second) { changed = true; - rc.typewriter_font_name = str; + rc.typewriter_font_name = tmp.first; + rc.typewriter_font_foundry = tmp.second; } - str = fl_get_input(dialog_->input_screen_encoding); + string str = fl_get_input(dialog_->input_screen_encoding); if (rc.font_norm != str) { changed = true; rc.font_norm = str; @@ -2690,11 +2715,14 @@ bool FormPreferences::ScreenFonts::input() void FormPreferences::ScreenFonts::update(LyXRC const & rc) { fl_set_input(dialog_->input_roman, - rc.roman_font_name.c_str()); + makeFontName(rc.roman_font_name, + rc.roman_font_foundry).c_str()); fl_set_input(dialog_->input_sans, - rc.sans_font_name.c_str()); + makeFontName(rc.sans_font_name, + rc.sans_font_foundry).c_str()); fl_set_input(dialog_->input_typewriter, - rc.typewriter_font_name.c_str()); + makeFontName(rc.typewriter_font_name, + rc.typewriter_font_foundry).c_str()); fl_set_input(dialog_->input_screen_encoding, rc.font_norm.c_str()); fl_set_button(dialog_->check_scalable, diff --git a/src/frontends/xforms/xfont_loader.C b/src/frontends/xforms/xfont_loader.C index 5b1931f96a..9801f10f48 100644 --- a/src/frontends/xforms/xfont_loader.C +++ b/src/frontends/xforms/xfont_loader.C @@ -128,6 +128,15 @@ string const symbolPattern(LyXFont::FONT_FAMILY family) } } +string const fontName(string const & family, string const & foundry) +{ + if (foundry.empty() || foundry == "Xft") + return "-*-"+family; + else + return "-"+foundry+"-"+family; +} + + bool addFontPath() { string const dir = OnlyPath(LibFileSearch("xfonts", "fonts.dir")); @@ -192,21 +201,27 @@ void xfont_loader::getFontinfo(LyXFont::FONT_FAMILY family, switch (family) { case LyXFont::ROMAN_FAMILY: switch (cfam) { - case 0: ffamily = lyxrc.roman_font_name; break; + case 0: ffamily = fontName(lyxrc.roman_font_name, + lyxrc.roman_font_foundry); + break; case 1: ffamily = "-*-times"; default: cfam = 100; } break; case LyXFont::SANS_FAMILY: switch (cfam) { - case 0: ffamily = lyxrc.sans_font_name; break; + case 0: ffamily = fontName(lyxrc.sans_font_name, + lyxrc.sans_font_foundry); + break; case 1: ffamily = "-*-helvetica"; default: cfam = 100; } break; case LyXFont::TYPEWRITER_FAMILY: switch (cfam) { - case 0: ffamily = lyxrc.typewriter_font_name; break; + case 0: ffamily = fontName(lyxrc.typewriter_font_name, + lyxrc.typewriter_font_foundry); + break; case 1: ffamily = "-*-courier"; default: cfam = 100; } diff --git a/src/lyxrc.C b/src/lyxrc.C index 81b5ab8547..19ebfb0c53 100644 --- a/src/lyxrc.C +++ b/src/lyxrc.C @@ -126,10 +126,13 @@ keyword_item lyxrcTags[] = { // compatibility with versions older than 1.2.0 only Angus 10 Jan 2002 { "\\screen_font_popup", LyXRC::RC_POPUP_NORMAL_FONT }, { "\\screen_font_roman", LyXRC::RC_SCREEN_FONT_ROMAN }, + { "\\screen_font_roman_foundry", LyXRC::RC_SCREEN_FONT_ROMAN_FOUNDRY }, { "\\screen_font_sans", LyXRC::RC_SCREEN_FONT_SANS }, + { "\\screen_font_sans_foundry", LyXRC::RC_SCREEN_FONT_SANS_FOUNDRY }, { "\\screen_font_scalable", LyXRC::RC_SCREEN_FONT_SCALABLE }, { "\\screen_font_sizes", LyXRC::RC_SCREEN_FONT_SIZES }, { "\\screen_font_typewriter", LyXRC::RC_SCREEN_FONT_TYPEWRITER }, + { "\\screen_font_typewriter_foundry", LyXRC::RC_SCREEN_FONT_TYPEWRITER_FOUNDRY }, { "\\screen_zoom", LyXRC::RC_SCREEN_ZOOM }, { "\\serverpipe", LyXRC::RC_SERVERPIPE }, { "\\set_color", LyXRC::RC_SET_COLOR }, @@ -208,9 +211,9 @@ void LyXRC::setDefaults() { font_sizes[LyXFont::SIZE_HUGE] = 20.74; font_sizes[LyXFont::SIZE_HUGER] = 24.88; use_scalable_fonts = true; - roman_font_name = "-*-times"; - sans_font_name = "-*-helvetica"; - typewriter_font_name = "-*-courier"; + roman_font_name = "times"; + sans_font_name = "helvetica"; + typewriter_font_name = "courier"; popup_bold_font = "-*-helvetica-bold-r"; popup_normal_font = "-*-helvetica-medium-r"; font_norm = "iso8859-1"; @@ -285,6 +288,21 @@ void LyXRC::readBindFileIfNeeded() } +namespace { + +void oldFontFormat(string & family, string & foundry) +{ + if (family.empty() || family[0] != '-') + return; + foundry = token(family, '-', 1); + family = token(family, '-', 2); + if (foundry == "*") + foundry.erase(); +} + +} // namespace anon + + int LyXRC::read(string const & filename) { LyXLex lexrc(lyxrcTags, lyxrcCount); @@ -686,18 +704,41 @@ int LyXRC::read(string const & filename) case RC_SCREEN_FONT_ROMAN: if (lexrc.next()) { roman_font_name = lexrc.getString(); + oldFontFormat(roman_font_name, + roman_font_foundry); } break; case RC_SCREEN_FONT_SANS: if (lexrc.next()) { sans_font_name = lexrc.getString(); + oldFontFormat(sans_font_name, sans_font_foundry); } break; case RC_SCREEN_FONT_TYPEWRITER: if (lexrc.next()) { typewriter_font_name = lexrc.getString(); + oldFontFormat(typewriter_font_name, + typewriter_font_foundry); + } + break; + + case RC_SCREEN_FONT_ROMAN_FOUNDRY: + if (lexrc.next()) { + roman_font_foundry = lexrc.getString(); + } + break; + + case RC_SCREEN_FONT_SANS_FOUNDRY: + if (lexrc.next()) { + sans_font_foundry = lexrc.getString(); + } + break; + + case RC_SCREEN_FONT_TYPEWRITER_FOUNDRY: + if (lexrc.next()) { + typewriter_font_foundry = lexrc.getString(); } break; @@ -1299,16 +1340,32 @@ void LyXRC::output(ostream & os) const os << "\\screen_font_roman \"" << roman_font_name << "\"\n"; } + case RC_SCREEN_FONT_ROMAN_FOUNDRY: + if (roman_font_foundry != system_lyxrc.roman_font_foundry) { + os << "\\screen_font_roman_foundry \"" << roman_font_foundry + << "\"\n"; + } case RC_SCREEN_FONT_SANS: if (sans_font_name != system_lyxrc.sans_font_name) { os << "\\screen_font_sans \"" << sans_font_name << "\"\n"; } + case RC_SCREEN_FONT_SANS_FOUNDRY: + if (sans_font_foundry != system_lyxrc.sans_font_foundry) { + os << "\\screen_font_sans_foundry \"" << sans_font_foundry + << "\"\n"; + } case RC_SCREEN_FONT_TYPEWRITER: if (typewriter_font_name != system_lyxrc.typewriter_font_name) { os << "\\screen_font_typewriter \"" << typewriter_font_name << "\"\n"; } + case RC_SCREEN_FONT_TYPEWRITER_FOUNDRY: + if (typewriter_font_foundry != system_lyxrc.typewriter_font_foundry) { + os << "\\screen_font_typewriter_foundry \"" + << typewriter_font_foundry << "\"\n"; + } + case RC_SCREEN_FONT_SCALABLE: if (use_scalable_fonts != system_lyxrc.use_scalable_fonts) { os << "\\screen_font_scalable " diff --git a/src/lyxrc.h b/src/lyxrc.h index a8a1951aeb..da4a24f4e0 100644 --- a/src/lyxrc.h +++ b/src/lyxrc.h @@ -55,6 +55,9 @@ enum LyXRCTags { RC_SCREEN_FONT_ROMAN, RC_SCREEN_FONT_SANS, RC_SCREEN_FONT_TYPEWRITER, + RC_SCREEN_FONT_ROMAN_FOUNDRY, + RC_SCREEN_FONT_SANS_FOUNDRY, + RC_SCREEN_FONT_TYPEWRITER_FOUNDRY, RC_SCREEN_FONT_ENCODING, RC_POPUP_BOLD_FONT, RC_POPUP_NORMAL_FONT, @@ -242,6 +245,12 @@ enum LyXRCTags { /// string typewriter_font_name; /// + string roman_font_foundry; + /// + string sans_font_foundry; + /// + string typewriter_font_foundry; + /// string popup_bold_font; /// string popup_normal_font; -- 2.39.2