-string BFont::_fallback_font = "fixed";
-
-BFont::BFont(int screen_num, const string &family, int size,
- bool bold, bool italic, bool shadow, unsigned char offset,
- unsigned char tint, bool antialias) :
- _screen_num(screen_num),
- _family(family),
- _simplename(False),
- _size(size),
- _bold(bold),
- _italic(italic),
- _antialias(antialias),
- _shadow(shadow),
- _offset(offset),
- _tint(tint),
- _xftfont(0) {
- _valid = False;
-
- _xftfont = XftFontOpen(OBDisplay::display, _screen_num,
- XFT_FAMILY, XftTypeString, _family.c_str(),
- XFT_SIZE, XftTypeInteger, _size,
- XFT_WEIGHT, XftTypeInteger, (_bold ?
- XFT_WEIGHT_BOLD :
- XFT_WEIGHT_MEDIUM),
- XFT_SLANT, XftTypeInteger, (_italic ?
- XFT_SLANT_ITALIC :
- XFT_SLANT_ROMAN),
- XFT_ANTIALIAS, XftTypeBool, _antialias,
- 0);
- if (! _xftfont)
- return; // failure
-
- _valid = True;
+string BFont::_fallback_font = "fixed";
+bool BFont::_xft_init = false;
+
+BFont::BFont(int screen_num, const string &fontstring,
+ bool shadow, unsigned char offset, unsigned char tint)
+ : _screen_num(screen_num),
+ _fontstring(fontstring),
+ _shadow(shadow),
+ _offset(offset),
+ _tint(tint),
+ _xftfont(0)
+{
+ assert(screen_num >= 0);
+ assert(tint <= CHAR_MAX);
+
+ if (!_xft_init) {
+ if (!XftInit(0)) {
+ printf(_("Couldn't initialize Xft version %d.%d.%d.\n\n"),
+ XFT_MAJOR, XFT_MINOR, XFT_REVISION);
+ ::exit(3);
+ }
+ printf(_("Using Xft %d.%d.%d.\n"), XFT_MAJOR, XFT_MINOR, XFT_REVISION);
+ _xft_init = true;
+ }
+
+ if ((_xftfont = XftFontOpenName(OBDisplay::display, _screen_num,
+ _fontstring.c_str())))
+ return;
+
+ printf(_("Unable to load font: %s"), _fontstring.c_str());
+ printf(_("Trying fallback font: %s\n"), _fallback_font.c_str());
+
+ if ((_xftfont = XftFontOpenName(OBDisplay::display, _screen_num,
+ _fallback_font.c_str())))
+ return;
+
+ printf(_("Unable to load font: %s"), _fallback_font.c_str());
+ printf(_("Aborting!.\n"));
+
+ ::exit(3); // can't continue without a font