tabbed-0.6-xft.diff (6590B)
- diff --git a/config.def.h b/config.def.h
- index ceda9f7..bc7cfe2 100644
- --- a/config.def.h
- +++ b/config.def.h
- @@ -1,7 +1,7 @@
- /* See LICENSE file for copyright and license details. */
- /* appearance */
- -static const char font[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
- +static const char font[] = "monospace-9";
- static const char* normbgcolor = "#222222";
- static const char* normfgcolor = "#cccccc";
- static const char* selbgcolor = "#555555";
- diff --git a/config.mk b/config.mk
- index 5279711..037f9d7 100644
- --- a/config.mk
- +++ b/config.mk
- @@ -8,8 +8,8 @@ PREFIX = /usr/local
- MANPREFIX = ${PREFIX}/share/man
- # includes and libs
- -INCS = -I. -I/usr/include
- -LIBS = -lX11
- +INCS = -I. -I/usr/include -I/usr/include/freetype2
- +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft
- # flags
- CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE
- diff --git a/tabbed.c b/tabbed.c
- index d30206b..d08348c 100644
- --- a/tabbed.c
- +++ b/tabbed.c
- @@ -15,6 +15,7 @@
- #include <X11/Xproto.h>
- #include <X11/Xutil.h>
- #include <X11/XKBlib.h>
- +#include <X11/Xft/Xft.h>
- #include "arg.h"
- @@ -64,16 +65,15 @@ typedef struct {
- typedef struct {
- int x, y, w, h;
- - unsigned long norm[ColLast];
- - unsigned long sel[ColLast];
- + XftColor norm[ColLast];
- + XftColor sel[ColLast];
- Drawable drawable;
- GC gc;
- struct {
- int ascent;
- int descent;
- int height;
- - XFontSet set;
- - XFontStruct *xfont;
- + XftFont *xfont;
- } font;
- } DC; /* draw context */
- @@ -95,7 +95,7 @@ static void createnotify(const XEvent *e);
- static void destroynotify(const XEvent *e);
- static void die(const char *errstr, ...);
- static void drawbar(void);
- -static void drawtext(const char *text, unsigned long col[ColLast]);
- +static void drawtext(const char *text, XftColor col[ColLast]);
- static void *emallocz(size_t size);
- static void *erealloc(void *o, size_t size);
- static void expose(const XEvent *e);
- @@ -105,7 +105,7 @@ static void focusonce(const Arg *arg);
- static void fullscreen(const Arg *arg);
- static char* getatom(int a);
- static int getclient(Window w);
- -static unsigned long getcolor(const char *colstr);
- +static XftColor getcolor(const char *colstr);
- static int getfirsttab(void);
- static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
- static void initfont(const char *fontstr);
- @@ -219,12 +219,6 @@ cleanup(void) {
- free(clients);
- clients = NULL;
- - if(dc.font.set) {
- - XFreeFontSet(dpy, dc.font.set);
- - } else {
- - XFreeFont(dpy, dc.font.xfont);
- - }
- -
- XFreePixmap(dpy, dc.drawable);
- XFreeGC(dpy, dc.gc);
- XDestroyWindow(dpy, win);
- @@ -305,7 +299,7 @@ die(const char *errstr, ...) {
- void
- drawbar(void) {
- - unsigned long *col;
- + XftColor *col;
- int c, fc, width, n = 0;
- char *name = NULL;
- @@ -362,12 +356,13 @@ drawbar(void) {
- }
- void
- -drawtext(const char *text, unsigned long col[ColLast]) {
- +drawtext(const char *text, XftColor col[ColLast]) {
- int i, x, y, h, len, olen;
- char buf[256];
- + XftDraw *d;
- XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- - XSetForeground(dpy, dc.gc, col[ColBG]);
- + XSetForeground(dpy, dc.gc, col[ColBG].pixel);
- XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
- if(!text)
- return;
- @@ -388,13 +383,10 @@ drawtext(const char *text, unsigned long col[ColLast]) {
- for(i = len; i && i > len - 3; buf[--i] = '.');
- }
- - XSetForeground(dpy, dc.gc, col[ColFG]);
- - if(dc.font.set) {
- - XmbDrawString(dpy, dc.drawable, dc.font.set,
- - dc.gc, x, y, buf, len);
- - } else {
- - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
- - }
- + d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen));
- +
- + XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
- + XftDrawDestroy(d);
- }
- void *
- @@ -524,15 +516,14 @@ getclient(Window w) {
- return -1;
- }
- -unsigned long
- +XftColor
- getcolor(const char *colstr) {
- - Colormap cmap = DefaultColormap(dpy, screen);
- - XColor color;
- + XftColor color;
- - if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
- + if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
- die("tabbed: cannot allocate color '%s'\n", colstr);
- - return color.pixel;
- + return color;
- }
- int
- @@ -585,41 +576,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
- void
- initfont(const char *fontstr) {
- - char *def, **missing, **font_names;
- - int i, n;
- - XFontStruct **xfonts;
- -
- - missing = NULL;
- - if(dc.font.set)
- - XFreeFontSet(dpy, dc.font.set);
- -
- - dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
- - if(missing) {
- - while(n--)
- - fprintf(stderr, "tabbed: missing fontset: %s\n", missing[n]);
- - XFreeStringList(missing);
- - }
- + if(!(dc.font.xfont = XftFontOpenName(dpy, screen, fontstr))
- + && !(dc.font.xfont = XftFontOpenName(dpy, screen, "fixed")))
- + die("error, cannot load font: '%s'\n", fontstr);
- - if(dc.font.set) {
- - dc.font.ascent = dc.font.descent = 0;
- - n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
- - for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
- - dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
- - dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
- - xfonts++;
- - }
- - } else {
- - if(dc.font.xfont)
- - XFreeFont(dpy, dc.font.xfont);
- - dc.font.xfont = NULL;
- - if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
- - && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) {
- - die("tabbed: cannot load font: '%s'\n", fontstr);
- - }
- -
- - dc.font.ascent = dc.font.xfont->ascent;
- - dc.font.descent = dc.font.xfont->descent;
- - }
- + dc.font.ascent = dc.font.xfont->ascent;
- + dc.font.descent = dc.font.xfont->descent;
- dc.font.height = dc.font.ascent + dc.font.descent;
- }
- @@ -972,11 +934,9 @@ setup(void) {
- dc.drawable = XCreatePixmap(dpy, root, ww, wh,
- DefaultDepth(dpy, screen));
- dc.gc = XCreateGC(dpy, root, 0, 0);
- - if(!dc.font.set)
- - XSetFont(dpy, dc.gc, dc.font.xfont->fid);
- win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0,
- - dc.norm[ColFG], dc.norm[ColBG]);
- + dc.norm[ColFG].pixel, dc.norm[ColBG].pixel);
- XMapRaised(dpy, win);
- XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask|
- ButtonPressMask|ExposureMask|KeyPressMask|PropertyChangeMask|
- @@ -1040,15 +1000,9 @@ spawn(const Arg *arg) {
- int
- textnw(const char *text, unsigned int len) {
- - XRectangle r;
- -
- - if(dc.font.set) {
- - XmbTextExtents(dc.font.set, text, len, NULL, &r);
- -
- - return r.width;
- - }
- -
- - return XTextWidth(dc.font.xfont, text, len);
- + XGlyphInfo ext;
- + XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
- + return ext.xOff;
- }
- void