aboutsummaryrefslogtreecommitdiffstats
path: root/dwm-6.0-xft.diff
diff options
context:
space:
mode:
Diffstat (limited to 'dwm-6.0-xft.diff')
-rw-r--r--dwm-6.0-xft.diff229
1 files changed, 229 insertions, 0 deletions
diff --git a/dwm-6.0-xft.diff b/dwm-6.0-xft.diff
new file mode 100644
index 0000000..cae66bd
--- /dev/null
+++ b/dwm-6.0-xft.diff
@@ -0,0 +1,229 @@
+--- ../dwm-o/dwm-6.0/dwm.c 2011-12-19 10:02:46.000000000 -0500
++++ dwm.c 2012-05-16 22:33:00.043394484 -0400
+@@ -39,6 +39,7 @@
+ #ifdef XINERAMA
+ #include <X11/extensions/Xinerama.h>
+ #endif /* XINERAMA */
++#include <X11/Xft/Xft.h>
+
+ /* macros */
+ #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
+@@ -99,16 +100,15 @@
+
+ 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 */
+
+@@ -178,15 +178,15 @@
+ static Monitor *dirtomon(int dir);
+ static void drawbar(Monitor *m);
+ static void drawbars(void);
+-static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+-static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
++static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
++static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
+ static void enternotify(XEvent *e);
+ static void expose(XEvent *e);
+ static void focus(Client *c);
+ static void focusin(XEvent *e);
+ static void focusmon(const Arg *arg);
+ static void focusstack(const Arg *arg);
+-static unsigned long getcolor(const char *colstr);
++static XftColor getcolor(const char *colstr);
+ static Bool getrootptr(int *x, int *y);
+ static long getstate(Window w);
+ static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
+@@ -485,10 +485,6 @@
+ for(m = mons; m; m = m->next)
+ while(m->stack)
+ unmanage(m->stack, False);
+- if(dc.font.set)
+- XFreeFontSet(dpy, dc.font.set);
+- else
+- XFreeFont(dpy, dc.font.xfont);
+ XUngrabKey(dpy, AnyKey, AnyModifier, root);
+ XFreePixmap(dpy, dc.drawable);
+ XFreeGC(dpy, dc.gc);
+@@ -719,7 +715,7 @@
+ drawbar(Monitor *m) {
+ int x;
+ unsigned int i, occ = 0, urg = 0;
+- unsigned long *col;
++ XftColor *col;
+ Client *c;
+
+ for(c = m->clients; c; c = c->next) {
+@@ -774,10 +770,10 @@
+ }
+
+ void
+-drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
++drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
+ int x;
+
+- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
++ XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
+ x = (dc.font.ascent + dc.font.descent + 2) / 4;
+ if(filled)
+ XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
+@@ -786,11 +782,12 @@
+ }
+
+ void
+-drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
++drawtext(const char *text, XftColor col[ColLast], Bool invert) {
+ char buf[256];
+ int i, x, y, h, len, olen;
++ XftDraw *d;
+
+- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
++ XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
+ XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
+ if(!text)
+ return;
+@@ -805,11 +802,11 @@
+ memcpy(buf, text, len);
+ if(len < olen)
+ for(i = len; i && i > len - 3; buf[--i] = '.');
+- XSetForeground(dpy, dc.gc, col[invert ? ColBG : 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[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
++ XftDrawDestroy(d);
+ }
+
+ void
+@@ -855,7 +852,7 @@
+ detachstack(c);
+ attachstack(c);
+ grabbuttons(c, True);
+- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
++ XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
+ setfocus(c);
+ }
+ else
+@@ -926,14 +923,14 @@
+ return atom;
+ }
+
+-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("error, cannot allocate color '%s'\n", colstr);
+- return color.pixel;
++
++ return color;
+ }
+
+ Bool
+@@ -1034,35 +1031,13 @@
+
+ void
+ initfont(const char *fontstr) {
+- char *def, **missing;
+- int n;
+
+- dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
+- if(missing) {
+- while(n--)
+- fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
+- XFreeStringList(missing);
+- }
+- if(dc.font.set) {
+- XFontStruct **xfonts;
+- char **font_names;
+-
+- dc.font.ascent = dc.font.descent = 0;
+- XExtentsOfFontSet(dc.font.set);
+- n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
+- while(n--) {
+- dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
+- dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
+- xfonts++;
+- }
+- }
+- else {
+- if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
+- && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
+- die("error, cannot load font: '%s'\n", fontstr);
+- dc.font.ascent = dc.font.xfont->ascent;
+- dc.font.descent = dc.font.xfont->descent;
+- }
++ if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
++ && !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
++ die("error, cannot load font: '%s'\n", fontstr);
++
++ dc.font.ascent = dc.font.xfont->ascent;
++ dc.font.descent = dc.font.xfont->descent;
+ dc.font.height = dc.font.ascent + dc.font.descent;
+ }
+
+@@ -1144,7 +1119,7 @@
+
+ wc.border_width = c->bw;
+ XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+- XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
++ XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
+ configure(c); /* propagates border_width, if size doesn't change */
+ updatewindowtype(c);
+ updatesizehints(c);
+@@ -1621,8 +1596,6 @@
+ dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
+ dc.gc = XCreateGC(dpy, root, 0, NULL);
+ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+- if(!dc.font.set)
+- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+ /* init bars */
+ updatebars();
+ updatestatus();
+@@ -1692,13 +1665,9 @@
+
+ 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
+@@ -1776,7 +1745,7 @@
+ if(!c)
+ return;
+ grabbuttons(c, False);
+- XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
++ XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
+ if(setfocus)
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ }