[wiki] [sites] user: Lee Fallat <ircsurfer33_AT_gmail.com> || Lee Fallat
changeset: 933:f4882401afed
tag: tip
user: Lee Fallat <ircsurfer33_AT_gmail.com>
date: Wed May 16 22:42:13 2012 -0400
files: dwm.suckless.org/patches/dwm-6.0-xft.diff dwm.suckless.org/patches/xft.md
description:
user: Lee Fallat <ircsurfer33_AT_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.
diff -r fe2294d36ac1 -r f4882401afed dwm.suckless.org/patches/dwm-6.0-xft.diff
--- a/dwm.suckless.org/patches/dwm-6.0-xft.diff Wed May 02 00:26:19 2012 +0200
+++ b/dwm.suckless.org/patches/dwm-6.0-xft.diff Wed May 16 22:42:13 2012 -0400
_AT_@ -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
_AT_@ -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)
-_AT_@ -108,7 +109,7 @@
+_AT_@ -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 */
-_AT_@ -485,10 +486,7 @@
+_AT_@ -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);
+_AT_@ -485,10 +485,6 @@
for(m = mons; m; m = m->next)
while(m->stack)
unmanage(m->stack, False);
_AT_@ -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);
-_AT_@ -792,6 +790,22 @@
+_AT_@ -719,7 +715,7 @@
+ drawbar(Monitor *m) {
+ int x;
+ unsigned int i, occ = 0, urg = 0;
+- unsigned long *col;
++ XftColor *col;
+ Client *c;
- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
+ for(c = m->clients; c; c = c->next) {
+_AT_@ -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);
+_AT_@ -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);
-+
-+ /*
-+ * 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);
-_AT_@ -805,11 +819,10 @@
+_AT_@ -805,11 +802,11 @@
memcpy(buf, text, len);
if(len < olen)
for(i = len; i && i > len - 3; buf[--i] = '.');
_AT_@ -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
-_AT_@ -1057,8 +1070,8 @@
- }
+_AT_@ -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
+_AT_@ -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
+_AT_@ -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;
-_AT_@ -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;
+ }
+
+_AT_@ -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);
+_AT_@ -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);
_AT_@ -88,79 +201,29 @@
/* init bars */
updatebars();
updatestatus();
-_AT_@ -1693,12 +1704,15 @@
+_AT_@ -1692,13 +1665,9 @@
+
int
textnw(const char *text, unsigned int len) {
- XRectangle r;
+- 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;
-
- 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);
++ 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
-_AT_@ -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";
-_AT_@ -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) */
-_AT_@ -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 */
-_AT_@ -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
-_AT_@ -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}
+_AT_@ -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 -r fe2294d36ac1 -r f4882401afed dwm.suckless.org/patches/xft.md
--- a/dwm.suckless.org/patches/xft.md Wed May 02 00:26:19 2012 +0200
+++ b/dwm.suckless.org/patches/xft.md Wed May 16 22:42:13 2012 -0400
_AT_@ -9,7 +9,9 @@
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
------
Received on Thu May 17 2012 - 04:42:35 CEST
This archive was generated by hypermail 2.3.0
: Thu Sep 13 2012 - 19:32:25 CEST