backported drawtext() simplifications to dmenu cf7e4c15
Anselm R Garbe · 2008-08-18 10:03 2 file(s) · +11 −22
config.mk +1 −1
1 1
# dmenu version
2 -
VERSION = 3.8
2 +
VERSION = 3.9
3 3
4 4
# Customize below to fit your system
5 5
dmenu.c +10 −21
17 17
/* macros */
18 18
#define CLEANMASK(mask)         (mask & ~(numlockmask | LockMask))
19 19
#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
20 +
#define MIN(a, b)               ((a) < (b) ? (a) : (b))
20 21
21 22
/* enums */
22 23
enum { ColFG, ColBG, ColLast };
212 213
213 214
void
214 215
drawtext(const char *text, unsigned long col[ColLast]) {
215 -
	int x, y, w, h;
216 -
	static char buf[256];
217 -
	unsigned int len, olen;
216 +
	int i, x, y, h, len, olen;
217 +
	char buf[256];
218 218
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
219 219
220 220
	XSetForeground(dpy, dc.gc, col[ColBG]);
221 221
	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
222 222
	if(!text)
223 223
		return;
224 -
	w = 0;
225 -
	olen = len = strlen(text);
226 -
	if(len >= sizeof buf)
227 -
		len = sizeof buf - 1;
228 -
	memcpy(buf, text, len);
229 -
	buf[len] = 0;
224 +
	olen = strlen(text);
230 225
	h = dc.font.ascent + dc.font.descent;
231 226
	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
232 227
	x = dc.x + (h / 2);
233 228
	/* shorten text if necessary */
234 -
	while(len && (w = textnw(buf, len)) > dc.w - h)
235 -
		buf[--len] = 0;
236 -
	if(len < olen) {
237 -
		if(len > 1)
238 -
			buf[len - 1] = '.';
239 -
		if(len > 2)
240 -
			buf[len - 2] = '.';
241 -
		if(len > 3)
242 -
			buf[len - 3] = '.';
243 -
	}
244 -
	if(w > dc.w)
245 -
		return; /* too long */
229 +
	for(len = MIN(olen, sizeof buf); len && (i = textnw(buf, len)) > dc.w - h; len--);
230 +
	if(!len)
231 +
		return;
232 +
	memcpy(buf, text, len);
233 +
	if(len < olen)
234 +
		for(i = len; i && i > len - 3; buf[--i] = '.');
246 235
	XSetForeground(dpy, dc.gc, col[ColFG]);
247 236
	if(dc.font.set)
248 237
		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);