X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FFontLoader.C;h=273aab391029d1bbff6be2f8b632d2f5f09d4f1e;hb=dff2911bda426ad439e6475f62183cedd7044801;hp=77007f7461c0d29a0c8a47b9fa43e0b8a2fd4de6;hpb=77e706c44175f3cf71473a42d5db890c77b3b7b3;p=lyx.git diff --git a/src/FontLoader.C b/src/FontLoader.C index 77007f7461..273aab3910 100644 --- a/src/FontLoader.C +++ b/src/FontLoader.C @@ -1,4 +1,3 @@ -// -*- C++ -*- /* This file is part of * ====================================================== * @@ -11,20 +10,19 @@ #include #include // fabs() -#include // 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() + 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(); +}