]> git.lyx.org Git - lyx.git/blobdiff - src/FontLoader.C
write \mathrm{x}\mathrm{y} as \mathrm{xy} again
[lyx.git] / src / FontLoader.C
index 6938348f6e9b9b1d5a34b7b22461cc7842c515a2..273aab391029d1bbff6be2f8b632d2f5f09d4f1e 100644 (file)
@@ -1,4 +1,3 @@
-// -*- C++ -*-
 /* This file is part of
  * ====================================================== 
  * 
 
 #include <config.h>
 #include <cmath>       // fabs()
-#include <cstdlib>     // atoi()
 
 #ifdef __GNUG__
 #pragma implementation "FontLoader.h"
 #endif
 
-#include "gettext.h"
 #include "FontLoader.h"
 #include "FontInfo.h"
+#include "gettext.h"
 #include "debug.h"
 #include "lyxrc.h"     // lyxrc.font_*
 #include "BufferView.h"
 #include "LyXView.h"
-#include "minibuffer.h"
+#include "frontends/GUIRunTime.h"
 
 using std::endl;
 
@@ -41,12 +39,14 @@ FontLoader::FontLoader()
        reset();
 }
 
+
 // Destroy font loader
 FontLoader::~FontLoader()
 {
        unload();
 }
 
+
 // Update fonts after zoom, dpi, font names, or norm change
 // For now, we just ditch all fonts we have. Later, we should
 // reuse the ones that are already loaded.
@@ -55,40 +55,43 @@ void FontLoader::update()
        unload();
 }
 
+
 // Reset font loader
 void FontLoader::reset()
 {
        // Clear font infos, font structs and font metrics
-       for (int i1 = 0; i1<4; i1++)
-               for (int i2 = 0; i2<2; i2++)
-                       for (int i3 = 0; i3<4; i3++) {
+       for (int i1 = 0; i1 < LyXFont::NUM_FAMILIES; ++i1)
+               for (int i2 = 0; i2 < 2; ++i2)
+                       for (int i3 = 0; i3 < 4; ++i3) {
                                fontinfo[i1][i2][i3] = 0;
-                               for (int i4 = 0; i4<10; i4++) {
+                               for (int i4 = 0; i4<10; ++i4) {
                                        fontstruct[i1][i2][i3][i4] = 0;
                                }
                        }
 }
 
+
 // Unload all fonts
 void FontLoader::unload() 
 {
        // Unload all fonts
-       for (int i1 = 0; i1<4; i1++)
-               for (int i2 = 0; i2<2; i2++)
-                       for (int i3 = 0; i3<4; i3++) {
+       for (int i1 = 0; i1 < LyXFont::NUM_FAMILIES; ++i1)
+               for (int i2 = 0; i2 < 2; ++i2)
+                       for (int i3 = 0; i3 < 4; ++i3) {
                                if (fontinfo[i1][i2][i3]) {
                                        delete fontinfo[i1][i2][i3];
                                        fontinfo[i1][i2][i3] = 0;
                                }
-                               for (int i4 = 0; i4<10; i4++) {
+                               for (int i4 = 0; i4 < 10; ++i4) {
                                        if (fontstruct[i1][i2][i3][i4]) {
-                                               XFreeFont(fl_display, fontstruct[i1][i2][i3][i4]);
+                                               XFreeFont(GUIRunTime::x11Display(), fontstruct[i1][i2][i3][i4]);
                                                fontstruct[i1][i2][i3][i4] = 0;
                                        }
                                }
                        }
 }
 
+
 // Get font info
 /* Takes care of finding which font that can match the given request. Tries
 different alternatives. */
@@ -100,11 +103,48 @@ void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
        if (fontinfo[family][series][shape] != 0)
                return;
 
-       // Special code for the symbol family
-       if (family == LyXFont::SYMBOL_FAMILY){
-               fontinfo[family][series][shape] = new FontInfo("-*-symbol-*");
-               return;
+       // Special fonts
+       switch (family) 
+       {
+               case LyXFont::SYMBOL_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-symbol-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMR_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmr-medium-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMSY_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmsy-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMM_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmmi-medium-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMEX_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmex-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::MSA_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-msam-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::MSB_FAMILY:
+                       fontinfo[family][series][shape] = 
+                               new FontInfo("-*-msbm-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               default:
+                       break;
        }
 
        // Normal font. Let's search for an existing name that matches.
        string ffamily;
@@ -205,9 +245,13 @@ void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
 }
 
 
-// A dummy fontstruct used when there is no gui. 
-static XFontStruct dummyXFontStruct;
-static bool dummyXFontStructisGood = false;
+// A dummy fontstruct used when there is no gui.
+namespace {
+
+XFontStruct dummyXFontStruct;
+bool dummyXFontStructisGood = false;
+
+} // namespace anon
 
 /// Do load font
 XFontStruct * FontLoader::doLoad(LyXFont::FONT_FAMILY family, 
@@ -243,16 +287,16 @@ XFontStruct * FontLoader::doLoad(LyXFont::FONT_FAMILY family,
 
        XFontStruct * fs = 0;
 
-       current_view->owner()->getMiniBuffer()->Store();
-       current_view->owner()->getMiniBuffer()->Set(_("Loading font into X-Server..."));
-       fs = XLoadQueryFont(fl_display, font.c_str());
+       current_view->owner()->messagePush(_("Loading font into X-Server..."));
+
+       fs = XLoadQueryFont(GUIRunTime::x11Display(), font.c_str());
        
        if (fs == 0) {
                if (font == "fixed") {
                        lyxerr << "We're doomed. Can't get 'fixed' font." << endl;
                } else {
                        lyxerr << "Could not get font. Using 'fixed'." << endl;
-                       fs = XLoadQueryFont(fl_display, "fixed");
+                       fs = XLoadQueryFont(GUIRunTime::x11Display(), "fixed");
                }
        } else if (lyxerr.debugging(Debug::FONT)) {
                // Tell user the font matching
@@ -265,14 +309,25 @@ XFontStruct * FontLoader::doLoad(LyXFont::FONT_FAMILY family,
                f.setEmph(LyXFont::INHERIT);
                f.setUnderbar(LyXFont::INHERIT);
                f.setNoun(LyXFont::INHERIT);
-               f.setLatex(LyXFont::INHERIT);
                f.setColor(LColor::inherit);
                lyxerr << "Font '" << f.stateText(0) 
                       << "' matched by\n" << font << endl;
        }
 
-       current_view->owner()->getMiniBuffer()->Reset();
+       current_view->owner()->messagePop();
 
        fontstruct[family][series][shape][size] = fs;
        return fs;
 }
+
+
+bool FontLoader::available(LyXFont const & f)
+{
+       if (!lyxrc.use_gui)
+               return false;
+
+       if (!fontinfo[f.family()][f.series()][f.realShape()])
+               getFontinfo(f.family(), f.series(), f.realShape());
+       return fontinfo[f.family()][f.series()][f.realShape()]
+               ->getFontname(f.size()).size();
+}