tabbed

tab interface for application supporting Xembed
git clone git://git.suckless.org/tabbed
Log | Files | Refs | README | LICENSE

commit 3c79bcb40808c31a9f8f47538f4f8d5c489b7f60
parent 8920c1ba196df53a8ca06c179a3aa3ee260a6935
Author: Lucas Gabriel Vuotto <l.vuotto92@gmail.com>
Date:   Sat, 13 Feb 2016 18:42:14 -0300

Added xft support

Based on xft tabbed patch from the wiki.

Signed-off-by: Lucas Gabriel Vuotto <l.vuotto92@gmail.com>
Signed-off-by: Christoph Lohmann <20h@r-36.net>

Diffstat:
Mconfig.def.h | 2+-
Mconfig.mk | 4++--
Mtabbed.c | 99++++++++++++++++++++++---------------------------------------------------------
3 files changed, 30 insertions(+), 75 deletions(-)

diff --git 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:size=9"; static const char* normbgcolor = "#222222"; static const char* normfgcolor = "#cccccc"; static const char* selbgcolor = "#555555"; diff --git 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 = -L/usr/lib -lc -lX11 +INCS = -I. -I/usr/include -I/usr/include/freetype2 +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft # flags CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE diff --git 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,17 +65,16 @@ typedef struct { typedef struct { int x, y, w, h; - unsigned long norm[ColLast]; - unsigned long sel[ColLast]; - unsigned long urg[ColLast]; + XftColor norm[ColLast]; + XftColor sel[ColLast]; + XftColor urg[ColLast]; Drawable drawable; GC gc; struct { int ascent; int descent; int height; - XFontSet set; - XFontStruct *xfont; + XftFont *xfont; } font; } DC; /* draw context */ @@ -96,7 +96,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 *ecalloc(size_t n, size_t size); static void *erealloc(void *o, size_t size); static void expose(const XEvent *e); @@ -107,7 +107,7 @@ static void focusurgent(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); @@ -223,11 +223,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); @@ -314,7 +309,7 @@ die(const char *errstr, ...) void drawbar(void) { - unsigned long *col; + XftColor *col; int c, cc, fc, width; char *name = NULL; @@ -367,13 +362,14 @@ drawbar(void) } void -drawtext(const char *text, unsigned long col[ColLast]) +drawtext(const char *text, XftColor col[ColLast]) { int i, j, 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; @@ -397,12 +393,9 @@ drawtext(const char *text, unsigned long col[ColLast]) ; } - 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 * @@ -560,16 +553,15 @@ 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("%s: cannot allocate color '%s'\n", argv0, colstr); - return color.pixel; + return color; } int @@ -621,42 +613,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) void initfont(const char *fontstr) { - char *def, **missing, **font_names; - XFontStruct **xfonts; - int i, n; - - 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, "%s: missing fontset: %s\n", - argv0, 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("%s: cannot load font: '%s'\n", argv0, 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; } @@ -1057,11 +1019,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 | @@ -1131,14 +1091,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