diff --git a/PKGBUILD b/PKGBUILD index 6b805962..3957cfd1 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -6,11 +6,12 @@ pkgdesc="The latest hg pull of wmii, a lightweight, dynamic window manager for X url="http://wmii.suckless.org" license=("MIT") arch=("i686" "x86_64") -depends=("libx11" "libxinerama" "libxrandr" "libxft") +depends=("libx11" "libxinerama" "libxrandr") makedepends=("mercurial") optdepends=("plan9port: for use of the alternative plan9port wmiirc" \ "python: for use of the alternative Python wmiirc" \ - "ruby-rumai: for use of the alternative Ruby wmiirc") + "ruby-rumai: for use of the alternative Ruby wmiirc" \ + "libxft: for anti-aliased font support") provides=("wmii") conflicts=("wmii") source=() diff --git a/cmd/menu/main.c b/cmd/menu/main.c index e3047755..0c3bb500 100644 --- a/cmd/menu/main.c +++ b/cmd/menu/main.c @@ -7,6 +7,7 @@ #include "dat.h" #include #include +#include #include #include #include diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h index 169a8d10..0622fe5c 100644 --- a/cmd/wmii/fns.h +++ b/cmd/wmii/fns.h @@ -2,6 +2,8 @@ * See LICENSE file for license details. */ +#include + #ifdef VARARGCK # pragma varargck argpos debug 2 # pragma varargck argpos dprint 1 diff --git a/cmd/wmii/screen.c b/cmd/wmii/screen.c index 76d89ebe..f448103b 100644 --- a/cmd/wmii/screen.c +++ b/cmd/wmii/screen.c @@ -3,7 +3,6 @@ */ #include "dat.h" #include -#include #include "fns.h" #ifdef notdef diff --git a/cmd/wmii9menu.c b/cmd/wmii9menu.c index 16a8d747..4d2086f7 100644 --- a/cmd/wmii9menu.c +++ b/cmd/wmii9menu.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include diff --git a/cmd/wmiir.c b/cmd/wmiir.c index 4dce494b..4cabe114 100644 --- a/cmd/wmiir.c +++ b/cmd/wmiir.c @@ -4,7 +4,6 @@ #define IXP_NO_P9_ #define IXP_P9_STRUCTS #include -#include #include #include #include diff --git a/config.mk b/config.mk index 0f10b6e7..b983b383 100644 --- a/config.mk +++ b/config.mk @@ -20,21 +20,24 @@ include $(ROOT)/mk/gcc.mk CFLAGS += $(DEBUGCFLAGS) -O0 LDFLAGS += -g -SOLDFLAGS += $(LDFLAGS) -SHARED = -shared -Wl,-soname=$(SONAME) -STATIC = -static - # Compiler, Linker. Linker should usually *not* be ld. CC = cc -c LD = cc # Archiver AR = ar crs -X11PACKAGES = xft +X11PACKAGES = x11 xinerama xrender INCX11 = $$(pkg-config --cflags $(X11PACKAGES)) -LIBICONV = # Leave blank if your libc includes iconv (glibc does) LIBIXP = $(LIBDIR)/libixp.a +# Enable RTLD. Only necessary for Xft support. +CFLAGS += -DHAVE_RTLD +LDFLAGS += -ldl # Comment this out on BSD systems. + +SOLDFLAGS += $(LDFLAGS) +SHARED = -shared -Wl,-soname=$(SONAME) +STATIC = -static + # Your make shell. By default, the first found of /bin/dash, /bin/ksh, # /bin/sh. Except with bsdmake, which assumes /bin/sh is sane. bash and zsh # are painfully slow, and should be avoided. @@ -50,9 +53,7 @@ LIBIXP = $(LIBDIR)/libixp.a #CC=pcc -c #LD=pcc -# *BSD -#LIBICONV = -L/usr/local/lib -liconv -# +Darwin +# Darwin #STATIC = # Darwin doesn't like static linking #SHARED = -dynamiclib #SOEXT = dylib diff --git a/include/stuff/base.h b/include/stuff/base.h index d2a8c55c..e9d2d577 100644 --- a/include/stuff/base.h +++ b/include/stuff/base.h @@ -2,6 +2,8 @@ #define _XOPEN_SOURCE 600 #include +#include +#include #ifndef nil #define nil ((void*)0) diff --git a/include/stuff/x11.h b/include/stuff/x11.h index a9305178..7927266f 100644 --- a/include/stuff/x11.h +++ b/include/stuff/x11.h @@ -7,7 +7,6 @@ #include #include #include -#include #include #ifdef _X11_VISIBLE # include @@ -44,6 +43,10 @@ typedef struct Screen Screen; typedef struct WinHints WinHints; typedef struct Window Image; typedef struct Window Window; +typedef struct Xft Xft; +typedef struct XftColor XftColor; +typedef void XftDraw; +typedef struct XftFont XftFont; struct Color { ulong pixel; @@ -138,6 +141,30 @@ struct Window { int depth; }; +struct Xft { + XftDraw* (*drawcreate)(Display*, Drawable, Visual*, Colormap); + void (*drawdestroy)(XftDraw*); + XftFont* (*fontopen)(Display*, int, const char*); + XftFont* (*fontopenname)(Display*, int, const char*); + XftFont* (*fontclose)(Display*, XftFont*); + void (*textextents)(Display*, XftFont*, char*, int len, XGlyphInfo*); + void (*drawstring)(Display*, XftColor*, XftFont*, int x, int y, char*, int len); +}; + +struct XftColor { + ulong pixel; + XRenderColor color; +}; + +struct XftFont { + int ascent; + int descent; + int height; + int max_advance_width; + void* charset; + void* pattern; +}; + struct Screen { int screen; Window root; @@ -165,6 +192,7 @@ Screen scr; extern const Point ZP; extern const Rectangle ZR; extern Window* pointerwin; +extern Xft* xft; XRectangle XRect(Rectangle r); @@ -205,6 +233,7 @@ ulong getprop_ulong(Window*, char*, char*, ulong, ulong**, ulong); ulong getproperty(Window*, char *prop, char *type, Atom *actual, ulong offset, uchar **ret, ulong length); int grabkeyboard(Window*); int grabpointer(Window*, Window *confine, Cursor, int mask); +bool havexft(void); void initdisplay(void); KeyCode keycode(char*); uint labelh(Font*); diff --git a/libstuff/Makefile b/libstuff/Makefile index 5ba16b2b..3a349558 100644 --- a/libstuff/Makefile +++ b/libstuff/Makefile @@ -86,6 +86,7 @@ OBJ=\ x11/sync \ x11/x11 \ x11/xatom \ + x11/xft \ x11/colors/loadcolor \ x11/colors/namedcolor \ x11/colors/xftcolor \ diff --git a/libstuff/map.c b/libstuff/map.c index 9d0bc5d2..330c9d9c 100644 --- a/libstuff/map.c +++ b/libstuff/map.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include #include diff --git a/libstuff/util/_die.c b/libstuff/util/_die.c index 2fe12706..c48b512f 100644 --- a/libstuff/util/_die.c +++ b/libstuff/util/_die.c @@ -2,7 +2,6 @@ /* Public domain */ #include #include -#include #include #include #include "util.h" diff --git a/libstuff/util/backtrace.c b/libstuff/util/backtrace.c index ce0ee096..8c86bbfb 100644 --- a/libstuff/util/backtrace.c +++ b/libstuff/util/backtrace.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include diff --git a/libstuff/util/doublefork.c b/libstuff/util/doublefork.c index b16bfe47..6a2a33c9 100644 --- a/libstuff/util/doublefork.c +++ b/libstuff/util/doublefork.c @@ -2,7 +2,6 @@ * See LICENSE file for license details. */ #include -#include #include #include "util.h" diff --git a/libstuff/util/emalloc.c b/libstuff/util/emalloc.c index 8714a57c..70da6458 100644 --- a/libstuff/util/emalloc.c +++ b/libstuff/util/emalloc.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include "util.h" void * diff --git a/libstuff/util/erealloc.c b/libstuff/util/erealloc.c index 61f55045..f1aa727a 100644 --- a/libstuff/util/erealloc.c +++ b/libstuff/util/erealloc.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include "util.h" void * diff --git a/libstuff/util/fatal.c b/libstuff/util/fatal.c index d257a295..7803d81d 100644 --- a/libstuff/util/fatal.c +++ b/libstuff/util/fatal.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include #include "util.h" diff --git a/libstuff/util/freelater.c b/libstuff/util/freelater.c index 542a1296..fa881682 100644 --- a/libstuff/util/freelater.c +++ b/libstuff/util/freelater.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include "util.h" void* diff --git a/libstuff/util/getlong.c b/libstuff/util/getlong.c index 44fc8139..6c9dd081 100644 --- a/libstuff/util/getlong.c +++ b/libstuff/util/getlong.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include diff --git a/libstuff/util/getulong.c b/libstuff/util/getulong.c index 0782bfcd..9c9da814 100644 --- a/libstuff/util/getulong.c +++ b/libstuff/util/getulong.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include diff --git a/libstuff/util/join.c b/libstuff/util/join.c index 786285d3..c8819de9 100644 --- a/libstuff/util/join.c +++ b/libstuff/util/join.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include "util.h" diff --git a/libstuff/util/mfatal.c b/libstuff/util/mfatal.c index d1e0dbe9..e71fd995 100644 --- a/libstuff/util/mfatal.c +++ b/libstuff/util/mfatal.c @@ -1,6 +1,5 @@ /* Written by Kris Maglione */ /* Public domain */ -#include #include #include #include "util.h" diff --git a/libstuff/util/pathsearch.c b/libstuff/util/pathsearch.c index 9d9ad3d6..ff2a3f50 100644 --- a/libstuff/util/pathsearch.c +++ b/libstuff/util/pathsearch.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include #include diff --git a/libstuff/util/refree.c b/libstuff/util/refree.c index 53699b23..8badeb45 100644 --- a/libstuff/util/refree.c +++ b/libstuff/util/refree.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include "util.h" void diff --git a/libstuff/util/spawn3.c b/libstuff/util/spawn3.c index 7960b2a3..b850440d 100644 --- a/libstuff/util/spawn3.c +++ b/libstuff/util/spawn3.c @@ -2,7 +2,6 @@ * See LICENSE file for license details. */ #include -#include #include #include "util.h" diff --git a/libstuff/util/spawn3l.c b/libstuff/util/spawn3l.c index 9c0f1beb..a792f830 100644 --- a/libstuff/util/spawn3l.c +++ b/libstuff/util/spawn3l.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include "util.h" diff --git a/libstuff/util/vector.c b/libstuff/util/vector.c index 9b1f4365..24ac8615 100644 --- a/libstuff/util/vector.c +++ b/libstuff/util/vector.c @@ -1,7 +1,6 @@ /* Copyright ©2008-2010 Kris Maglione * See LICENSE file for license details. */ -#include #include #include "util.h" diff --git a/libstuff/x11/colors/loadcolor.c b/libstuff/x11/colors/loadcolor.c index 64db595e..64ebbb8e 100644 --- a/libstuff/x11/colors/loadcolor.c +++ b/libstuff/x11/colors/loadcolor.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" bool diff --git a/libstuff/x11/drawing/drawstring.c b/libstuff/x11/drawing/drawstring.c index 02271a90..ad74ccd7 100644 --- a/libstuff/x11/drawing/drawstring.c +++ b/libstuff/x11/drawing/drawstring.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" uint @@ -69,9 +70,9 @@ drawstring(Image *dst, Font *font, buf, len); break; case FXft: - XftDrawStringUtf8(xftdrawable(dst), xftcolor(col), - font->font.xft, - x, y, (uchar*)buf, len); + xft->drawstring(xftdrawable(dst), xftcolor(col), + font->font.xft, + x, y, buf, len); break; case FX11: XSetFont(display, dst->gc, font->font.x11->fid); diff --git a/libstuff/x11/images/freeimage.c b/libstuff/x11/images/freeimage.c index 9a1e2639..badd4f92 100644 --- a/libstuff/x11/images/freeimage.c +++ b/libstuff/x11/images/freeimage.c @@ -11,7 +11,7 @@ freeimage(Image *img) { assert(img->type == WImage); if(img->xft) - XftDrawDestroy(img->xft); + xft->drawdestroy(img->xft); XFreePixmap(display, img->xid); XFreeGC(display, img->gc); free(img); diff --git a/libstuff/x11/images/xftdrawable.c b/libstuff/x11/images/xftdrawable.c index 9bca2f1b..c3939638 100644 --- a/libstuff/x11/images/xftdrawable.c +++ b/libstuff/x11/images/xftdrawable.c @@ -6,6 +6,6 @@ XftDraw* xftdrawable(Image *img) { if(img->xft == nil) - img->xft = XftDrawCreate(display, img->xid, img->visual, img->colormap); + img->xft = xft->drawcreate(display, img->xid, img->visual, img->colormap); return img->xft; } diff --git a/libstuff/x11/insanity/sethints.c b/libstuff/x11/insanity/sethints.c index c5b6e685..fe788b16 100644 --- a/libstuff/x11/insanity/sethints.c +++ b/libstuff/x11/insanity/sethints.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" void diff --git a/libstuff/x11/properties/changeprop_string.c b/libstuff/x11/properties/changeprop_string.c index b8761790..8c06e647 100644 --- a/libstuff/x11/properties/changeprop_string.c +++ b/libstuff/x11/properties/changeprop_string.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" void diff --git a/libstuff/x11/properties/changeprop_textlist.c b/libstuff/x11/properties/changeprop_textlist.c index 0c9f052c..68138caa 100644 --- a/libstuff/x11/properties/changeprop_textlist.c +++ b/libstuff/x11/properties/changeprop_textlist.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" void diff --git a/libstuff/x11/properties/strlistdup.c b/libstuff/x11/properties/strlistdup.c index 083f0ffa..07aff8de 100644 --- a/libstuff/x11/properties/strlistdup.c +++ b/libstuff/x11/properties/strlistdup.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" char** diff --git a/libstuff/x11/text/freefont.c b/libstuff/x11/text/freefont.c index 7bd5436d..6f7eb960 100644 --- a/libstuff/x11/text/freefont.c +++ b/libstuff/x11/text/freefont.c @@ -10,7 +10,7 @@ freefont(Font *f) { XFreeFontSet(display, f->font.set); break; case FXft: - XftFontClose(display, f->font.xft); + xft->fontclose(display, f->font.xft); break; case FX11: XFreeFont(display, f->font.x11); diff --git a/libstuff/x11/text/loadfont.c b/libstuff/x11/text/loadfont.c index c1baff78..e26e3365 100644 --- a/libstuff/x11/text/loadfont.c +++ b/libstuff/x11/text/loadfont.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" Font* @@ -17,9 +18,12 @@ loadfont(char *name) { if(!strncmp(f->name, "xft:", 4)) { f->type = FXft; - f->font.xft = XftFontOpenXlfd(display, scr.screen, f->name + 4); + if(!havexft()) + goto error; + + f->font.xft = xft->fontopen(display, scr.screen, f->name + 4); if(!f->font.xft) - f->font.xft = XftFontOpenName(display, scr.screen, f->name + 4); + f->font.xft = xft->fontopenname(display, scr.screen, f->name + 4); if(!f->font.xft) goto error; diff --git a/libstuff/x11/text/textextents_l.c b/libstuff/x11/text/textextents_l.c index 9b476996..12408e07 100644 --- a/libstuff/x11/text/textextents_l.c +++ b/libstuff/x11/text/textextents_l.c @@ -18,7 +18,7 @@ textextents_l(Font *font, char *text, uint len, int *offset) { *offset = Xutf8TextExtents(font->font.set, text, len, &r, nil); return Rect(r.x, -r.y - r.height, r.x + r.width, -r.y); case FXft: - XftTextExtentsUtf8(display, font->font.xft, (uchar*)text, len, &i); + xft->textextents(display, font->font.xft, text, len, &i); *offset = i.xOff; return Rect(-i.x, i.y - i.height, -i.x + i.width, i.y); case FX11: diff --git a/libstuff/x11/text/textwidth.c b/libstuff/x11/text/textwidth.c index 6fb5da33..116f7d4c 100644 --- a/libstuff/x11/text/textwidth.c +++ b/libstuff/x11/text/textwidth.c @@ -1,6 +1,7 @@ /* Copyright ©2007-2010 Kris Maglione * See LICENSE file for license details. */ +#include #include "../x11.h" uint diff --git a/libstuff/x11/windows/destroywindow.c b/libstuff/x11/windows/destroywindow.c index e75fa9cf..c12ac46a 100644 --- a/libstuff/x11/windows/destroywindow.c +++ b/libstuff/x11/windows/destroywindow.c @@ -8,7 +8,7 @@ destroywindow(Window *w) { assert(w->type == WWindow); sethandler(w, nil); if(w->xft) - XftDrawDestroy(w->xft); + xft->drawdestroy(w->xft); if(w->gc) XFreeGC(display, w->gc); XDestroyWindow(display, w->xid); diff --git a/libstuff/x11/xft.c b/libstuff/x11/xft.c new file mode 100644 index 00000000..ddbf60b6 --- /dev/null +++ b/libstuff/x11/xft.c @@ -0,0 +1,39 @@ +/* Copyright ©2010 Kris Maglione + * See LICENSE file for license details. + */ +#include +#include + +Xft *xft; + +#ifdef HAVE_RTLD +#include + +bool +havexft(void) { + void *libxft; + + if(xft == nil) { + libxft = dlopen("libXft.so", RTLD_LAZY); + if(libxft == nil) + return false; + xft = emalloc(sizeof *xft); + *(void**)(uintptr_t)&xft->drawcreate = dlsym(libxft, "XftDrawCreate"); + *(void**)(uintptr_t)&xft->drawdestroy = dlsym(libxft, "XftDrawDestroy"); + *(void**)(uintptr_t)&xft->fontopen = dlsym(libxft, "XftFontOpenXlfd"); + *(void**)(uintptr_t)&xft->fontopenname = dlsym(libxft, "XftFontOpenName"); + *(void**)(uintptr_t)&xft->fontclose = dlsym(libxft, "XftFontClose"); + *(void**)(uintptr_t)&xft->textextents = dlsym(libxft, "XftTextExtentsUtf8"); + *(void**)(uintptr_t)&xft->drawstring = dlsym(libxft, "XftDrawStringUtf8"); + } + return xft && xft->drawcreate && xft->drawdestroy && xft->fontopen + && xft->fontopenname && xft->fontclose && xft->textextents && xft->drawstring; +} + +#else +bool +havexft(void) { + return false; +} +#endif + diff --git a/libwmii_hack/hack.c b/libwmii_hack/hack.c index b282c52c..d93b7638 100644 --- a/libwmii_hack/hack.c +++ b/libwmii_hack/hack.c @@ -4,7 +4,6 @@ #include "hack.h" #include #include -#include #include #include #include diff --git a/util/compile b/util/compile index 53f3f1da..f3f97c8e 100755 --- a/util/compile +++ b/util/compile @@ -17,7 +17,7 @@ status=$? [ $? -eq 0 ] || echo $CC -o $outfile $CFLAGS $@ >&2 base=$(echo $BASE | sed 's/,/\\,/g') -re='\([^[:space:]/]*\..:[0-9]\)' +re='\([^[:space:]/][^[:space:]]*\..:[0-9]\)' undup() { # GCC is crap. awk '