diff options
| -rw-r--r-- | Makefile | 12 | ||||
| -rw-r--r-- | config.h | 9 | ||||
| -rw-r--r-- | config.mk | 4 | ||||
| -rw-r--r-- | draw.c | 163 | ||||
| -rw-r--r-- | draw.h | 6 | ||||
| -rw-r--r-- | font.c | 81 | ||||
| -rw-r--r-- | gridmenu.1 | 16 | ||||
| -rw-r--r-- | util.c | 18 | ||||
| -rw-r--r-- | util.h | 41 | ||||
| -rw-r--r-- | wm.c | 9 | ||||
| -rw-r--r-- | wm.h | 5 | 
11 files changed, 328 insertions, 36 deletions
| @@ -3,8 +3,8 @@  include config.mk -SRC = wm.c -OBJ = ${SRC:.c=.o} +WMSRC = wm.c draw.c util.c +WMOBJ = ${WMSRC:.c=.o}  MAN = gridwm.1  BIN = gridwm gridmenu      @@ -22,18 +22,18 @@ config:  	@echo CC $<  	@${CC} -c ${CFLAGS} $< -${OBJ}: wm.h +${WMOBJ}: wm.h draw.h config.h -gridwm: ${OBJ} +gridwm: ${WMOBJ}  	@echo LD $@ -	@${CC} -o $@ ${OBJ} ${X11LDFLAGS} +	@${CC} -o $@ ${WMOBJ} ${LDFLAGS}  clean:  	rm -f gridwm *.o  dist: clean  	mkdir -p gridwm-${VERSION} -	cp -R Makefile README LICENSE config.mk ${SRC} ${MAN} gridwm-${VERSION} +	cp -R Makefile README LICENSE config.mk ${WMSRC} ${MAN} gridwm-${VERSION}  	tar -cf gridwm-${VERSION}.tar gridwm-${VERSION}  	gzip gridwm-${VERSION}.tar  	rm -rf gridwm-${VERSION} diff --git a/config.h b/config.h new file mode 100644 index 0000000..036a41b --- /dev/null +++ b/config.h @@ -0,0 +1,9 @@ +/* + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#define FONT	"fixed" +#define FGCOLOR	"#000000" +#define BGCOLOR	"#ffaa00" +#define BOCOLOR	"#000000" @@ -11,14 +11,12 @@ X11LIB = /usr/X11R6/lib  VERSION = 0.0  # includes and libs -LIBS = -L${PREFIX}/lib -L/usr/lib -lc -X11LIBS = -L${X11LIB} -lX11 +LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11  # Linux/BSD  CFLAGS = -g -Wall -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \  	-DVERSION=\"${VERSION}\"  LDFLAGS = -g ${LIBS} -X11LDFLAGS = ${LDFLAGS} ${X11LIBS}  # Solaris  #CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\" @@ -0,0 +1,163 @@ +/* + * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include <stdio.h> +#include <string.h> + +#include "draw.h" +#include "util.h" + +static void +drawborder(Display *dpy, Brush *b) +{ +	XPoint points[5]; +	XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter); +	XSetForeground(dpy, b->gc, b->color.border); +	points[0].x = b->rect.x; +	points[0].y = b->rect.y; +	points[1].x = b->rect.width - 1; +	points[1].y = 0; +	points[2].x = 0; +	points[2].y = b->rect.height - 1; +	points[3].x = -(b->rect.width - 1); +	points[3].y = 0; +	points[4].x = 0; +	points[4].y = -(b->rect.height - 1); +	XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious); +} + +void +draw(Display *dpy, Brush *b) +{ +	unsigned int x, y, w, h, len; +	static char buf[256]; +	XGCValues gcv; + +	XSetForeground(dpy, b->gc, b->color.bg); +	XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1); + +	if(b->border) +		drawborder(dpy, b); + +	if(!b->text) +		return; + +	len = strlen(b->text); +	if(len >= sizeof(buf)) +		len = sizeof(buf) - 1; +	memcpy(buf, b->text, len); +	buf[len] = 0; + +	h = b->font->ascent + b->font->descent; +	y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font->ascent; +	x = b->rect.x + (h / 2); + +	/* shorten text if necessary */ +	while(len && (w = textwidth_l(b->font, buf, len)) > b->rect.width - h) +		buf[--len] = 0; + +	if(w > b->rect.width) +		return; /* too long */ + +	gcv.foreground = b->color.fg; +	gcv.background = b->color.bg; +	if(b->font->set) { +		XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv); +		XmbDrawImageString(dpy, b->drawable, b->font->set, b->gc, +				x, y, buf, len); +	} +	else { +		gcv.font = b->font->xfont->fid; +		XChangeGC(dpy, b->gc, GCForeground | GCBackground | GCFont, &gcv); +		XDrawImageString(dpy, b->drawable, b->gc, x, y, buf, len); +	} +} + +static unsigned long +xloadcolor(Display *dpy, Colormap cmap, const char *colstr) +{ +	XColor color; +	XAllocNamedColor(dpy, cmap, colstr, &color, &color); +	return color.pixel; +} + +void +loadcolor(Display *dpy, int screen, Color *c, +		const char *bg, const char *fg, const char *border) +{ +	Colormap cmap = DefaultColormap(dpy, screen); +	c->bg = xloadcolor(dpy, cmap, bg); +	c->fg = xloadcolor(dpy, cmap, fg); +	c->border = xloadcolor(dpy, cmap, border); +} + +unsigned int +textwidth_l(Fnt *font, char *text, unsigned int len) +{ +	if(font->set) { +		XRectangle r; +		XmbTextExtents(font->set, text, len, 0, &r); +		return r.width; +	} +	return XTextWidth(font->xfont, text, len); +} + +unsigned int +textwidth(Fnt *font, char *text) +{ +	return textwidth_l(font, text, strlen(text)); +} + +void +loadfont(Display *dpy, Fnt *font, const char *fontstr) +{ +	char **missing, *def; +	int n; + +	missing = 0; +	def = "?"; +	setlocale(LC_ALL, ""); +	if(font->set) +		XFreeFontSet(dpy, font->set); +	font->set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); +	if(missing) { +		while(n--) +			fprintf(stderr, "missing fontset: %s\n", missing[n]); +		XFreeStringList(missing); +		if(font->set) { +			XFreeFontSet(dpy, font->set); +			font->set = 0; +		} +	} +	if(font->set) { +		XFontSetExtents *font_extents; +		XFontStruct **xfonts; +		char **font_names; +		unsigned int i; + +		font->ascent = font->descent = 0; +		font_extents = XExtentsOfFontSet(font->set); +		n = XFontsOfFontSet(font->set, &xfonts, &font_names); +		for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) { +			if(font->ascent < (*xfonts)->ascent) +				font->ascent = (*xfonts)->ascent; +			if(font->descent < (*xfonts)->descent) +				font->descent = (*xfonts)->descent; +			xfonts++; +		} +	} +	else { +		if(font->xfont) +			XFreeFont(dpy, font->xfont); +		font->xfont = 0; +		font->xfont = XLoadQueryFont(dpy, fontstr); +		if (!font->xfont) +			font->xfont = XLoadQueryFont(dpy, "fixed"); +		if (!font->xfont) +			error("error, cannot load 'fixed' font\n"); +		font->ascent = font->xfont->ascent; +		font->descent = font->xfont->descent; +	} +} @@ -0,0 +1,6 @@ +/* + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +extern void error(char *errstr, ...); @@ -0,0 +1,81 @@ +/* + * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <locale.h> + +unsigned int +textwidth_l(BlitzFont *font, char *text, unsigned int len) +{ +	if(font->set) { +		XRectangle r; +		XmbTextExtents(font->set, text, len, nil, &r); +		return r.width; +	} +	return XTextWidth(font->xfont, text, len); +} + +unsigned int +textwidth(BlitzFont *font, char *text) +{ +	return blitz_textwidth_l(font, text, strlen(text)); +} + +void +loadfont(Blitz *blitz, BlitzFont *font) +{ +	char *fontname = font->fontstr; +	char **missing = nil, *def = "?"; +	int n; + +	setlocale(LC_ALL, ""); +	if(font->set) +		XFreeFontSet(blitz->dpy, font->set); +	font->set = XCreateFontSet(blitz->dpy, fontname, &missing, &n, &def); +	if(missing) { +		while(n--) +			fprintf(stderr, "liblitz: missing fontset: %s\n", missing[n]); +		XFreeStringList(missing); +		if(font->set) { +			XFreeFontSet(blitz->dpy, font->set); +			font->set = nil; +		} +	} +	if(font->set) { +		XFontSetExtents *font_extents; +		XFontStruct **xfonts; +		char **font_names; +		unsigned int i; + +		font->ascent = font->descent = 0; +		font_extents = XExtentsOfFontSet(font->set); +		n = XFontsOfFontSet(font->set, &xfonts, &font_names); +		for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) { +			if(font->ascent < (*xfonts)->ascent) +				font->ascent = (*xfonts)->ascent; +			if(font->descent < (*xfonts)->descent) +				font->descent = (*xfonts)->descent; +			xfonts++; +		} +	} +	else { +		if(font->xfont) +			XFreeFont(blitz->dpy, font->xfont); +		font->xfont = nil; +		font->xfont = XLoadQueryFont(blitz->dpy, fontname); +		if (!font->xfont) { +			fontname = "fixed"; +			font->xfont = XLoadQueryFont(blitz->dpy, fontname); +		} +		if (!font->xfont) { +			fprintf(stderr, "%s", "liblitz: error, cannot load 'fixed' font\n"); +			exit(1); +		} +		font->ascent = font->xfont->ascent; +		font->descent = font->xfont->descent; +	} +} @@ -64,21 +64,5 @@ returns  if Enter is pressed on termination,  .B 1  if Escape is pressed. -.SH ENVIRONMENT -.TP -GRID_FONT -The X11 font used to display each item in the menu. -.br -Default: fixed -.TP -GRID_NORMCOLORS -The foreground, background, and border colors of a label. Syntactically, three blank-separated color values of the form #RRGGBB are expected. -.br -Default: #222222 #eeeeee #666666 -.TP -GRID_SELCOLORS -Like GRID_NORMCOLORS, but for the selected label. -.br -Default: #ffffff #335577 #447799  .SH SEE ALSO  .BR gridwm (1) @@ -0,0 +1,18 @@ +/* + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +void +error(char *errstr, ...) { +	va_list ap; +	va_start(ap, errstr); +	vfprintf(stderr, errstr, ap); +	va_end(ap); +	exit(1); +} + @@ -0,0 +1,41 @@ +/* + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ + +#include <X11/Xlib.h> +#include <X11/Xlocale.h> + +typedef struct Brush Brush; +typedef struct Color Color; +typedef struct Fnt Fnt; + +struct Color { +	unsigned long bg; +	unsigned long fg; +	unsigned long border; +}; + +struct Fnt { +	XFontStruct *xfont; +	XFontSet set; +	int ascent; +	int descent; +}; + +struct Brush { +	GC gc; +	Drawable drawable; +	XRectangle rect; +	Bool border; +	Fnt *font; +	Color color; +	const char *text; +}; + +extern void draw(Display *dpy, Brush *b); +extern void loadcolor(Display *dpy, int screen, Color *c, +		const char *bg, const char *fg, const char *bo); +extern unsigned int textwidth_l(Fnt *font, char *text, unsigned int len); +extern unsigned int textwidth(Fnt *font, char *text); +extern void loadfont(Display *dpy, Fnt *font, const char *fontstr); @@ -36,15 +36,6 @@ usage()  	exit(1);  } -void -error(char *errstr, ...) { -	va_list ap; -	va_start(ap, errstr); -	vfprintf(stderr, errstr, ap); -	va_end(ap); -	exit(1); -} -  static void  scan_wins()  { @@ -3,7 +3,9 @@   * See LICENSE file for license details.   */ -#include <X11/Xlib.h> +#include "draw.h" +#include "util.h" +  #include <X11/Xutil.h>  /* WM atoms */ @@ -54,4 +56,3 @@ extern Cursor cursor[CurLast];  extern Pixmap pmap;  /* wm.c */ -extern void error(char *errstr, ...); | 
