]> git.lyx.org Git - lyx.git/commitdiff
lyxrc.*_font_foundry
authorDekel Tsur <dekelts@tau.ac.il>
Wed, 27 Nov 2002 21:49:50 +0000 (21:49 +0000)
committerDekel Tsur <dekelts@tau.ac.il>
Wed, 27 Nov 2002 21:49:50 +0000 (21:49 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5737 a592a061-630c-0410-9148-cb99ea01b6c8

12 files changed:
src/ChangeLog
src/frontends/qt2/ChangeLog
src/frontends/qt2/Makefile.am
src/frontends/qt2/QPrefs.C
src/frontends/qt2/qfont_loader.C
src/frontends/qt2/qt_helpers.C [new file with mode: 0644]
src/frontends/qt2/qt_helpers.h [new file with mode: 0644]
src/frontends/xforms/ChangeLog
src/frontends/xforms/FormPreferences.C
src/frontends/xforms/xfont_loader.C
src/lyxrc.C
src/lyxrc.h

index 7a4fba5b248aabff7e272b3e1693b819b7267ef3..ccd94505f07faca6cad3b4809316f66ed923e546 100644 (file)
@@ -1,3 +1,7 @@
+2002-11-27  Dekel Tsur  <dekelts@tau.ac.il>
+
+       * lyxrc.[Ch]: Add {roman,sans,typewriter}_font_foundry variables.
+
 2002-11-27  Lars Gullik Bjønnes  <larsbj@gullik.net>
 
        * tabular.C (asciiPrintCell): use string(size, char) instead of
index ef73b4fa0e405b182795aba26a8b646168a14eea..f9452814e55cbd3e23b640caec4cbe60f1f6ceb4 100644 (file)
@@ -1,3 +1,11 @@
+2002-11-27  Dekel Tsur  <dekelts@tau.ac.il>
+
+       * 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  <levon@movementarian.org>
 
        * qsetborder.h:
index 462deef45961afcdfd8ffa90005d72febc161f46..9ee32ce63af3122ede339da55bc55fc7ad5acb61 100644 (file)
@@ -83,6 +83,8 @@ libqt2_la_SOURCES = \
        qscreen.C \
        qsetborder.h \
        qsetborder.C \
+       qt_helpers.h \
+       qt_helpers.C \
        qttableview.h \
        qttableview.C \
        $(DIALOGSOURCES)
index 647024c0aac5b73d4f98082fdc4ad690ffb3af90..12eca4352886535a89a66c9a979b37071c01b421 100644 (file)
 #include "lyxrc.h"
 #include "frnt_lang.h"
 #include "helper_funcs.h"
+#include "qt_helpers.h"
 #include "debug.h"
 
+#include <boost/tuple/tuple.hpp>
+
 #include <qpushbutton.h>
 #include <qcheckbox.h>
 #include <qlineedit.h>
@@ -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<A> 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<string, string> 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());
index 2e34c41b8d809d6f5ae8bdce31cfd5080b9294ba..458405258716d708fe561b13847ae1a5f9a005cb 100644 (file)
@@ -20,6 +20,7 @@
 #include "debug.h"
 #include "lyxrc.h"
 #include "BufferView.h"
+#include "qt_helpers.h"
 
 #include <qglobal.h>
 #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 (file)
index 0000000..2c0beed
--- /dev/null
@@ -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 <config.h>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "qt_helpers.h"
+
+#include <qglobal.h>
+
+
+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<string,string> 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 (file)
index 0000000..244db7b
--- /dev/null
@@ -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 <utility>
+
+string makeFontName(string const & family, string const & foundry);
+std::pair<string,string> parseFontName(string const & name);
+
+#endif // QTHELPERS_H
index 3556f4ad7b420a7661014d3e17072eacc3e12a4c..fe292594e086579c1e953682233e7d95845a8a79 100644 (file)
@@ -1,3 +1,9 @@
+2002-11-27  Dekel Tsur  <dekelts@tau.ac.il>
+
+       * xfont_loader.C (getFontinfo): Use lyxrc.*_font_foundry.
+
+       * FormPreferences.C: Handle lyxrc.*_font_foundry.
+
 2002-11-27  Angus Leeming  <leeming@lyx.org>
 
        * forms/fdfix.sh:
index af881c7581ad2e3b0c5c97a480443fa0d70bbc0d..1b613f8287c6707b1f2221ec2becd5110bb7f42e 100644 (file)
@@ -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<string,string> 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<string, string> 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,
index 5b1931f96a1addfb1e3a6a190eb0ff17453683fc..9801f10f4800a66c4e586636982b855ff98a1f90 100644 (file)
@@ -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;
                        }
index 81b5ab85472e3f404bc704df4823ca1a0a610dd3..19ebfb0c531f258beb316d53c30859d95b288b27 100644 (file)
@@ -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 "
index a8a1951aebd7ebd1619ae84adf7ef1c58513bc64..da4a24f4e0c71a571870ea02182e14fd241cb07a 100644 (file)
@@ -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;