]> Dogcows Code - chaz/openbox/blobdiff - otk/font.cc
better xft checks. require xft version 2
[chaz/openbox] / otk / font.cc
index 121f4fa7b5bb77449c6d2888f909c602eb5be2f8..ac76696e8ebedfb69b6ff1f13ae5ddccc968536d 100644 (file)
@@ -19,62 +19,75 @@ using std::endl;
 
 #include "font.hh"
 #include "util.hh"
-#include "gccache.hh"
+#include "display.hh"
 #include "color.hh"
 #include "screeninfo.hh"
 
+extern "C" {
+#ifdef    HAVE_STDIO_H
+#  include <stdio.h>
+#endif // HAVE_STDIO_H
+
+#include "gettext.h"
+#define _(str) gettext(str)
+}
+
 namespace otk {
 
-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
 }
 
 
-BFont::~BFont(void) {
+BFont::~BFont(void)
+{
   if (_xftfont)
     XftFontClose(OBDisplay::display, _xftfont);
 }
 
 
-void BFont::drawString(Drawable d, int x, int y, const BColor &color,
-                       const string &string) const {
-  assert(_valid);
-
-  const ScreenInfo *info = OBDisplay::screenInfo(_screen_num);
-  XftDraw *draw = XftDrawCreate(OBDisplay::display, d,
-                                info->getVisual(), info->getColormap());
-  assert(draw);
+void BFont::drawString(XftDraw *d, int x, int y, const BColor &color,
+                       const string &string, bool utf8) const
+{
+  assert(d);
 
   if (_shadow) {
     XftColor c;
@@ -84,10 +97,14 @@ void BFont::drawString(Drawable d, int x, int y, const BColor &color,
     c.color.alpha = _tint | _tint << 8; // transparent shadow
     c.pixel = BlackPixel(OBDisplay::display, _screen_num);
 
-    XftDrawString8(draw, &c, _xftfont, x + _offset,
-                   _xftfont->ascent + y + _offset,
-                   (XftChar8 *) string.c_str(),
-                   string.size());
+    if (utf8)
+      XftDrawStringUtf8(d, &c, _xftfont, x + _offset,
+                        _xftfont->ascent + y + _offset,
+                        (const FcChar8*)string.c_str(), string.size());
+    else
+      XftDrawString8(d, &c, _xftfont, x + _offset,
+                     _xftfont->ascent + y + _offset,
+                     (const FcChar8*)string.c_str(), string.size());
   }
     
   XftColor c;
@@ -97,36 +114,40 @@ void BFont::drawString(Drawable d, int x, int y, const BColor &color,
   c.pixel = color.pixel();
   c.color.alpha = 0xff | 0xff << 8; // no transparency in BColor yet
 
-  XftDrawString8(draw, &c, _xftfont, x, _xftfont->ascent + y,
-                 (XftChar8 *) string.c_str(), string.size());
+  if (utf8)
+    XftDrawStringUtf8(d, &c, _xftfont, x, _xftfont->ascent + y,
+                      (const FcChar8*)string.c_str(), string.size());
+  else
+    XftDrawString8(d, &c, _xftfont, x, _xftfont->ascent + y,
+                   (const FcChar8*)string.c_str(), string.size());
 
-  XftDrawDestroy(draw);
   return;
 }
 
 
-unsigned int BFont::measureString(const string &string) const {
-  assert(_valid);
-
+unsigned int BFont::measureString(const string &string, bool utf8) const
+{
   XGlyphInfo info;
 
-  XftTextExtents8(OBDisplay::display, _xftfont,
-                  (XftChar8 *) string.c_str(), string.size(), &info);
+  if (utf8)
+    XftTextExtentsUtf8(OBDisplay::display, _xftfont,
+                       (const FcChar8*)string.c_str(), string.size(), &info);
+  else
+    XftTextExtents8(OBDisplay::display, _xftfont,
+                    (const FcChar8*)string.c_str(), string.size(), &info);
 
   return info.xOff + (_shadow ? _offset : 0);
 }
 
 
-unsigned int BFont::height(void) const {
-  assert(_valid);
-
+unsigned int BFont::height(void) const
+{
   return _xftfont->height + (_shadow ? _offset : 0);
 }
 
 
-unsigned int BFont::maxCharWidth(void) const {
-  assert(_valid);
-
+unsigned int BFont::maxCharWidth(void) const
+{
   return _xftfont->max_advance_width;
 }
 
This page took 0.023178 seconds and 4 git commands to generate.