sites

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit e36e28f9432d1029ae24c4aea64af442f5f5dedb
parent 153a88cb35337cd3ec94fa00b74320d403f14703
Author: Lee Fallat <ircsurfer33@gmail.com>
Date:   Wed, 16 May 2012 22:42:13 -0400

user: Lee Fallat <ircsurfer33@gmail.com>
branch 'default'
changed dwm.suckless.org/patches/dwm-6.0-xft.diff
changed dwm.suckless.org/patches/xft.md

Fixed a memory leak and reimplemented Xft in a more efficient manner.
Diffstat:
Mdwm.suckless.org/patches/dwm-6.0-xft.diff | 277++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mdwm.suckless.org/patches/xft.md | 4+++-
2 files changed, 173 insertions(+), 108 deletions(-)

diff --git a/dwm.suckless.org/patches/dwm-6.0-xft.diff b/dwm.suckless.org/patches/dwm-6.0-xft.diff @@ -1,23 +1,53 @@ ---- src/dwm-6.0/dwm.c 2011-12-19 10:02:46.000000000 -0500 -+++ src/dwm-6.0-xft/dwm.c 2012-03-30 10:29:25.156110278 -0400 +--- ../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> /* XFT */ ++#include <X11/Xft/Xft.h> /* macros */ #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -@@ -108,7 +109,7 @@ +@@ -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; +- XFontSet set; - XFontStruct *xfont; + XftFont *xfont; } font; } DC; /* draw context */ -@@ -485,10 +486,7 @@ +@@ -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); @@ -25,34 +55,47 @@ - XFreeFontSet(dpy, dc.font.set); - else - XFreeFont(dpy, dc.font.xfont); -+ XUngrabKey(dpy, AnyKey, AnyModifier, root); XFreePixmap(dpy, dc.drawable); XFreeGC(dpy, dc.gc); -@@ -792,6 +790,22 @@ +@@ -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]); ++ XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel); XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h); -+ -+ /* -+ * Color assignment and conversion to Xft's coloring -+ */ -+ -+ XftColor color; -+ color.color.red = ((col[invert ? ColBG : ColFG] & 0xFF0000) >> 16 )* 0x101; -+ color.color.green = ((col[invert ? ColBG : ColFG] & 0x00FF00) >> 8 )* 0x101; -+ color.color.blue = ((col[invert ? ColBG : ColFG] & 0x0000FF) )* 0x101; -+ color.color.alpha = 0xFFFF; -+ color.pixel = 0xFFFFFF00; -+ Colormap cmap = DefaultColormap(dpy, screen); -+ -+ XftColorAllocValue(dpy, DefaultVisual(dpy, screen), cmap, &color.color, &color); -+ XftDraw *draw = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), cmap); -+ if(!text) return; - olen = strlen(text); -@@ -805,11 +819,10 @@ +@@ -805,11 +802,11 @@ memcpy(buf, text, len); if(len < olen) for(i = len; i && i > len - 3; buf[--i] = '.'); @@ -62,24 +105,94 @@ - else - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); + -+ XftDrawStringUtf8(draw, &color, dc.font.xfont, x, y, (XftChar8 *)buf, len); ++ d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen)); + -+ free(draw); ++ XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); ++ XftDrawDestroy(d); } void -@@ -1057,8 +1070,8 @@ - } +@@ -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 { + 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"))) -+ if(!(dc.font.xfont = XftFontOpenXlfd(dpy,screen, fontstr)) -+ && !(dc.font.xfont = XftFontOpenXlfd(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; -@@ -1621,8 +1634,6 @@ +- 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); @@ -88,79 +201,29 @@ /* init bars */ updatebars(); updatestatus(); -@@ -1693,12 +1704,15 @@ +@@ -1692,13 +1665,9 @@ + int textnw(const char *text, unsigned int len) { - XRectangle r; -+ XGlyphInfo ext; - - if(dc.font.set) { - XmbTextExtents(dc.font.set, text, len, NULL, &r); - return r.width; - } +- XRectangle r; +- +- if(dc.font.set) { +- XmbTextExtents(dc.font.set, text, len, NULL, &r); +- return r.width; +- } - return XTextWidth(dc.font.xfont, text, len); -+ -+ XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *)text, len, &ext); ++ XGlyphInfo ext; ++ XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext); + return ext.xOff; } void ---- src/dwm-6.0/config.def.h 2011-12-19 10:02:46.000000000 -0500 -+++ src/dwm-6.0-xft/config.def.h 2012-03-30 10:22:26.048380780 -0400 -@@ -1,7 +1,7 @@ - /* See LICENSE file for copyright and license details. */ - - /* appearance */ --static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; -+static const char font[] = "-*-dejavu sans mono-medium-r-*-*-13-*-*-*-*-*-*-*"; - static const char normbordercolor[] = "#444444"; - static const char normbgcolor[] = "#222222"; - static const char normfgcolor[] = "#bbbbbb"; -@@ -18,8 +18,7 @@ - - static const Rule rules[] = { - /* class instance title tags mask isfloating monitor */ -- { "Gimp", NULL, NULL, 0, True, -1 }, -- { "Firefox", NULL, NULL, 1 << 8, False, -1 }, -+ {0} - }; - - /* layout(s) */ -@@ -29,9 +28,9 @@ - - static const Layout layouts[] = { - /* symbol arrange function */ -- { "[]=", tile }, /* first entry is default */ -- { "><>", NULL }, /* no layout function means floating behavior */ -- { "[M]", monocle }, -+ { "◧", tile }, /* first entry is default */ -+ { "◰", NULL }, /* no layout function means floating behavior */ -+ { "□", monocle }, - }; - - /* key definitions */ -@@ -47,7 +46,7 @@ - - /* commands */ - static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; --static const char *termcmd[] = { "uxterm", NULL }; -+static const char *termcmd[] = { "urxvt", NULL }; - - static Key keys[] = { - /* modifier key function argument */ ---- src/dwm-6.0/config.mk 2011-12-19 10:02:46.000000000 -0500 -+++ src/dwm-6.0-xft/config.mk 2012-03-30 11:32:31.768929769 -0400 -@@ -14,9 +14,12 @@ - XINERAMALIBS = -L${X11LIB} -lXinerama - XINERAMAFLAGS = -DXINERAMA - -+# Xft -+XFTLIBS = `pkg-config --cflags --libs xft` -+ - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} -+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS} - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +@@ -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); + } diff --git a/dwm.suckless.org/patches/xft.md b/dwm.suckless.org/patches/xft.md @@ -9,7 +9,9 @@ This patch implements Xft. This allows users to utilize the UTF8 character set. Download -------- -* [dwm-6.0-xft.diff](dwm-6.0-xft.diff) (5.3k) (20120429) +* [dwm-6.0-xft.diff](dwm-6.0-xft.diff) (6.6k) (16 May 2012) + * memory leak fixed and improved implementation. + Author ------