diff options
author | Jeroen Roovers <jer@gentoo.org> | 2016-03-25 04:16:13 +0100 |
---|---|---|
committer | Jeroen Roovers <jer@gentoo.org> | 2016-03-25 04:16:58 +0100 |
commit | 8d4cc21efb4dc380cf0327d6df513bdf36066dda (patch) | |
tree | 6efa4172da6cfd568fc92f3569cca5279097203e /x11-misc/dmenu | |
parent | x11-misc/dmenu: Stable for HPPA (bug #576066). (diff) | |
download | gentoo-8d4cc21efb4dc380cf0327d6df513bdf36066dda.tar.gz gentoo-8d4cc21efb4dc380cf0327d6df513bdf36066dda.tar.bz2 gentoo-8d4cc21efb4dc380cf0327d6df513bdf36066dda.zip |
x11-misc/dmenu: Old.
Package-Manager: portage-2.2.28
Diffstat (limited to 'x11-misc/dmenu')
-rw-r--r-- | x11-misc/dmenu/Manifest | 1 | ||||
-rw-r--r-- | x11-misc/dmenu/dmenu-4.5-r3.ebuild | 59 | ||||
-rw-r--r-- | x11-misc/dmenu/dmenu-4.5-r4.ebuild | 59 | ||||
-rw-r--r-- | x11-misc/dmenu/files/dmenu-4.5-xft-2.patch | 410 | ||||
-rw-r--r-- | x11-misc/dmenu/files/dmenu-4.5-xft-3.patch | 412 |
5 files changed, 0 insertions, 941 deletions
diff --git a/x11-misc/dmenu/Manifest b/x11-misc/dmenu/Manifest index 37adb31edce1..f6485f05c0a8 100644 --- a/x11-misc/dmenu/Manifest +++ b/x11-misc/dmenu/Manifest @@ -1,2 +1 @@ -DIST dmenu-4.5.tar.gz 11543 SHA256 082cd698d82125ca0b3989006fb84ac4675c2a5585bf5bb8af0ea09cfb95a850 SHA512 872dee68c35a93c663eb0a941653eaaa4aa83d8379e05b4dbca089a2c9335036b496de85d8ddf7af1228a5625490a06a89031fb1aac726236b608b952962c248 WHIRLPOOL b91660f3028d314f1a10b994af73e6239c4aaabda6c9ab269bda7e37e0cd22c0eaf3b93998c4cb0fe1f9d8f2fd198afc2e70c237a46921ece9fd9a697f58c869 DIST dmenu-4.6.tar.gz 15057 SHA256 4a7a24008a621c3cd656155ad91ab8136db8f0d3b9ec56dafeec518cabda96b3 SHA512 e54fd10c0b1274eb90173aea442f0bfc496f4dda861a36d94f939e1fd835594f9aa12f3d0f90043d64e519d919b9a5273ab65012230ac022f727ee6bb64862e3 WHIRLPOOL b4354552356ab5ab93b20c44a313f0d8e626c22c589cf4376f82f876dc742b961a07bad45d12b5fe749b03354dfa76acf36e4089a701754e341ec0383232fa5d diff --git a/x11-misc/dmenu/dmenu-4.5-r3.ebuild b/x11-misc/dmenu/dmenu-4.5-r3.ebuild deleted file mode 100644 index 2b209722c411..000000000000 --- a/x11-misc/dmenu/dmenu-4.5-r3.ebuild +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 1999-2013 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Id$ - -EAPI=5 -inherit eutils toolchain-funcs - -DESCRIPTION="a generic, highly customizable, and efficient menu for the X Window System" -HOMEPAGE="http://tools.suckless.org/dmenu/" -SRC_URI="http://dl.suckless.org/tools/${P}.tar.gz" - -LICENSE="MIT" -SLOT="0" -KEYWORDS="amd64 hppa ppc ppc64 x86 ~x86-fbsd" -IUSE="xft xinerama" - -RDEPEND=" - x11-libs/libX11 - xft? ( x11-libs/libXft ) - xinerama? ( x11-libs/libXinerama ) -" -DEPEND="${RDEPEND} - xft? ( virtual/pkgconfig ) - xinerama? ( virtual/pkgconfig ) -" - -src_prepare() { - # Respect our flags - sed -i \ - -e '/^CFLAGS/{s|=.*|+= -ansi -pedantic -Wall $(INCS) $(CPPFLAGS)|}' \ - -e '/^LDFLAGS/s|= -s|+=|' \ - config.mk || die - # Make make verbose - sed -i \ - -e 's|^ @| |g' \ - -e '/^ echo/d' \ - Makefile || die - use xft && epatch "${FILESDIR}"/${PN}-4.5-xft-2.patch - - epatch_user -} - -src_compile() { - emake CC=$(tc-getCC) \ - "XFTINC=$( $(tc-getPKG_CONFIG) --cflags xft 2>/dev/null )" \ - "XFTLIBS=$( $(tc-getPKG_CONFIG) --libs xft 2>/dev/null )" \ - "XINERAMAFLAGS=$( - usex xinerama "-DXINERAMA $( - $(tc-getPKG_CONFIG) --cflags xinerama 2>/dev/null - )" '' - )" \ - "XINERAMALIBS=$( - usex xinerama "$( $(tc-getPKG_CONFIG) --libs xinerama 2>/dev/null)" '' - )" -} - -src_install() { - emake DESTDIR="${D}" PREFIX="/usr" install -} diff --git a/x11-misc/dmenu/dmenu-4.5-r4.ebuild b/x11-misc/dmenu/dmenu-4.5-r4.ebuild deleted file mode 100644 index 7844730f9c80..000000000000 --- a/x11-misc/dmenu/dmenu-4.5-r4.ebuild +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 1999-2014 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Id$ - -EAPI=5 -inherit eutils toolchain-funcs - -DESCRIPTION="a generic, highly customizable, and efficient menu for the X Window System" -HOMEPAGE="http://tools.suckless.org/dmenu/" -SRC_URI="http://dl.suckless.org/tools/${P}.tar.gz" - -LICENSE="MIT" -SLOT="0" -KEYWORDS="~amd64 ~hppa ~ppc ~ppc64 ~x86 ~x86-fbsd" -IUSE="xft xinerama" - -RDEPEND=" - x11-libs/libX11 - xft? ( x11-libs/libXft ) - xinerama? ( x11-libs/libXinerama ) -" -DEPEND="${RDEPEND} - xft? ( virtual/pkgconfig ) - xinerama? ( virtual/pkgconfig ) -" - -src_prepare() { - # Respect our flags - sed -i \ - -e '/^CFLAGS/{s|=.*|+= -ansi -pedantic -Wall $(INCS) $(CPPFLAGS)|}' \ - -e '/^LDFLAGS/s|= -s|+=|' \ - config.mk || die - # Make make verbose - sed -i \ - -e 's|^ @| |g' \ - -e '/^ echo/d' \ - Makefile || die - use xft && epatch "${FILESDIR}"/${PN}-4.5-xft-3.patch - - epatch_user -} - -src_compile() { - emake CC=$(tc-getCC) \ - "XFTINC=$( $(tc-getPKG_CONFIG) --cflags xft 2>/dev/null )" \ - "XFTLIBS=$( $(tc-getPKG_CONFIG) --libs xft 2>/dev/null )" \ - "XINERAMAFLAGS=$( - usex xinerama "-DXINERAMA $( - $(tc-getPKG_CONFIG) --cflags xinerama 2>/dev/null - )" '' - )" \ - "XINERAMALIBS=$( - usex xinerama "$( $(tc-getPKG_CONFIG) --libs xinerama 2>/dev/null)" '' - )" -} - -src_install() { - emake DESTDIR="${D}" PREFIX="/usr" install -} diff --git a/x11-misc/dmenu/files/dmenu-4.5-xft-2.patch b/x11-misc/dmenu/files/dmenu-4.5-xft-2.patch deleted file mode 100644 index 4e3f32c6aabb..000000000000 --- a/x11-misc/dmenu/files/dmenu-4.5-xft-2.patch +++ /dev/null @@ -1,410 +0,0 @@ ---- a/config.mk -+++ b/config.mk -@@ -12,9 +12,13 @@ - XINERAMALIBS = -lXinerama - XINERAMAFLAGS = -DXINERAMA - -+# Xft, comment if you don't want it -+XFTINC = $(shell pkg-config --cflags xft) -+XFTLIBS = $(shell pkg-config --libs xft) -+ - # includes and libs --INCS = -I${X11INC} --LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -+INCS = -I${X11INC} ${XFTINC} -+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS} - - # flags - CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} ---- a/dmenu.1 -+++ b/dmenu.1 -@@ -53,7 +53,7 @@ - defines the prompt to be displayed to the left of the input field. - .TP - .BI \-fn " font" --defines the font or font set used. -+defines the font or font set used. eg. "fixed" or "Monospace-12:normal" (an xft font) - .TP - .BI \-nb " color" - defines the normal background color. ---- a/dmenu.c -+++ b/dmenu.c -@@ -17,6 +17,7 @@ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) - #define MIN(a,b) ((a) < (b) ? (a) : (b)) - #define MAX(a,b) ((a) > (b) ? (a) : (b)) -+#define DEFFONT "fixed" /* xft example: "Monospace-11" */ - - typedef struct Item Item; - struct Item { -@@ -26,6 +27,7 @@ - - static void appenditem(Item *item, Item **list, Item **last); - static void calcoffsets(void); -+static void cleanup(void); - static char *cistrstr(const char *s, const char *sub); - static void drawmenu(void); - static void grabkeyboard(void); -@@ -50,10 +52,12 @@ - static const char *selbgcolor = "#005577"; - static const char *selfgcolor = "#eeeeee"; - static unsigned int lines = 0; --static unsigned long normcol[ColLast]; --static unsigned long selcol[ColLast]; -+static ColorSet *normcol; -+static ColorSet *selcol; - static Atom clip, utf8; - static Bool topbar = True; -+static Bool running = True; -+static int ret = 0; - static DC *dc; - static Item *items = NULL; - static Item *matches, *matchend; -@@ -104,7 +108,9 @@ - usage(); - - dc = initdc(); -- initfont(dc, font); -+ initfont(dc, font ? font : DEFFONT); -+ normcol = initcolor(dc, normfgcolor, normbgcolor); -+ selcol = initcolor(dc, selfgcolor, selbgcolor); - - if(fast) { - grabkeyboard(); -@@ -117,7 +123,8 @@ - setup(); - run(); - -- return 1; /* unreachable */ -+ cleanup(); -+ return ret; - } - - void -@@ -160,6 +167,15 @@ - } - - void -+cleanup(void) { -+ freecol(dc, normcol); -+ freecol(dc, selcol); -+ XDestroyWindow(dc->dpy, win); -+ XUngrabKeyboard(dc->dpy, CurrentTime); -+ freedc(dc); -+} -+ -+void - drawmenu(void) { - int curpos; - Item *item; -@@ -167,7 +183,7 @@ - dc->x = 0; - dc->y = 0; - dc->h = bh; -- drawrect(dc, 0, 0, mw, mh, True, BG(dc, normcol)); -+ drawrect(dc, 0, 0, mw, mh, True, normcol->BG); - - if(prompt) { - dc->w = promptw; -@@ -178,7 +194,7 @@ - dc->w = (lines > 0 || !matches) ? mw - dc->x : inputw; - drawtext(dc, text, normcol); - if((curpos = textnw(dc, text, cursor) + dc->h/2 - 2) < dc->w) -- drawrect(dc, curpos, 2, 1, dc->h - 4, True, FG(dc, normcol)); -+ drawrect(dc, curpos, 2, 1, dc->h - 4, True, normcol->FG); - - if(lines > 0) { - /* draw vertical list */ -@@ -321,7 +337,8 @@ - sel = matchend; - break; - case XK_Escape: -- exit(EXIT_FAILURE); -+ ret = EXIT_FAILURE; -+ running = False; - case XK_Home: - if(sel == matches) { - cursor = 0; -@@ -359,7 +376,8 @@ - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); -- exit(EXIT_SUCCESS); -+ ret = EXIT_SUCCESS; -+ running = False; - case XK_Right: - if(text[cursor] != '\0') { - cursor = nextrune(+1); -@@ -490,7 +508,7 @@ - run(void) { - XEvent ev; - -- while(!XNextEvent(dc->dpy, &ev)) { -+ while(running && !XNextEvent(dc->dpy, &ev)) { - if(XFilterEvent(&ev, win)) - continue; - switch(ev.type) { -@@ -524,11 +542,6 @@ - XineramaScreenInfo *info; - #endif - -- normcol[ColBG] = getcolor(dc, normbgcolor); -- normcol[ColFG] = getcolor(dc, normfgcolor); -- selcol[ColBG] = getcolor(dc, selbgcolor); -- selcol[ColFG] = getcolor(dc, selfgcolor); -- - clip = XInternAtom(dc->dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False); - -@@ -582,7 +595,7 @@ - - /* create menu window */ - swa.override_redirect = True; -- swa.background_pixel = normcol[ColBG]; -+ swa.background_pixel = normcol->BG; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0, - DefaultDepth(dc->dpy, screen), CopyFromParent, ---- a/draw.c -+++ b/draw.c -@@ -9,9 +9,6 @@ - - #define MAX(a, b) ((a) > (b) ? (a) : (b)) - #define MIN(a, b) ((a) < (b) ? (a) : (b)) --#define DEFAULTFN "fixed" -- --static Bool loadfont(DC *dc, const char *fontstr); - - void - drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) { -@@ -23,7 +20,7 @@ - } - - void --drawtext(DC *dc, const char *text, unsigned long col[ColLast]) { -+drawtext(DC *dc, const char *text, ColorSet *col) { - char buf[BUFSIZ]; - size_t mn, n = strlen(text); - -@@ -35,19 +32,24 @@ - if(mn < n) - for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.'); - -- drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col)); -+ drawrect(dc, 0, 0, dc->w, dc->h, True, col->BG); - drawtextn(dc, buf, mn, col); - } - - void --drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) { -+drawtextn(DC *dc, const char *text, size_t n, ColorSet *col) { - int x = dc->x + dc->font.height/2; - int y = dc->y + dc->font.ascent+1; - -- XSetForeground(dc->dpy, dc->gc, FG(dc, col)); -- if(dc->font.set) -+ XSetForeground(dc->dpy, dc->gc, col->FG); -+ if(dc->font.xft_font) { -+ if (!dc->xftdraw) -+ eprintf("error, xft drawable does not exist"); -+ XftDrawStringUtf8(dc->xftdraw, &col->FG_xft, -+ dc->font.xft_font, x, y, (unsigned char*)text, n); -+ } else if(dc->font.set) { - XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n); -- else { -+ } else { - XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid); - XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n); - } -@@ -69,16 +71,33 @@ - } - - void -+freecol(DC *dc, ColorSet *col) { -+ if(col) { -+ if(&col->FG_xft) -+ XftColorFree(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)), -+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), &col->FG_xft); -+ free(col); -+ } -+} -+ -+void - freedc(DC *dc) { -+ if(dc->font.xft_font) { -+ XftFontClose(dc->dpy, dc->font.xft_font); -+ XftDrawDestroy(dc->xftdraw); -+ } - if(dc->font.set) - XFreeFontSet(dc->dpy, dc->font.set); -- if(dc->font.xfont) -+ if(dc->font.xfont) - XFreeFont(dc->dpy, dc->font.xfont); -- if(dc->canvas) -+ if(dc->canvas) - XFreePixmap(dc->dpy, dc->canvas); -- XFreeGC(dc->dpy, dc->gc); -- XCloseDisplay(dc->dpy); -- free(dc); -+ if(dc->gc) -+ XFreeGC(dc->dpy, dc->gc); -+ if(dc->dpy) -+ XCloseDisplay(dc->dpy); -+ if(dc) -+ free(dc); - } - - unsigned long -@@ -91,6 +110,20 @@ - return color.pixel; - } - -+ColorSet * -+initcolor(DC *dc, const char * foreground, const char * background) { -+ ColorSet * col = (ColorSet *)malloc(sizeof(ColorSet)); -+ if(!col) -+ eprintf("error, cannot allocate memory for color set"); -+ col->BG = getcolor(dc, background); -+ col->FG = getcolor(dc, foreground); -+ if(dc->font.xft_font) -+ if(!XftColorAllocName(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)), -+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), foreground, &col->FG_xft)) -+ eprintf("error, cannot allocate xft font color '%s'\n", foreground); -+ return col; -+} -+ - DC * - initdc(void) { - DC *dc; -@@ -109,23 +142,11 @@ - - void - initfont(DC *dc, const char *fontstr) { -- if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) { -- if(fontstr != NULL) -- fprintf(stderr, "cannot load font '%s'\n", fontstr); -- if(fontstr == NULL || !loadfont(dc, DEFAULTFN)) -- eprintf("cannot load font '%s'\n", DEFAULTFN); -- } -- dc->font.height = dc->font.ascent + dc->font.descent; --} -- --Bool --loadfont(DC *dc, const char *fontstr) { - char *def, **missing, **names; - int i, n; - XFontStruct **xfonts; - -- if(!*fontstr) -- return False; -+ missing = NULL; - if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) { - n = XFontsOfFontSet(dc->font.set, &xfonts, &names); - for(i = 0; i < n; i++) { -@@ -133,15 +154,21 @@ - dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); - dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); - } -- } -- else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { -- dc->font.ascent = dc->font.xfont->ascent; -+ } else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { -+ dc->font.ascent = dc->font.xfont->ascent; - dc->font.descent = dc->font.xfont->descent; - dc->font.width = dc->font.xfont->max_bounds.width; -+ } else if((dc->font.xft_font = XftFontOpenName(dc->dpy, DefaultScreen(dc->dpy), fontstr))) { -+ dc->font.ascent = dc->font.xft_font->ascent; -+ dc->font.descent = dc->font.xft_font->descent; -+ dc->font.width = dc->font.xft_font->max_advance_width; -+ } else { -+ eprintf("cannot load font '%s'\n", fontstr); - } - if(missing) - XFreeStringList(missing); -- return dc->font.set || dc->font.xfont; -+ dc->font.height = dc->font.ascent + dc->font.descent; -+ return; - } - - void -@@ -151,20 +178,29 @@ - - void - resizedc(DC *dc, unsigned int w, unsigned int h) { -+ int screen = DefaultScreen(dc->dpy); - if(dc->canvas) - XFreePixmap(dc->dpy, dc->canvas); - - dc->w = w; - dc->h = h; - dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, -- DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); -+ DefaultDepth(dc->dpy, screen)); -+ if(dc->font.xft_font && !(dc->xftdraw)) { -+ dc->xftdraw = XftDrawCreate(dc->dpy, dc->canvas, DefaultVisual(dc->dpy,screen), DefaultColormap(dc->dpy,screen)); -+ if(!(dc->xftdraw)) -+ eprintf("error, cannot create xft drawable\n"); -+ } - } - - int - textnw(DC *dc, const char *text, size_t len) { -- if(dc->font.set) { -+ if(dc->font.xft_font) { -+ XGlyphInfo gi; -+ XftTextExtentsUtf8(dc->dpy, dc->font.xft_font, (const FcChar8*)text, len, &gi); -+ return gi.width; -+ } else if(dc->font.set) { - XRectangle r; -- - XmbTextExtents(dc->font.set, text, len, NULL, &r); - return r.width; - } ---- a/draw.h -+++ b/draw.h -@@ -1,9 +1,6 @@ - /* See LICENSE file for copyright and license details. */ - --#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG]) --#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG]) -- --enum { ColBG, ColFG, ColBorder, ColLast }; -+#include <X11/Xft/Xft.h> - - typedef struct { - int x, y, w, h; -@@ -11,6 +8,7 @@ - Display *dpy; - GC gc; - Pixmap canvas; -+ XftDraw *xftdraw; - struct { - int ascent; - int descent; -@@ -18,15 +16,24 @@ - int width; - XFontSet set; - XFontStruct *xfont; -+ XftFont *xft_font; - } font; - } DC; /* draw context */ - -+typedef struct { -+ unsigned long FG; -+ XftColor FG_xft; -+ unsigned long BG; -+} ColorSet; -+ - void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color); --void drawtext(DC *dc, const char *text, unsigned long col[ColLast]); --void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]); -+void drawtext(DC *dc, const char *text, ColorSet *col); -+void drawtextn(DC *dc, const char *text, size_t n, ColorSet *col); -+void freecol(DC *dc, ColorSet *col); - void eprintf(const char *fmt, ...); - void freedc(DC *dc); - unsigned long getcolor(DC *dc, const char *colstr); -+ColorSet *initcolor(DC *dc, const char *foreground, const char *background); - DC *initdc(void); - void initfont(DC *dc, const char *fontstr); - void mapdc(DC *dc, Window win, unsigned int w, unsigned int h); diff --git a/x11-misc/dmenu/files/dmenu-4.5-xft-3.patch b/x11-misc/dmenu/files/dmenu-4.5-xft-3.patch deleted file mode 100644 index e97629a69871..000000000000 --- a/x11-misc/dmenu/files/dmenu-4.5-xft-3.patch +++ /dev/null @@ -1,412 +0,0 @@ ---- a/config.mk -+++ b/config.mk -@@ -12,9 +12,13 @@ - XINERAMALIBS = -lXinerama - XINERAMAFLAGS = -DXINERAMA - -+# Xft, comment if you don't want it -+XFTINC = $(shell pkg-config --cflags xft) -+XFTLIBS = $(shell pkg-config --libs xft) -+ - # includes and libs --INCS = -I${X11INC} --LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -+INCS = -I${X11INC} ${XFTINC} -+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${XFTLIBS} - - # flags - CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} ---- a/dmenu.1 -+++ b/dmenu.1 -@@ -53,7 +53,7 @@ - defines the prompt to be displayed to the left of the input field. - .TP - .BI \-fn " font" --defines the font or font set used. -+defines the font or font set used. eg. "fixed" or "Monospace-12:normal" (an xft font) - .TP - .BI \-nb " color" - defines the normal background color. ---- a/dmenu.c -+++ b/dmenu.c -@@ -17,6 +17,7 @@ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) - #define MIN(a,b) ((a) < (b) ? (a) : (b)) - #define MAX(a,b) ((a) > (b) ? (a) : (b)) -+#define DEFFONT "fixed" /* xft example: "Monospace-11" */ - - typedef struct Item Item; - struct Item { -@@ -26,6 +27,7 @@ - - static void appenditem(Item *item, Item **list, Item **last); - static void calcoffsets(void); -+static void cleanup(void); - static char *cistrstr(const char *s, const char *sub); - static void drawmenu(void); - static void grabkeyboard(void); -@@ -50,10 +52,12 @@ - static const char *selbgcolor = "#005577"; - static const char *selfgcolor = "#eeeeee"; - static unsigned int lines = 0; --static unsigned long normcol[ColLast]; --static unsigned long selcol[ColLast]; -+static ColorSet *normcol; -+static ColorSet *selcol; - static Atom clip, utf8; - static Bool topbar = True; -+static Bool running = True; -+static int ret = 0; - static DC *dc; - static Item *items = NULL; - static Item *matches, *matchend; -@@ -104,7 +108,9 @@ - usage(); - - dc = initdc(); -- initfont(dc, font); -+ initfont(dc, font ? font : DEFFONT); -+ normcol = initcolor(dc, normfgcolor, normbgcolor); -+ selcol = initcolor(dc, selfgcolor, selbgcolor); - - if(fast) { - grabkeyboard(); -@@ -117,7 +123,8 @@ - setup(); - run(); - -- return 1; /* unreachable */ -+ cleanup(); -+ return ret; - } - - void -@@ -160,6 +167,15 @@ - } - - void -+cleanup(void) { -+ freecol(dc, normcol); -+ freecol(dc, selcol); -+ XDestroyWindow(dc->dpy, win); -+ XUngrabKeyboard(dc->dpy, CurrentTime); -+ freedc(dc); -+} -+ -+void - drawmenu(void) { - int curpos; - Item *item; -@@ -167,7 +183,7 @@ - dc->x = 0; - dc->y = 0; - dc->h = bh; -- drawrect(dc, 0, 0, mw, mh, True, BG(dc, normcol)); -+ drawrect(dc, 0, 0, mw, mh, True, normcol->BG); - - if(prompt) { - dc->w = promptw; -@@ -178,7 +194,7 @@ - dc->w = (lines > 0 || !matches) ? mw - dc->x : inputw; - drawtext(dc, text, normcol); - if((curpos = textnw(dc, text, cursor) + dc->h/2 - 2) < dc->w) -- drawrect(dc, curpos, 2, 1, dc->h - 4, True, FG(dc, normcol)); -+ drawrect(dc, curpos, 2, 1, dc->h - 4, True, normcol->FG); - - if(lines > 0) { - /* draw vertical list */ -@@ -321,7 +337,9 @@ - sel = matchend; - break; - case XK_Escape: -- exit(EXIT_FAILURE); -+ ret = EXIT_FAILURE; -+ running = False; -+ break; - case XK_Home: - if(sel == matches) { - cursor = 0; -@@ -359,7 +377,9 @@ - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); -- exit(EXIT_SUCCESS); -+ ret = EXIT_SUCCESS; -+ running = False; -+ break; - case XK_Right: - if(text[cursor] != '\0') { - cursor = nextrune(+1); -@@ -490,7 +510,7 @@ - run(void) { - XEvent ev; - -- while(!XNextEvent(dc->dpy, &ev)) { -+ while(running && !XNextEvent(dc->dpy, &ev)) { - if(XFilterEvent(&ev, win)) - continue; - switch(ev.type) { -@@ -524,11 +544,6 @@ - XineramaScreenInfo *info; - #endif - -- normcol[ColBG] = getcolor(dc, normbgcolor); -- normcol[ColFG] = getcolor(dc, normfgcolor); -- selcol[ColBG] = getcolor(dc, selbgcolor); -- selcol[ColFG] = getcolor(dc, selfgcolor); -- - clip = XInternAtom(dc->dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False); - -@@ -582,7 +597,7 @@ - - /* create menu window */ - swa.override_redirect = True; -- swa.background_pixel = normcol[ColBG]; -+ swa.background_pixel = normcol->BG; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0, - DefaultDepth(dc->dpy, screen), CopyFromParent, ---- a/draw.c -+++ b/draw.c -@@ -9,9 +9,6 @@ - - #define MAX(a, b) ((a) > (b) ? (a) : (b)) - #define MIN(a, b) ((a) < (b) ? (a) : (b)) --#define DEFAULTFN "fixed" -- --static Bool loadfont(DC *dc, const char *fontstr); - - void - drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color) { -@@ -23,7 +20,7 @@ - } - - void --drawtext(DC *dc, const char *text, unsigned long col[ColLast]) { -+drawtext(DC *dc, const char *text, ColorSet *col) { - char buf[BUFSIZ]; - size_t mn, n = strlen(text); - -@@ -35,19 +32,24 @@ - if(mn < n) - for(n = MAX(mn-3, 0); n < mn; buf[n++] = '.'); - -- drawrect(dc, 0, 0, dc->w, dc->h, True, BG(dc, col)); -+ drawrect(dc, 0, 0, dc->w, dc->h, True, col->BG); - drawtextn(dc, buf, mn, col); - } - - void --drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]) { -+drawtextn(DC *dc, const char *text, size_t n, ColorSet *col) { - int x = dc->x + dc->font.height/2; - int y = dc->y + dc->font.ascent+1; - -- XSetForeground(dc->dpy, dc->gc, FG(dc, col)); -- if(dc->font.set) -+ XSetForeground(dc->dpy, dc->gc, col->FG); -+ if(dc->font.xft_font) { -+ if (!dc->xftdraw) -+ eprintf("error, xft drawable does not exist"); -+ XftDrawStringUtf8(dc->xftdraw, &col->FG_xft, -+ dc->font.xft_font, x, y, (unsigned char*)text, n); -+ } else if(dc->font.set) { - XmbDrawString(dc->dpy, dc->canvas, dc->font.set, dc->gc, x, y, text, n); -- else { -+ } else { - XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid); - XDrawString(dc->dpy, dc->canvas, dc->gc, x, y, text, n); - } -@@ -69,16 +71,33 @@ - } - - void -+freecol(DC *dc, ColorSet *col) { -+ if(col) { -+ if(&col->FG_xft) -+ XftColorFree(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)), -+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), &col->FG_xft); -+ free(col); -+ } -+} -+ -+void - freedc(DC *dc) { -+ if(dc->font.xft_font) { -+ XftFontClose(dc->dpy, dc->font.xft_font); -+ XftDrawDestroy(dc->xftdraw); -+ } - if(dc->font.set) - XFreeFontSet(dc->dpy, dc->font.set); -- if(dc->font.xfont) -+ if(dc->font.xfont) - XFreeFont(dc->dpy, dc->font.xfont); -- if(dc->canvas) -+ if(dc->canvas) - XFreePixmap(dc->dpy, dc->canvas); -- XFreeGC(dc->dpy, dc->gc); -- XCloseDisplay(dc->dpy); -- free(dc); -+ if(dc->gc) -+ XFreeGC(dc->dpy, dc->gc); -+ if(dc->dpy) -+ XCloseDisplay(dc->dpy); -+ if(dc) -+ free(dc); - } - - unsigned long -@@ -91,6 +110,20 @@ - return color.pixel; - } - -+ColorSet * -+initcolor(DC *dc, const char * foreground, const char * background) { -+ ColorSet * col = (ColorSet *)malloc(sizeof(ColorSet)); -+ if(!col) -+ eprintf("error, cannot allocate memory for color set"); -+ col->BG = getcolor(dc, background); -+ col->FG = getcolor(dc, foreground); -+ if(dc->font.xft_font) -+ if(!XftColorAllocName(dc->dpy, DefaultVisual(dc->dpy, DefaultScreen(dc->dpy)), -+ DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)), foreground, &col->FG_xft)) -+ eprintf("error, cannot allocate xft font color '%s'\n", foreground); -+ return col; -+} -+ - DC * - initdc(void) { - DC *dc; -@@ -109,23 +142,11 @@ - - void - initfont(DC *dc, const char *fontstr) { -- if(!loadfont(dc, fontstr ? fontstr : DEFAULTFN)) { -- if(fontstr != NULL) -- fprintf(stderr, "cannot load font '%s'\n", fontstr); -- if(fontstr == NULL || !loadfont(dc, DEFAULTFN)) -- eprintf("cannot load font '%s'\n", DEFAULTFN); -- } -- dc->font.height = dc->font.ascent + dc->font.descent; --} -- --Bool --loadfont(DC *dc, const char *fontstr) { - char *def, **missing, **names; - int i, n; - XFontStruct **xfonts; - -- if(!*fontstr) -- return False; -+ missing = NULL; - if((dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def))) { - n = XFontsOfFontSet(dc->font.set, &xfonts, &names); - for(i = 0; i < n; i++) { -@@ -133,15 +154,21 @@ - dc->font.descent = MAX(dc->font.descent, xfonts[i]->descent); - dc->font.width = MAX(dc->font.width, xfonts[i]->max_bounds.width); - } -- } -- else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { -- dc->font.ascent = dc->font.xfont->ascent; -+ } else if((dc->font.xfont = XLoadQueryFont(dc->dpy, fontstr))) { -+ dc->font.ascent = dc->font.xfont->ascent; - dc->font.descent = dc->font.xfont->descent; - dc->font.width = dc->font.xfont->max_bounds.width; -+ } else if((dc->font.xft_font = XftFontOpenName(dc->dpy, DefaultScreen(dc->dpy), fontstr))) { -+ dc->font.ascent = dc->font.xft_font->ascent; -+ dc->font.descent = dc->font.xft_font->descent; -+ dc->font.width = dc->font.xft_font->max_advance_width; -+ } else { -+ eprintf("cannot load font '%s'\n", fontstr); - } - if(missing) - XFreeStringList(missing); -- return dc->font.set || dc->font.xfont; -+ dc->font.height = dc->font.ascent + dc->font.descent; -+ return; - } - - void -@@ -151,20 +178,29 @@ - - void - resizedc(DC *dc, unsigned int w, unsigned int h) { -+ int screen = DefaultScreen(dc->dpy); - if(dc->canvas) - XFreePixmap(dc->dpy, dc->canvas); - - dc->w = w; - dc->h = h; - dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h, -- DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); -+ DefaultDepth(dc->dpy, screen)); -+ if(dc->font.xft_font && !(dc->xftdraw)) { -+ dc->xftdraw = XftDrawCreate(dc->dpy, dc->canvas, DefaultVisual(dc->dpy,screen), DefaultColormap(dc->dpy,screen)); -+ if(!(dc->xftdraw)) -+ eprintf("error, cannot create xft drawable\n"); -+ } - } - - int - textnw(DC *dc, const char *text, size_t len) { -- if(dc->font.set) { -+ if(dc->font.xft_font) { -+ XGlyphInfo gi; -+ XftTextExtentsUtf8(dc->dpy, dc->font.xft_font, (const FcChar8*)text, len, &gi); -+ return gi.width; -+ } else if(dc->font.set) { - XRectangle r; -- - XmbTextExtents(dc->font.set, text, len, NULL, &r); - return r.width; - } ---- a/draw.h -+++ b/draw.h -@@ -1,9 +1,6 @@ - /* See LICENSE file for copyright and license details. */ - --#define FG(dc, col) ((col)[(dc)->invert ? ColBG : ColFG]) --#define BG(dc, col) ((col)[(dc)->invert ? ColFG : ColBG]) -- --enum { ColBG, ColFG, ColBorder, ColLast }; -+#include <X11/Xft/Xft.h> - - typedef struct { - int x, y, w, h; -@@ -11,6 +8,7 @@ - Display *dpy; - GC gc; - Pixmap canvas; -+ XftDraw *xftdraw; - struct { - int ascent; - int descent; -@@ -18,15 +16,24 @@ - int width; - XFontSet set; - XFontStruct *xfont; -+ XftFont *xft_font; - } font; - } DC; /* draw context */ - -+typedef struct { -+ unsigned long FG; -+ XftColor FG_xft; -+ unsigned long BG; -+} ColorSet; -+ - void drawrect(DC *dc, int x, int y, unsigned int w, unsigned int h, Bool fill, unsigned long color); --void drawtext(DC *dc, const char *text, unsigned long col[ColLast]); --void drawtextn(DC *dc, const char *text, size_t n, unsigned long col[ColLast]); -+void drawtext(DC *dc, const char *text, ColorSet *col); -+void drawtextn(DC *dc, const char *text, size_t n, ColorSet *col); -+void freecol(DC *dc, ColorSet *col); - void eprintf(const char *fmt, ...); - void freedc(DC *dc); - unsigned long getcolor(DC *dc, const char *colstr); -+ColorSet *initcolor(DC *dc, const char *foreground, const char *background); - DC *initdc(void); - void initfont(DC *dc, const char *fontstr); - void mapdc(DC *dc, Window win, unsigned int w, unsigned int h); |