added some font stuff

This commit is contained in:
Derek Foreman 2003-03-16 22:34:05 +00:00
parent f8a47de5ec
commit aa68e45b19
2 changed files with 66 additions and 49 deletions

View file

@ -1,75 +1,77 @@
#include <stdlib.h>
#include <X11/Xft/Xft.h>
#include "../kernel/openbox.h"
#include "font.h" #include "font.h"
#include "../src/gettext.h" #include "../src/gettext.h"
#define _(str) gettext(str) #define _(str) gettext(str)
font_open(const std::string &fontstring, void font_startup(void)
bool shadow, unsigned char offset, unsigned char tint)
{ {
assert(screen_num >= 0); #ifdef DEBUG
assert(tint <= CHAR_MAX); int version;
#endif /* DEBUG */
if (!_xft_init) {
if (!XftInit(0)) { if (!XftInit(0)) {
printf(_("Couldn't initialize Xft.\n\n")); g_warning(_("Couldn't initialize Xft.\n\n"));
::exit(3); exit(3);
} }
#ifdef DEBUG #ifdef DEBUG
int version = XftGetVersion(); version = XftGetVersion();
printf("Using Xft %d.%d.%d (Built against %d.%d.%d).\n", g_message("Using Xft %d.%d.%d (Built against %d.%d.%d).\n",
version / 10000 % 100, version / 100 % 100, version % 100, version / 10000 % 100, version / 100 % 100, version % 100,
XFT_MAJOR, XFT_MINOR, XFT_REVISION); XFT_MAJOR, XFT_MINOR, XFT_REVISION);
#endif #endif
_xft_init = true;
} }
if ((_xftfont = XftFontOpenName(ob_display, _screen_num, ObFont *font_open(char *fontstring)
fontstring))) {
return; ObFont *out;
XftFont *xf;
printf(_("Unable to load font: %s\n"), _fontstring.c_str()); if ((xf = XftFontOpenName(ob_display, ob_screen, fontstring))) {
printf(_("Trying fallback font: %s\n"), "fixed"); out = malloc(sizeof(ObFont));
out->xftfont = xf;
return out;
}
g_warning(_("Unable to load font: %s\n"), fontstring);
g_warning(_("Trying fallback font: %s\n"), "fixed");
if ((_xftfont = XftFontOpenName(ob_display, _screen_num, if ((xf = XftFontOpenName(ob_display, ob_screen, "fixed"))) {
"fixed"))) out = malloc(sizeof(ObFont));
return; out->xftfont = xf;
return out;
printf(_("Unable to load font: %s\n"), "fixed"); }
printf(_("Aborting!.\n")); g_warning(_("Unable to load font: %s\n"), "fixed");
g_warning(_("Aborting!.\n"));
exit(3); // can't continue without a font exit(3); // can't continue without a font
} }
destroy_fonts(void) void font_close(ObFont *f)
{ {
if (_xftfont) XftFontClose(ob_display, f->xftfont);
XftFontClose(ob_display, _xftfont);
} }
int font_measure_string(const char *) int font_measure_string(ObFont *f, const char *str, int shadow, int offset)
{ {
XGlyphInfo info; XGlyphInfo info;
if (string.utf8()) XftTextExtentsUtf8(ob_display, f->xftfont,
XftTextExtentsUtf8(**display, _xftfont, (FcChar8*)str, strlen(str), &info);
(FcChar8*)string.c_str(), string.bytes(), &info);
else
XftTextExtents8(ob_display, _xftfont,
(FcChar8*)string.c_str(), string.bytes(), &info);
return (signed) info.xOff + (_shadow ? _offset : 0); return (signed) info.xOff + (shadow ? offset : 0);
} }
int font_height(void) int font_height(ObFont *f, int shadow, int offset)
{ {
return (signed) _xftfont->height + (_shadow ? _offset : 0); return (signed) f->xftfont->height + (shadow ? offset : 0);
} }
int font_max_char_width(void) int font_max_char_width(ObFont *f)
{ {
return (signed) _xftfont->max_advance_width; return (signed) f->xftfont->max_advance_width;
} }

15
render/font.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef __font_h
#define __font_h
#include <X11/Xft/Xft.h>
typedef struct {
XftFont *xftfont;
} ObFont;
void font_startup(void);
ObFont *font_open(char *fontstring);
void font_close(ObFont *f);
int font_measure_string(ObFont *f, const char *str, int shadow, int offset);
int font_height(ObFont *f, int shadow, int offset);
int font_max_char_width(ObFont *f);
#endif /* __font_h */