sites

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

dwm-6.0-xft.diff (8146B)


      1 diff --git a/config.def.h b/config.def.h
      2 index 77ff358..a355bf0 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[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
     10 +static const char font[]            = "monospace-9";
     11  static const char normbordercolor[] = "#444444";
     12  static const char normbgcolor[]     = "#222222";
     13  static const char normfgcolor[]     = "#bbbbbb";
     14 diff --git a/config.mk b/config.mk
     15 index 484554a..a09be79 100644
     16 --- a/config.mk
     17 +++ b/config.mk
     18 @@ -15,8 +15,8 @@ XINERAMALIBS = -L${X11LIB} -lXinerama
     19  XINERAMAFLAGS = -DXINERAMA
     20  
     21  # includes and libs
     22 -INCS = -I. -I/usr/include -I${X11INC}
     23 -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
     24 +INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2
     25 +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft
     26  
     27  # flags
     28  CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
     29 diff --git a/dwm.c b/dwm.c
     30 index 1d78655..9587e77 100644
     31 --- a/dwm.c
     32 +++ b/dwm.c
     33 @@ -39,6 +39,7 @@
     34  #ifdef XINERAMA
     35  #include <X11/extensions/Xinerama.h>
     36  #endif /* XINERAMA */
     37 +#include <X11/Xft/Xft.h>
     38  
     39  /* macros */
     40  #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
     41 @@ -99,16 +100,15 @@ struct Client {
     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 @@ -178,15 +178,15 @@ static void die(const char *errstr, ...);
     62  static Monitor *dirtomon(int dir);
     63  static void drawbar(Monitor *m);
     64  static void drawbars(void);
     65 -static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
     66 -static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
     67 +static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
     68 +static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
     69  static void enternotify(XEvent *e);
     70  static void expose(XEvent *e);
     71  static void focus(Client *c);
     72  static void focusin(XEvent *e);
     73  static void focusmon(const Arg *arg);
     74  static void focusstack(const Arg *arg);
     75 -static unsigned long getcolor(const char *colstr);
     76 +static XftColor getcolor(const char *colstr);
     77  static Bool getrootptr(int *x, int *y);
     78  static long getstate(Window w);
     79  static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
     80 @@ -485,10 +485,6 @@ cleanup(void) {
     81  	for(m = mons; m; m = m->next)
     82  		while(m->stack)
     83  			unmanage(m->stack, False);
     84 -	if(dc.font.set)
     85 -		XFreeFontSet(dpy, dc.font.set);
     86 -	else
     87 -		XFreeFont(dpy, dc.font.xfont);
     88  	XUngrabKey(dpy, AnyKey, AnyModifier, root);
     89  	XFreePixmap(dpy, dc.drawable);
     90  	XFreeGC(dpy, dc.gc);
     91 @@ -719,7 +715,7 @@ void
     92  drawbar(Monitor *m) {
     93  	int x;
     94  	unsigned int i, occ = 0, urg = 0;
     95 -	unsigned long *col;
     96 +	XftColor *col;
     97  	Client *c;
     98  
     99  	for(c = m->clients; c; c = c->next) {
    100 @@ -774,10 +770,10 @@ drawbars(void) {
    101  }
    102  
    103  void
    104 -drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
    105 +drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
    106  	int x;
    107  
    108 -	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
    109 +	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
    110  	x = (dc.font.ascent + dc.font.descent + 2) / 4;
    111  	if(filled)
    112  		XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
    113 @@ -786,11 +782,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
    114  }
    115  
    116  void
    117 -drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
    118 +drawtext(const char *text, XftColor col[ColLast], Bool invert) {
    119  	char buf[256];
    120  	int i, x, y, h, len, olen;
    121 +	XftDraw *d;
    122  
    123 -	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
    124 +	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
    125  	XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
    126  	if(!text)
    127  		return;
    128 @@ -805,11 +802,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
    129  	memcpy(buf, text, len);
    130  	if(len < olen)
    131  		for(i = len; i && i > len - 3; buf[--i] = '.');
    132 -	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
    133 -	if(dc.font.set)
    134 -		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
    135 -	else
    136 -		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
    137 +
    138 +	d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen));
    139 +
    140 +	XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
    141 +	XftDrawDestroy(d);
    142  }
    143  
    144  void
    145 @@ -855,7 +852,7 @@ focus(Client *c) {
    146  		detachstack(c);
    147  		attachstack(c);
    148  		grabbuttons(c, True);
    149 -		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
    150 +		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
    151  		setfocus(c);
    152  	}
    153  	else
    154 @@ -926,14 +923,14 @@ getatomprop(Client *c, Atom prop) {
    155  	return atom;
    156  }
    157  
    158 -unsigned long
    159 +XftColor 
    160  getcolor(const char *colstr) {
    161 -	Colormap cmap = DefaultColormap(dpy, screen);
    162 -	XColor color;
    163 +	XftColor color;
    164  
    165 -	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
    166 +	if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
    167  		die("error, cannot allocate color '%s'\n", colstr);
    168 -	return color.pixel;
    169 +
    170 +	return color;
    171  }
    172  
    173  Bool
    174 @@ -1034,35 +1031,13 @@ incnmaster(const Arg *arg) {
    175  
    176  void
    177  initfont(const char *fontstr) {
    178 -	char *def, **missing;
    179 -	int n;
    180  
    181 -	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
    182 -	if(missing) {
    183 -		while(n--)
    184 -			fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
    185 -		XFreeStringList(missing);
    186 -	}
    187 -	if(dc.font.set) {
    188 -		XFontStruct **xfonts;
    189 -		char **font_names;
    190 -
    191 -		dc.font.ascent = dc.font.descent = 0;
    192 -		XExtentsOfFontSet(dc.font.set);
    193 -		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
    194 -		while(n--) {
    195 -			dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
    196 -			dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
    197 -			xfonts++;
    198 -		}
    199 -	}
    200 -	else {
    201 -		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
    202 -		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
    203 -			die("error, cannot load font: '%s'\n", fontstr);
    204 -		dc.font.ascent = dc.font.xfont->ascent;
    205 -		dc.font.descent = dc.font.xfont->descent;
    206 -	}
    207 +	if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
    208 +	&& !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
    209 +		die("error, cannot load font: '%s'\n", fontstr);
    210 +
    211 +	dc.font.ascent = dc.font.xfont->ascent;
    212 +	dc.font.descent = dc.font.xfont->descent;
    213  	dc.font.height = dc.font.ascent + dc.font.descent;
    214  }
    215  
    216 @@ -1144,7 +1119,7 @@ manage(Window w, XWindowAttributes *wa) {
    217  
    218  	wc.border_width = c->bw;
    219  	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
    220 -	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
    221 +	XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
    222  	configure(c); /* propagates border_width, if size doesn't change */
    223  	updatewindowtype(c);
    224  	updatesizehints(c);
    225 @@ -1621,8 +1596,6 @@ setup(void) {
    226  	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
    227  	dc.gc = XCreateGC(dpy, root, 0, NULL);
    228  	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
    229 -	if(!dc.font.set)
    230 -		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
    231  	/* init bars */
    232  	updatebars();
    233  	updatestatus();
    234 @@ -1692,13 +1665,9 @@ tagmon(const Arg *arg) {
    235  
    236  int
    237  textnw(const char *text, unsigned int len) {
    238 -	XRectangle r;
    239 -
    240 -	if(dc.font.set) {
    241 -		XmbTextExtents(dc.font.set, text, len, NULL, &r);
    242 -		return r.width;
    243 -	}
    244 -	return XTextWidth(dc.font.xfont, text, len);
    245 +	XGlyphInfo ext;
    246 +	XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
    247 +	return ext.xOff;
    248  }
    249  
    250  void
    251 @@ -1776,7 +1745,7 @@ unfocus(Client *c, Bool setfocus) {
    252  	if(!c)
    253  		return;
    254  	grabbuttons(c, False);
    255 -	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
    256 +	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
    257  	if(setfocus)
    258  		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
    259  }