| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -336,6 +336,7 @@ static int isfullutf8(char *, int); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void *xmalloc(size_t); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void *xrealloc(void *, size_t); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void *xcalloc(size_t nmemb, size_t size); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static char *smstrcat(char *, ...); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void (*handler[LASTEvent])(XEvent *) = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[KeyPress] = kpress, | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -393,6 +394,44 @@ xcalloc(size_t nmemb, size_t size) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return p; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					char * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					smstrcat(char *src, ...) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_list fmtargs; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						char *ret, *p, *v; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int len, slen, flen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						len = slen = strlen(src); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_start(fmtargs, src); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(;;) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							v = va_arg(fmtargs, char *); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(v == NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							len += strlen(v); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_end(fmtargs); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						p = ret = xmalloc(len+1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						memmove(p, src, slen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						p += slen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_start(fmtargs, src); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(;;) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							v = va_arg(fmtargs, char *); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(v == NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							flen = strlen(v); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							memmove(p, v, flen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							p += flen; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						va_end(fmtargs); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						ret[len] = '\0'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return ret; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					utf8decode(char *s, long *u) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						uchar c; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -2017,11 +2056,22 @@ xinitfont(Font *f, char *fontstr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					initfonts(char *fontstr, char *bfontstr, char *ifontstr, char *ibfontstr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					initfonts(char *fontstr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						char *fstr; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.font, fontstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.bfont, bfontstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.ifont, ifontstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.ibfont, ibfontstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						fstr = smstrcat(fontstr, ":weight=bold", NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.bfont, fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						free(fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						fstr = smstrcat(fontstr, ":slant=italic,oblique", NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.ifont, fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						free(fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						fstr = smstrcat(fontstr, ":weight=bold:slant=italic,oblique", NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xinitfont(&dc.ibfont, fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						free(fstr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2037,7 +2087,7 @@ xinit(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.vis = XDefaultVisual(xw.dpy, xw.scr); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* font */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						initfonts(FONT, BOLDFONT, ITALICFONT, ITALICBOLDFONT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						initfonts(FONT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* XXX: Assuming same size for bold font */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.cw = dc.font.rbearing - dc.font.lbearing; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |