moved draw.c to libdraw.a
							parent
							
								
									723361fa12
								
							
						
					
					
						commit
						4508fd2c4e
					
				
							
								
								
									
										16
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										16
									
								
								Makefile
								
								
								
								
							|  | @ -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} | ||||
|  |  | |||
							
								
								
									
										1
									
								
								dinput.c
								
								
								
								
							
							
						
						
									
										1
									
								
								dinput.c
								
								
								
								
							|  | @ -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> | ||||
|  |  | |||
							
								
								
									
										136
									
								
								draw.c
								
								
								
								
							
							
						
						
									
										136
									
								
								draw.c
								
								
								
								
							|  | @ -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; | ||||
| } | ||||
|  | @ -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 | ||||
|  | @ -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); | ||||
| 
 | ||||
|  | @ -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); | ||||
| } | ||||
|  | @ -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); | ||||
| } | ||||
|  | @ -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; | ||||
| } | ||||
|  | @ -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; | ||||
| } | ||||
|  | @ -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); | ||||
| } | ||||
|  | @ -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); | ||||
| } | ||||
|  | @ -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; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue