sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

tabbed-0.6-xft.diff (6605B)


      1 diff --git a/config.def.h b/config.def.h
      2 index ceda9f7..bc7cfe2 100644
      3 --- a/config.def.h
      4 +++ b/config.def.h
      5 @@ -1,7 +1,7 @@
      6  /* See LICENSE file for copyright and license details. */
      7  
      8  /* appearance */
      9 -static const char font[]        = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
     10 +static const char font[]        = "monospace-9";
     11  static const char* normbgcolor  = "#222222";
     12  static const char* normfgcolor  = "#cccccc";
     13  static const char* selbgcolor   = "#555555";
     14 diff --git a/config.mk b/config.mk
     15 index 5279711..037f9d7 100644
     16 --- a/config.mk
     17 +++ b/config.mk
     18 @@ -8,8 +8,8 @@ PREFIX = /usr/local
     19  MANPREFIX = ${PREFIX}/share/man
     20  
     21  # includes and libs
     22 -INCS = -I. -I/usr/include
     23 -LIBS = -L/usr/lib -lc -lX11
     24 +INCS = -I. -I/usr/include -I/usr/include/freetype2
     25 +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft
     26  
     27  # flags
     28  CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE
     29 diff --git a/tabbed.c b/tabbed.c
     30 index d30206b..d08348c 100644
     31 --- a/tabbed.c
     32 +++ b/tabbed.c
     33 @@ -15,6 +15,7 @@
     34  #include <X11/Xproto.h>
     35  #include <X11/Xutil.h>
     36  #include <X11/XKBlib.h>
     37 +#include <X11/Xft/Xft.h>
     38  
     39  #include "arg.h"
     40  
     41 @@ -64,16 +65,15 @@ typedef struct {
     42  
     43  typedef struct {
     44  	int x, y, w, h;
     45 -	unsigned long norm[ColLast];
     46 -	unsigned long sel[ColLast];
     47 +	XftColor norm[ColLast];
     48 +	XftColor sel[ColLast];
     49  	Drawable drawable;
     50  	GC gc;
     51  	struct {
     52  		int ascent;
     53  		int descent;
     54  		int height;
     55 -		XFontSet set;
     56 -		XFontStruct *xfont;
     57 +		XftFont *xfont;
     58  	} font;
     59  } DC; /* draw context */
     60  
     61 @@ -95,7 +95,7 @@ static void createnotify(const XEvent *e);
     62  static void destroynotify(const XEvent *e);
     63  static void die(const char *errstr, ...);
     64  static void drawbar(void);
     65 -static void drawtext(const char *text, unsigned long col[ColLast]);
     66 +static void drawtext(const char *text, XftColor col[ColLast]);
     67  static void *emallocz(size_t size);
     68  static void *erealloc(void *o, size_t size);
     69  static void expose(const XEvent *e);
     70 @@ -105,7 +105,7 @@ static void focusonce(const Arg *arg);
     71  static void fullscreen(const Arg *arg);
     72  static char* getatom(int a);
     73  static int getclient(Window w);
     74 -static unsigned long getcolor(const char *colstr);
     75 +static XftColor getcolor(const char *colstr);
     76  static int getfirsttab(void);
     77  static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
     78  static void initfont(const char *fontstr);
     79 @@ -219,12 +219,6 @@ cleanup(void) {
     80  	free(clients);
     81  	clients = NULL;
     82  
     83 -	if(dc.font.set) {
     84 -		XFreeFontSet(dpy, dc.font.set);
     85 -	} else {
     86 -		XFreeFont(dpy, dc.font.xfont);
     87 -	}
     88 -
     89  	XFreePixmap(dpy, dc.drawable);
     90  	XFreeGC(dpy, dc.gc);
     91  	XDestroyWindow(dpy, win);
     92 @@ -305,7 +299,7 @@ die(const char *errstr, ...) {
     93  
     94  void
     95  drawbar(void) {
     96 -	unsigned long *col;
     97 +	XftColor *col;
     98  	int c, fc, width, n = 0;
     99  	char *name = NULL;
    100  
    101 @@ -362,12 +356,13 @@ drawbar(void) {
    102  }
    103  
    104  void
    105 -drawtext(const char *text, unsigned long col[ColLast]) {
    106 +drawtext(const char *text, XftColor col[ColLast]) {
    107  	int i, x, y, h, len, olen;
    108  	char buf[256];
    109 +	XftDraw *d;
    110  	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
    111  
    112 -	XSetForeground(dpy, dc.gc, col[ColBG]);
    113 +	XSetForeground(dpy, dc.gc, col[ColBG].pixel);
    114  	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
    115  	if(!text)
    116  		return;
    117 @@ -388,13 +383,10 @@ drawtext(const char *text, unsigned long col[ColLast]) {
    118  		for(i = len; i && i > len - 3; buf[--i] = '.');
    119  	}
    120  
    121 -	XSetForeground(dpy, dc.gc, col[ColFG]);
    122 -	if(dc.font.set) {
    123 -		XmbDrawString(dpy, dc.drawable, dc.font.set,
    124 -				dc.gc, x, y, buf, len);
    125 -	} else {
    126 -		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    127 -	}
    128 +	d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen));
    129 +
    130 +	XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
    131 +	XftDrawDestroy(d);
    132  }
    133  
    134  void *
    135 @@ -524,15 +516,14 @@ getclient(Window w) {
    136  	return -1;
    137  }
    138  
    139 -unsigned long
    140 +XftColor
    141  getcolor(const char *colstr) {
    142 -	Colormap cmap = DefaultColormap(dpy, screen);
    143 -	XColor color;
    144 +	XftColor color;
    145  
    146 -	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
    147 +	if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
    148  		die("tabbed: cannot allocate color '%s'\n", colstr);
    149  
    150 -	return color.pixel;
    151 +	return color;
    152  }
    153  
    154  int
    155 @@ -585,41 +576,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
    156  
    157  void
    158  initfont(const char *fontstr) {
    159 -	char *def, **missing, **font_names;
    160 -	int i, n;
    161 -	XFontStruct **xfonts;
    162 -
    163 -	missing = NULL;
    164 -	if(dc.font.set)
    165 -		XFreeFontSet(dpy, dc.font.set);
    166 -
    167 -	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
    168 -	if(missing) {
    169 -		while(n--)
    170 -			fprintf(stderr, "tabbed: missing fontset: %s\n", missing[n]);
    171 -		XFreeStringList(missing);
    172 -	}
    173 +	if(!(dc.font.xfont = XftFontOpenName(dpy, screen, fontstr))
    174 +	&& !(dc.font.xfont = XftFontOpenName(dpy, screen, "fixed")))
    175 +		die("error, cannot load font: '%s'\n", fontstr);
    176  
    177 -	if(dc.font.set) {
    178 -		dc.font.ascent = dc.font.descent = 0;
    179 -		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
    180 -		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
    181 -			dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
    182 -			dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
    183 -			xfonts++;
    184 -		}
    185 -	} else {
    186 -		if(dc.font.xfont)
    187 -			XFreeFont(dpy, dc.font.xfont);
    188 -		dc.font.xfont = NULL;
    189 -		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
    190 -				&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) {
    191 -			die("tabbed: cannot load font: '%s'\n", fontstr);
    192 -		}
    193 -
    194 -		dc.font.ascent = dc.font.xfont->ascent;
    195 -		dc.font.descent = dc.font.xfont->descent;
    196 -	}
    197 +	dc.font.ascent = dc.font.xfont->ascent;
    198 +	dc.font.descent = dc.font.xfont->descent;
    199  	dc.font.height = dc.font.ascent + dc.font.descent;
    200  }
    201  
    202 @@ -972,11 +934,9 @@ setup(void) {
    203  	dc.drawable = XCreatePixmap(dpy, root, ww, wh,
    204  			DefaultDepth(dpy, screen));
    205  	dc.gc = XCreateGC(dpy, root, 0, 0);
    206 -	if(!dc.font.set)
    207 -		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
    208  
    209  	win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0,
    210 -			dc.norm[ColFG], dc.norm[ColBG]);
    211 +			dc.norm[ColFG].pixel, dc.norm[ColBG].pixel);
    212  	XMapRaised(dpy, win);
    213  	XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask|
    214  			ButtonPressMask|ExposureMask|KeyPressMask|PropertyChangeMask|
    215 @@ -1040,15 +1000,9 @@ spawn(const Arg *arg) {
    216  
    217  int
    218  textnw(const char *text, unsigned int len) {
    219 -	XRectangle r;
    220 -
    221 -	if(dc.font.set) {
    222 -		XmbTextExtents(dc.font.set, text, len, NULL, &r);
    223 -
    224 -		return r.width;
    225 -	}
    226 -
    227 -	return XTextWidth(dc.font.xfont, text, len);
    228 +	XGlyphInfo ext;
    229 +	XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
    230 +	return ext.xOff;
    231  }
    232  
    233  void