dwm-6.0-xft.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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  }