diff options
Diffstat (limited to '')
| -rw-r--r-- | Makefile | 16 | ||||
| -rw-r--r-- | config.mk | 4 | ||||
| -rw-r--r-- | dinput.c | 1 | ||||
| -rw-r--r-- | draw.c | 136 | ||||
| -rw-r--r-- | draw/Makefile | 26 | ||||
| -rw-r--r-- | draw/cleanupdraw.c | 13 | ||||
| -rw-r--r-- | draw/draw.h (renamed from draw.h) | 3 | ||||
| -rw-r--r-- | draw/drawtext.c | 34 | ||||
| -rw-r--r-- | draw/eprint.c | 18 | ||||
| -rw-r--r-- | draw/getcolor.c | 13 | ||||
| -rw-r--r-- | draw/initfont.c | 36 | ||||
| -rw-r--r-- | draw/setupdraw.c | 16 | ||||
| -rw-r--r-- | draw/textnw.c | 14 | ||||
| -rw-r--r-- | draw/textw.c | 9 | 
14 files changed, 191 insertions, 148 deletions
| @@ -3,7 +3,7 @@  include config.mk -SRC = dinput.c dmenu.c draw.c +SRC = dinput.c dmenu.c  OBJ = ${SRC:.c=.o}  all: options dinput dmenu @@ -18,28 +18,28 @@ options:  	@echo CC $<  	@${CC} -c ${CFLAGS} $< -${OBJ}: config.h config.mk draw.h +${OBJ}: config.h config.mk draw/libdraw.a  config.h:  	@echo creating $@ from config.def.h  	@cp config.def.h $@ -dinput: dinput.o draw.o +.o:  	@echo CC -o $@ -	@${CC} -o $@ $+ ${LDFLAGS} +	@${CC} -o $@ $< ${LDFLAGS} -dmenu: dmenu.o draw.o -	@echo CC -o $@ -	@${CC} -o $@ $+ ${LDFLAGS} +draw/libdraw.a: +	@cd draw && make  clean:  	@echo cleaning  	@rm -f dinput dmenu ${OBJ} dmenu-${VERSION}.tar.gz +	@cd draw && make clean  dist: clean  	@echo creating dist tarball  	@mkdir -p dmenu-${VERSION} -	@cp -R LICENSE Makefile README config.mk dmenu.1 config.def.h dmenu_path dmenu_run ${SRC} dmenu-${VERSION} +	@cp -R LICENSE Makefile README config.mk dmenu.1 config.def.h dmenu_path dmenu_run draw ${SRC} dmenu-${VERSION}  	@tar -cf dmenu-${VERSION}.tar dmenu-${VERSION}  	@gzip dmenu-${VERSION}.tar  	@rm -rf dmenu-${VERSION} @@ -15,8 +15,8 @@ XINERAMALIBS = -L${X11LIB} -lXinerama  XINERAMAFLAGS = -DXINERAMA  # includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} +INCS = -I. -Idraw -I/usr/include -I${X11INC} +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -Ldraw -ldraw ${XINERAMALIBS}  # flags  CPPFLAGS = -D_BSD_SOURCE -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} @@ -5,7 +5,6 @@  #include <stdio.h>  #include <stdlib.h>  #include <string.h> -#include <strings.h>  #include <unistd.h>  #include <X11/keysym.h>  #include <X11/Xlib.h> @@ -1,136 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include <ctype.h> -#include <locale.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <X11/Xlib.h> -#include "draw.h" - -/* macros */ -#define MIN(a, b)               ((a) < (b) ? (a) : (b)) -#define MAX(a, b)               ((a) > (b) ? (a) : (b)) - -/* variables */ -const char *progname; - -void -cleanupdraw(DC *dc) { -	if(dc->font.set) -		XFreeFontSet(dc->dpy, dc->font.set); -	else -		XFreeFont(dc->dpy, dc->font.xfont); -	XFreePixmap(dc->dpy, dc->drawable); -	XFreeGC(dc->dpy, dc->gc); -} - -void -setupdraw(DC *dc, Window w) { -	XWindowAttributes wa; - -	XGetWindowAttributes(dc->dpy, w, &wa); -	dc->drawable = XCreatePixmap(dc->dpy, w, wa.width, wa.height, -		DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); -	dc->gc = XCreateGC(dc->dpy, w, 0, NULL); -	XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter); -	if(!dc->font.set) -		XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid); -} - -void -drawtext(DC *dc, const char *text, unsigned long col[ColLast]) { -	char buf[256]; -	int i, x, y, h, len, olen; -	XRectangle r = { dc->x, dc->y, dc->w, dc->h }; - -	XSetForeground(dc->dpy, dc->gc, col[ColBG]); -	XFillRectangles(dc->dpy, dc->drawable, dc->gc, &r, 1); -	if(!text) -		return; -	olen = strlen(text); -	h = dc->font.height; -	y = dc->y + ((h+2) / 2) - (h / 2) + dc->font.ascent; -	x = dc->x + (h / 2); -	/* shorten text if necessary */ -	for(len = MIN(olen, sizeof buf); len && textnw(dc, text, len) > dc->w - h; len--); -	if(!len) -		return; -	memcpy(buf, text, len); -	if(len < olen) -		for(i = len; i && i > len - 3; buf[--i] = '.'); -	XSetForeground(dc->dpy, dc->gc, col[ColFG]); -	if(dc->font.set) -		XmbDrawString(dc->dpy, dc->drawable, dc->font.set, dc->gc, x, y, buf, len); -	else -		XDrawString(dc->dpy, dc->drawable, dc->gc, x, y, buf, len); -} - -void -eprint(const char *fmt, ...) { -	va_list ap; - -	fprintf(stderr, "%s: ", progname); -	va_start(ap, fmt); -	vfprintf(stderr, fmt, ap); -	va_end(ap); -	exit(EXIT_FAILURE); -} - -unsigned long -getcolor(DC *dc, const char *colstr) { -	Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)); -	XColor color; - -	if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color)) -		eprint("cannot allocate color '%s'\n", colstr); -	return color.pixel; -} - -void -initfont(DC *dc, const char *fontstr) { -	char *def, **missing = NULL; -	int i, n; - -	if(!fontstr || !*fontstr) -		eprint("cannot load null font\n"); -	dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def); -	if(missing) -		XFreeStringList(missing); -	if(dc->font.set) { -		XFontStruct **xfonts; -		char **font_names; -		dc->font.ascent = dc->font.descent = 0; -		n = XFontsOfFontSet(dc->font.set, &xfonts, &font_names); -		for(i = 0; i < n; i++) { -			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(dc->dpy, fontstr)) -		&& !(dc->font.xfont = XLoadQueryFont(dc->dpy, "fixed"))) -			eprint("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; -} - -int -textnw(DC *dc, 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); -} - -int -textw(DC *dc, const char *text) { -	return textnw(dc, text, strlen(text)) + dc->font.height; -} diff --git a/draw/Makefile b/draw/Makefile new file mode 100644 index 0000000..1f72b61 --- /dev/null +++ b/draw/Makefile @@ -0,0 +1,26 @@ +# libdraw - dynamic drawing library +# See LICENSE file for copyright and license details. + +include ../config.mk + +SRC = cleanupdraw.c setupdraw.c drawtext.c eprint.c getcolor.c initfont.c \ +textnw.c textw.c +OBJ = ${SRC:.c=.o} + +all: libdraw.a + +.c.o: +	@echo CC $< +	@${CC} -c ${CFLAGS} $< + +${OBJ}: ../config.mk draw.h + +libdraw.a: ${OBJ} +	@echo AR $@ +	@ar cr $@ $+ + +clean: +	@echo cleaning libdraw +	@rm -f libdraw.a ${OBJ} + +.PHONY: all options clean diff --git a/draw/cleanupdraw.c b/draw/cleanupdraw.c new file mode 100644 index 0000000..28bce13 --- /dev/null +++ b/draw/cleanupdraw.c @@ -0,0 +1,13 @@ +/* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h> +#include "draw.h" + +void +cleanupdraw(DC *dc) { +	if(dc->font.set) +		XFreeFontSet(dc->dpy, dc->font.set); +	else +		XFreeFont(dc->dpy, dc->font.xfont); +	XFreePixmap(dc->dpy, dc->drawable); +	XFreeGC(dc->dpy, dc->gc); +} @@ -1,4 +1,5 @@  /* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h>  /* enums */  enum { ColFG, ColBG, ColLast }; @@ -20,11 +21,11 @@ typedef struct {  /* forward declarations */  void cleanupdraw(DC *dc); -void setupdraw(DC *dc, Window w);  void drawtext(DC *dc, const char *text, unsigned long col[ColLast]);  void eprint(const char *fmt, ...);  unsigned long getcolor(DC *dc, const char *colstr);  void initfont(DC *dc, const char *fontstr); +void setupdraw(DC *dc, Window w);  int textnw(DC *dc, const char *text, unsigned int len);  int textw(DC *dc, const char *text); diff --git a/draw/drawtext.c b/draw/drawtext.c new file mode 100644 index 0000000..cf7b015 --- /dev/null +++ b/draw/drawtext.c @@ -0,0 +1,34 @@ +/* See LICENSE file for copyright and license details. */ +#include <string.h> +#include <X11/Xlib.h> +#include "draw.h" + +#define MIN(a, b)               ((a) < (b) ? (a) : (b)) + +void +drawtext(DC *dc, const char *text, unsigned long col[ColLast]) { +	char buf[256]; +	int i, x, y, h, len, olen; +	XRectangle r = { dc->x, dc->y, dc->w, dc->h }; + +	XSetForeground(dc->dpy, dc->gc, col[ColBG]); +	XFillRectangles(dc->dpy, dc->drawable, dc->gc, &r, 1); +	if(!text) +		return; +	olen = strlen(text); +	h = dc->font.height; +	y = dc->y + ((h+2) / 2) - (h / 2) + dc->font.ascent; +	x = dc->x + (h / 2); +	/* shorten text if necessary */ +	for(len = MIN(olen, sizeof buf); len && textnw(dc, text, len) > dc->w - h; len--); +	if(!len) +		return; +	memcpy(buf, text, len); +	if(len < olen) +		for(i = len; i && i > len - 3; buf[--i] = '.'); +	XSetForeground(dc->dpy, dc->gc, col[ColFG]); +	if(dc->font.set) +		XmbDrawString(dc->dpy, dc->drawable, dc->font.set, dc->gc, x, y, buf, len); +	else +		XDrawString(dc->dpy, dc->drawable, dc->gc, x, y, buf, len); +} diff --git a/draw/eprint.c b/draw/eprint.c new file mode 100644 index 0000000..3094b61 --- /dev/null +++ b/draw/eprint.c @@ -0,0 +1,18 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include "draw.h" + +const char *progname; + +void +eprint(const char *fmt, ...) { +	va_list ap; + +	fprintf(stderr, "%s: ", progname); +	va_start(ap, fmt); +	vfprintf(stderr, fmt, ap); +	va_end(ap); +	exit(EXIT_FAILURE); +} diff --git a/draw/getcolor.c b/draw/getcolor.c new file mode 100644 index 0000000..c0e5d21 --- /dev/null +++ b/draw/getcolor.c @@ -0,0 +1,13 @@ +/* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h> +#include "draw.h" + +unsigned long +getcolor(DC *dc, const char *colstr) { +	Colormap cmap = DefaultColormap(dc->dpy, DefaultScreen(dc->dpy)); +	XColor color; + +	if(!XAllocNamedColor(dc->dpy, cmap, colstr, &color, &color)) +		eprint("cannot allocate color '%s'\n", colstr); +	return color.pixel; +} diff --git a/draw/initfont.c b/draw/initfont.c new file mode 100644 index 0000000..77d3182 --- /dev/null +++ b/draw/initfont.c @@ -0,0 +1,36 @@ +/* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h> +#include "draw.h" + +#define MAX(a, b)               ((a) > (b) ? (a) : (b)) + +void +initfont(DC *dc, const char *fontstr) { +	char *def, **missing = NULL; +	int i, n; + +	if(!fontstr || !*fontstr) +		eprint("cannot load null font\n"); +	dc->font.set = XCreateFontSet(dc->dpy, fontstr, &missing, &n, &def); +	if(missing) +		XFreeStringList(missing); +	if(dc->font.set) { +		XFontStruct **xfonts; +		char **font_names; +		dc->font.ascent = dc->font.descent = 0; +		n = XFontsOfFontSet(dc->font.set, &xfonts, &font_names); +		for(i = 0; i < n; i++) { +			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(dc->dpy, fontstr)) +		&& !(dc->font.xfont = XLoadQueryFont(dc->dpy, "fixed"))) +			eprint("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; +} diff --git a/draw/setupdraw.c b/draw/setupdraw.c new file mode 100644 index 0000000..7dd5012 --- /dev/null +++ b/draw/setupdraw.c @@ -0,0 +1,16 @@ +/* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h> +#include "draw.h" + +void +setupdraw(DC *dc, Window w) { +	XWindowAttributes wa; + +	XGetWindowAttributes(dc->dpy, w, &wa); +	dc->drawable = XCreatePixmap(dc->dpy, w, wa.width, wa.height, +		DefaultDepth(dc->dpy, DefaultScreen(dc->dpy))); +	dc->gc = XCreateGC(dc->dpy, w, 0, NULL); +	XSetLineAttributes(dc->dpy, dc->gc, 1, LineSolid, CapButt, JoinMiter); +	if(!dc->font.set) +		XSetFont(dc->dpy, dc->gc, dc->font.xfont->fid); +} diff --git a/draw/textnw.c b/draw/textnw.c new file mode 100644 index 0000000..9c0c122 --- /dev/null +++ b/draw/textnw.c @@ -0,0 +1,14 @@ +/* See LICENSE file for copyright and license details. */ +#include <X11/Xlib.h> +#include "draw.h" + +int +textnw(DC *dc, 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); +} diff --git a/draw/textw.c b/draw/textw.c new file mode 100644 index 0000000..a8407f6 --- /dev/null +++ b/draw/textw.c @@ -0,0 +1,9 @@ +/* See LICENSE file for copyright and license details. */ +#include <string.h> +#include <X11/Xlib.h> +#include "draw.h" + +int +textw(DC *dc, const char *text) { +	return textnw(dc, text, strlen(text)) + dc->font.height; +} | 
