diff options
| author | arg@10ksloc.org <unknown> | 2006-08-04 10:23:36 +0200 | 
|---|---|---|
| committer | arg@10ksloc.org <unknown> | 2006-08-04 10:23:36 +0200 | 
| commit | 5077207088b08e6b21601cb19925d20e9d5af573 (patch) | |
| tree | 053bd64a2dc6a33526dbb249d18697fedd74a1ab /draw.c | |
| parent | 7817523a685f0dbba2e074a448099558a54b1b9c (diff) | |
| download | dmenu-5077207088b08e6b21601cb19925d20e9d5af573.tar.gz dmenu-5077207088b08e6b21601cb19925d20e9d5af573.tar.bz2 dmenu-5077207088b08e6b21601cb19925d20e9d5af573.zip  | |
rearranged several stuff
Diffstat (limited to 'draw.c')
| -rw-r--r-- | draw.c | 184 | 
1 files changed, 87 insertions, 97 deletions
@@ -2,45 +2,62 @@   * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>   * See LICENSE file for license details.   */ - +#include "dmenu.h"  #include <stdio.h>  #include <string.h> +#include <X11/Xlocale.h> -#include "dmenu.h" +/* static */  static void -drawborder(Display *dpy, Brush *b) +drawborder(void)  {  	XPoint points[5]; -	XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter); -	XSetForeground(dpy, b->gc, b->border); -	points[0].x = b->x; -	points[0].y = b->y; -	points[1].x = b->w - 1; + +	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); +	XSetForeground(dpy, dc.gc, dc.border); +	points[0].x = dc.x; +	points[0].y = dc.y; +	points[1].x = dc.w - 1;  	points[1].y = 0;  	points[2].x = 0; -	points[2].y = b->h - 1; -	points[3].x = -(b->w - 1); +	points[2].y = dc.h - 1; +	points[3].x = -(dc.w - 1);  	points[3].y = 0;  	points[4].x = 0; -	points[4].y = -(b->h - 1); -	XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious); +	points[4].y = -(dc.h - 1); +	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); +} + +static unsigned int +textnw(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);  } +/* extern */ +  void -draw(Display *dpy, Brush *b, Bool border, const char *text) +drawtext(const char *text, Bool invert, Bool border)  { -	unsigned int x, y, w, h, len; +	int x, y, w, h;  	static char buf[256]; +	unsigned int len;  	XGCValues gcv; -	XRectangle r = { b->x, b->y, b->w, b->h }; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; -	XSetForeground(dpy, b->gc, b->bg); -	XFillRectangles(dpy, b->drawable, b->gc, &r, 1); +	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); +	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	w = 0;  	if(border) -		drawborder(dpy, b); +		drawborder();  	if(!text)  		return; @@ -51,121 +68,94 @@ draw(Display *dpy, Brush *b, Bool border, const char *text)  	memcpy(buf, text, len);  	buf[len] = 0; -	h = b->font.ascent + b->font.descent; -	y = b->y + (b->h / 2) - (h / 2) + b->font.ascent; -	x = b->x + (h / 2); +	h = dc.font.ascent + dc.font.descent; +	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; +	x = dc.x + (h / 2);  	/* shorten text if necessary */ -	while(len && (w = textnw(&b->font, buf, len)) > b->w - h) +	while(len && (w = textnw(buf, len)) > dc.w - h)  		buf[--len] = 0; -	if(w > b->w) +	if(w > dc.w)  		return; /* too long */ -	gcv.foreground = b->fg; -	gcv.background = b->bg; -	if(b->font.set) { -		XChangeGC(dpy, b->gc, GCForeground | GCBackground, &gcv); -		XmbDrawImageString(dpy, b->drawable, b->font.set, b->gc, +	gcv.foreground = invert ? dc.bg : dc.fg; +	gcv.background = invert ? dc.fg : dc.bg; +	if(dc.font.set) { +		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); +		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.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); +		gcv.font = dc.font.xfont->fid; +		XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); +		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);  	}  } -static unsigned long -xloadcolors(Display *dpy, Colormap cmap, const char *colstr) +unsigned long +getcolor(const char *colstr)  { +	Colormap cmap = DefaultColormap(dpy, screen);  	XColor color; +  	XAllocNamedColor(dpy, cmap, colstr, &color, &color);  	return color.pixel;  }  void -loadcolors(Display *dpy, int screen, Brush *b, -		const char *bg, const char *fg, const char *border) -{ -	Colormap cmap = DefaultColormap(dpy, screen); -	b->bg = xloadcolors(dpy, cmap, bg); -	b->fg = xloadcolors(dpy, cmap, fg); -	b->border = xloadcolors(dpy, cmap, border); -} - -unsigned int -textnw(Fnt *font, char *text, unsigned int len) -{ -	XRectangle r; -	if(font->set) { -		XmbTextExtents(font->set, text, len, NULL, &r); -		return r.width; -	} -	return XTextWidth(font->xfont, text, len); -} - -unsigned int -textw(Fnt *font, char *text) -{ -	return textnw(font, text, strlen(text)); -} - -unsigned int -texth(Fnt *font) -{ -	return font->height + 4; -} - -void -loadfont(Display *dpy, Fnt *font, const char *fontstr) +setfont(const char *fontstr)  {  	char **missing, *def; -	int n; +	int i, n;  	missing = NULL; -	def = "?";  	setlocale(LC_ALL, ""); -	if(font->set) -		XFreeFontSet(dpy, font->set); -	font->set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); +	if(dc.font.set) +		XFreeFontSet(dpy, dc.font.set); +	dc.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 = NULL; +		if(dc.font.set) { +			XFreeFontSet(dpy, dc.font.set); +			dc.font.set = NULL;  		}  	} -	if(font->set) { +	if(dc.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; + +		dc.font.ascent = dc.font.descent = 0; +		font_extents = XExtentsOfFontSet(dc.font.set); +		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); +		for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { +			if(dc.font.ascent < (*xfonts)->ascent) +				dc.font.ascent = (*xfonts)->ascent; +			if(dc.font.descent < (*xfonts)->descent) +				dc.font.descent = (*xfonts)->descent;  			xfonts++;  		}  	}  	else { -		if(font->xfont) -			XFreeFont(dpy, font->xfont); -		font->xfont = NULL; -		font->xfont = XLoadQueryFont(dpy, fontstr); -		if (!font->xfont) -			font->xfont = XLoadQueryFont(dpy, "fixed"); -		if (!font->xfont) -			eprint("error, cannot load 'fixed' font\n"); -		font->ascent = font->xfont->ascent; -		font->descent = font->xfont->descent; +		if(dc.font.xfont) +			XFreeFont(dpy, dc.font.xfont); +		dc.font.xfont = NULL; +		dc.font.xfont = XLoadQueryFont(dpy, fontstr); +		if (!dc.font.xfont) +			dc.font.xfont = XLoadQueryFont(dpy, "fixed"); +		if (!dc.font.xfont) +			eprint("error, cannot init 'fixed' font\n"); +		dc.font.ascent = dc.font.xfont->ascent; +		dc.font.descent = dc.font.xfont->descent;  	} -	font->height = font->ascent + font->descent; +	dc.font.height = dc.font.ascent + dc.font.descent; +} + +unsigned int +textw(const char *text) +{ +	return textnw(text, strlen(text)) + dc.font.height;  }  | 
