backported drawtext() simplifications to dmenu
							parent
							
								
									c43c692a4d
								
							
						
					
					
						commit
						cf7e4c15a9
					
				|  | @ -1,5 +1,5 @@ | |||
| # dmenu version
 | ||||
| VERSION = 3.8 | ||||
| VERSION = 3.9 | ||||
| 
 | ||||
| # Customize below to fit your system
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										31
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										31
									
								
								dmenu.c
								
								
								
								
							|  | @ -17,6 +17,7 @@ | |||
| /* macros */ | ||||
| #define CLEANMASK(mask)         (mask & ~(numlockmask | LockMask)) | ||||
| #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH)) | ||||
| #define MIN(a, b)               ((a) < (b) ? (a) : (b)) | ||||
| 
 | ||||
| /* enums */ | ||||
| enum { ColFG, ColBG, ColLast }; | ||||
|  | @ -212,37 +213,25 @@ drawmenu(void) { | |||
| 
 | ||||
| void | ||||
| drawtext(const char *text, unsigned long col[ColLast]) { | ||||
| 	int x, y, w, h; | ||||
| 	static char buf[256]; | ||||
| 	unsigned int len, olen; | ||||
| 	int i, x, y, h, len, olen; | ||||
| 	char buf[256]; | ||||
| 	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; | ||||
| 
 | ||||
| 	XSetForeground(dpy, dc.gc, col[ColBG]); | ||||
| 	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | ||||
| 	if(!text) | ||||
| 		return; | ||||
| 	w = 0; | ||||
| 	olen = len = strlen(text); | ||||
| 	if(len >= sizeof buf) | ||||
| 		len = sizeof buf - 1; | ||||
| 	memcpy(buf, text, len); | ||||
| 	buf[len] = 0; | ||||
| 	olen = strlen(text); | ||||
| 	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(buf, len)) > dc.w - h) | ||||
| 		buf[--len] = 0; | ||||
| 	if(len < olen) { | ||||
| 		if(len > 1) | ||||
| 			buf[len - 1] = '.'; | ||||
| 		if(len > 2) | ||||
| 			buf[len - 2] = '.'; | ||||
| 		if(len > 3) | ||||
| 			buf[len - 3] = '.'; | ||||
| 	} | ||||
| 	if(w > dc.w) | ||||
| 		return; /* too long */ | ||||
| 	for(len = MIN(olen, sizeof buf); len && (i = textnw(buf, 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(dpy, dc.gc, col[ColFG]); | ||||
| 	if(dc.font.set) | ||||
| 		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue