diff --git a/config/Makefile.am b/config/Makefile.am index 562776ea..80483b74 100644 --- a/config/Makefile.am +++ b/config/Makefile.am @@ -5,7 +5,7 @@ config_DATA = \ definitions \ actionclasses.cfg bindings.cfg matches.cfg menus.cfg \ e16keyedit.db \ - fonts.cfg.xft + fonts.cfg.xft fonts.cfg.pango menudir = $(ENLIGHTENMENT_ROOT)/config/menus menu_DATA = \ diff --git a/config/fonts.cfg.pango b/config/fonts.cfg.pango new file mode 100644 index 00000000..16820cb2 --- /dev/null +++ b/config/fonts.cfg.pango @@ -0,0 +1,35 @@ +/* Pango font example */ +#include +__E_CFG_VERSION 1 +__FONTS __BGN + +font-default "pango:sans bold 8" + +font-border "pango:sans bold 8" +font-border-italic "pango:sans italic 8" +font-border-small "pango:sans 6" + +font-coords "pango:sans bold 8" + +font-dialog "pango:sans 8" +font-dialog-hilite "pango:sans bold 8" +font-dialog-italic "pango:sans italic 8" + +font-epplet "pango:sans 6" +font-epplet-small "pango:sans 6" +font-epplet-medium "pango:sans 8" +font-epplet-large "pango:sans 10" + +font-focus "pango:sans bold 8" + +font-iconbox "pango:sans bold 8" + +font-init "pango:sans bold 9" + +font-menu "pango:sans 8" + +font-pager "pango:sans bold 8" + +font-tooltip "pango:sans bold 8" + +__END diff --git a/configure.in b/configure.in index 9769f4e4..e788dc4f 100644 --- a/configure.in +++ b/configure.in @@ -128,6 +128,13 @@ if test "x$enable_sm" = "xyes"; then AC_DEFINE(HAVE_SM, 1, [Session management support]) fi +AC_ARG_ENABLE(pango, + [ --enable-pango compile with pango-xft support @<:@default=no@:>@],, + enable_pango=no) +if test "x$enable_pango" = "xyes"; then + PKG_CHECK_MODULES(PANGO, pangoxft, AC_DEFINE(USE_PANGO, 1, [pango-xft support]), enable_pango=no) +fi + AC_ARG_ENABLE(xft, [ --enable-xft compile with Xft support @<:@default=yes@:>@],, enable_xft=yes) @@ -331,6 +338,7 @@ echo " Sound ........................ $enable_sound" echo " Old GNOME hints .............. $enable_hints_gnome" echo " Session management ........... $enable_sm" echo " Zoom ......................... $enable_zoom" +echo " Pango ........................ $enable_pango" echo " Xft .......................... $enable_xft" echo " Xinerama ..................... $enable_xinerama" echo " RandR ........................ $enable_xrandr" diff --git a/src/Makefile.am b/src/Makefile.am index 907c8b31..0f49ada1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -118,6 +118,7 @@ LDADD = \ $(ESD_LIBS) \ $(IMLIB2_LIBS) \ $(GLX_LIBS) \ + $(PANGO_LIBS) \ $(XFT_LIBS) \ $(X_LIBS) \ $(SM_LIBS) \ @@ -126,7 +127,7 @@ LDADD = \ $(E_X_LIBS) \ -lX11 -lm -INCLUDES = -I$(top_builddir) -I$(top_srcdir) $(ECORE_CFLAGS) $(ESD_CFLAGS) $(IMLIB2_CFLAGS) $(XFT_CFLAGS) $(X_CFLAGS) +INCLUDES = -I$(top_builddir) -I$(top_srcdir) $(ECORE_CFLAGS) $(ESD_CFLAGS) $(IMLIB2_CFLAGS) $(PANGO_CFLAGS) $(XFT_CFLAGS) $(X_CFLAGS) install-data-local: $(top_srcdir)/mkinstalldirs $(DESTDIR)$(ENLIGHTENMENT_ROOT)/themes diff --git a/src/tclass.h b/src/tclass.h index 152ae7fb..d9deae1f 100644 --- a/src/tclass.h +++ b/src/tclass.h @@ -36,11 +36,12 @@ #define FONT_TO_UP 2 #define FONT_TO_LEFT 3 -#define FONT_TYPE_UNKNOWN 0 -#define FONT_TYPE_IFT 1 /* Imlib2/FreeType */ -#define FONT_TYPE_XFT 2 /* Xft */ -#define FONT_TYPE_XFS 3 /* XFontSet */ -#define FONT_TYPE_XFONT 0 /* XFontStruct */ +#define FONT_TYPE_UNKNOWN 0 +#define FONT_TYPE_IFT 1 /* Imlib2/FreeType */ +#define FONT_TYPE_XFT 2 /* Xft */ +#define FONT_TYPE_XFS 3 /* XFontSet */ +#define FONT_TYPE_XFONT 0 /* XFontStruct */ +#define FONT_TYPE_PANGO_XFT 5 /* Pango-Xft */ typedef struct { diff --git a/src/text.c b/src/text.c index 7d353fb6..531699e2 100644 --- a/src/text.c +++ b/src/text.c @@ -26,6 +26,16 @@ #include "tclass.h" #include "xwin.h" +#ifdef USE_PANGO +#include +#include +/* If we have pango-xft we might as well also have xft */ +#undef USE_XFT +#define USE_XFT 1 +#else +#undef FONT_TYPE_PANGO_XFT +#endif + #ifdef USE_XFT #include #include @@ -559,6 +569,116 @@ const FontOps FontOpsXft = { }; #endif /* FONT_TYPE_XFT */ +#if FONT_TYPE_PANGO_XFT +/* + * Pango-Xft + */ +extern const FontOps FontOpsPangoXft; + +static PangoContext *_pango_ctx = NULL; + +/* Beware! The layout of FontCtxPangoXft must match FontCtxXft + * in order to reuse the _xft_Fdc... functions. */ +typedef struct +{ + PangoFontDescription *font; + Win win; + Drawable draw; + XftDraw *xftd; + XftColor xftc; +} FontCtxPangoXft; + +static int +_pango_xft_Load(TextState * ts, int fallback __UNUSED__) +{ + FontCtxPangoXft *fdc; + PangoFontDescription *font; + PangoFontMask flags; + const char *name; + + name = ts->fontname; + if (strncmp(name, "pango:", 6)) + return -1; + name += 6; + + if (!_pango_ctx) + _pango_ctx = pango_xft_get_context(disp, VRoot.scr); + if (!_pango_ctx) + return -1; + + font = pango_font_description_from_string(name); + if (!font) + return -1; + + flags = pango_font_description_get_set_fields(font); + if ((flags & PANGO_FONT_MASK_FAMILY) == 0) + pango_font_description_set_family(font, "sans"); + if ((flags & PANGO_FONT_MASK_SIZE) == 0) + pango_font_description_set_size(font, 10 * PANGO_SCALE); + + fdc = EMALLOC(FontCtxPangoXft, 1); + if (!fdc) + return -1; + fdc->font = font; + ts->fdc = fdc; + ts->need_utf8 = 1; + ts->type = FONT_TYPE_PANGO_XFT; + ts->ops = &FontOpsPangoXft; + return 0; +} + +static void +_pango_xft_Unload(TextState * ts) +{ + FontCtxPangoXft *fdc = (FontCtxPangoXft *) ts->fdc; + + pango_font_description_free(fdc->font); +} + +static void +_pango_xft_TextSize(TextState * ts, const char *text, int len __UNUSED__, + int *width, int *height, int *ascent) +{ + FontCtxPangoXft *fdc = (FontCtxPangoXft *) ts->fdc; + PangoLayout *layout; + PangoRectangle logical_rect; + + layout = pango_layout_new(_pango_ctx); + pango_layout_set_text(layout, text, -1); + pango_layout_set_font_description(layout, fdc->font); + pango_layout_get_extents(layout, NULL, &logical_rect); + + *width = PANGO_PIXELS(logical_rect.x + logical_rect.width); + *height = PANGO_PIXELS(logical_rect.height); + *ascent = PANGO_PIXELS(-logical_rect.y); + + g_object_unref(layout); +} + +static void +_pango_xft_TextDraw(TextState * ts, int x, int y, const char *text, + int len __UNUSED__) +{ + FontCtxPangoXft *fdc = (FontCtxPangoXft *) ts->fdc; + PangoLayout *layout; + + layout = pango_layout_new(_pango_ctx); + pango_layout_set_text(layout, text, -1); + pango_layout_set_font_description(layout, fdc->font); + + pango_xft_render_layout(fdc->xftd, &(fdc->xftc), layout, + x * PANGO_SCALE, y * PANGO_SCALE); + + g_object_unref(layout); +} + +const FontOps FontOpsPangoXft = { + _pango_xft_Load, _pango_xft_Unload, + _pango_xft_TextSize, TextstateTextFit, _pango_xft_TextDraw, + _xft_FdcInit, _xft_FdcFini, _xft_FdcSetDrawable, _xft_FdcSetColor +}; +#endif /* FONT_TYPE_PANGO_XFT */ + #if FONT_TYPE_XFS /* * XFontSet - XCreateFontSet @@ -852,6 +972,10 @@ TextStateLoadFont(TextState * ts) if (!FontOpsXfs.Load(ts, 0)) /* XFontSet - XCreateFontSet */ goto done; #endif +#if FONT_TYPE_PANGO_XFT + if (!FontOpsPangoXft.Load(ts, 0)) /* Pango-Xft */ + goto done; +#endif #if FONT_TYPE_XFT if (!FontOpsXft.Load(ts, 0)) /* Xft */ goto done;