|  |  | @ -8,7 +8,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #include <X11/Xlocale.h> | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #include "wm.h" | 
			
		
	
		
			
				
					|  |  |  | #include "dwm.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | static void | 
			
		
	
		
			
				
					|  |  |  | drawborder(void) | 
			
		
	
	
		
			
				
					|  |  | @ -59,7 +59,7 @@ draw(Bool border, const char *text) | 
			
		
	
		
			
				
					|  |  |  | x = dc.x + (h / 2); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | /* shorten text if necessary */ | 
			
		
	
		
			
				
					|  |  |  | while(len && (w = textnw(&dc.font, buf, len)) > dc.w - h) | 
			
		
	
		
			
				
					|  |  |  | while(len && (w = textnw(buf, len)) > dc.w - h) | 
			
		
	
		
			
				
					|  |  |  | buf[--len] = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if(w > dc.w) | 
			
		
	
	
		
			
				
					|  |  | @ -79,93 +79,80 @@ draw(Bool border, const char *text) | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | static unsigned long | 
			
		
	
		
			
				
					|  |  |  | xinitcolors(Colormap cmap, const char *colstr) | 
			
		
	
		
			
				
					|  |  |  | unsigned long | 
			
		
	
		
			
				
					|  |  |  | initcolor(const char *colstr) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | XColor color; | 
			
		
	
		
			
				
					|  |  |  | Colormap cmap = DefaultColormap(dpy, screen); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | XAllocNamedColor(dpy, cmap, colstr, &color, &color); | 
			
		
	
		
			
				
					|  |  |  | return color.pixel; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void | 
			
		
	
		
			
				
					|  |  |  | initcolors(const char *bg, const char *fg, const char *border) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | Colormap cmap = DefaultColormap(dpy, screen); | 
			
		
	
		
			
				
					|  |  |  | dc.bg = xinitcolors(cmap, bg); | 
			
		
	
		
			
				
					|  |  |  | dc.fg = xinitcolors(cmap, fg); | 
			
		
	
		
			
				
					|  |  |  | dc.border = xinitcolors(cmap, border); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | unsigned int | 
			
		
	
		
			
				
					|  |  |  | textnw(Fnt *font, char *text, unsigned int len) | 
			
		
	
		
			
				
					|  |  |  | textnw(char *text, unsigned int len) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | XRectangle r; | 
			
		
	
		
			
				
					|  |  |  | if(font->set) { | 
			
		
	
		
			
				
					|  |  |  | XmbTextExtents(font->set, text, len, NULL, &r); | 
			
		
	
		
			
				
					|  |  |  | if(dc.font.set) { | 
			
		
	
		
			
				
					|  |  |  | XmbTextExtents(dc.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)); | 
			
		
	
		
			
				
					|  |  |  | return XTextWidth(dc.font.xfont, text, len); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | unsigned int | 
			
		
	
		
			
				
					|  |  |  | texth(Fnt *font) | 
			
		
	
		
			
				
					|  |  |  | textw(char *text) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | return font->height + 4; | 
			
		
	
		
			
				
					|  |  |  | return textnw(text, strlen(text)); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void | 
			
		
	
		
			
				
					|  |  |  | initfont(Fnt *font, const char *fontstr) | 
			
		
	
		
			
				
					|  |  |  | initfont(const char *fontstr) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | char **missing, *def; | 
			
		
	
		
			
				
					|  |  |  | int i, n; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | missing = NULL; | 
			
		
	
		
			
				
					|  |  |  | 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; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | 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) | 
			
		
	
		
			
				
					|  |  |  | 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) | 
			
		
	
		
			
				
					|  |  |  | error("error, cannot init 'fixed' font\n"); | 
			
		
	
		
			
				
					|  |  |  | font->ascent = font->xfont->ascent; | 
			
		
	
		
			
				
					|  |  |  | font->descent = font->xfont->descent; | 
			
		
	
		
			
				
					|  |  |  | 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; | 
			
		
	
		
			
				
					|  |  |  | } |