| 
						
						
						
					 | 
				
				 | 
				
					@ -1,8 +1,10 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* See LICENSE file for copyright and license details. */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdio.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdlib.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <X11/Xlib.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "draw.h" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "util.h" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Draw * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					draw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -36,32 +38,70 @@ draw_free(Draw *draw) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Fnt * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					font_create(const char *fontname) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Fnt *font = (Fnt *)calloc(1, sizeof(Fnt)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* TODO: allocate actual font */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					draw_font_create(Draw *draw, const char *fontname) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Fnt *font; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						char *def, **missing; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int n; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!draw) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						font = (Fnt *)calloc(1, sizeof(Fnt)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						font->set = XCreateFontSet(draw->dpy, fontname, &missing, &n, &def); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(missing) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							while(n--) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								fprintf(stderr, "draw: missing fontset: %s\n", missing[n]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreeStringList(missing); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(font->set) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFontStruct **xfonts; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							char **font_names; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XExtentsOfFontSet(font->set); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							n = XFontsOfFontSet(font->set, &xfonts, &font_names); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							while(n--) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								font->ascent = MAX(font->ascent, (*xfonts)->ascent); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								font->descent = MAX(font->descent,(*xfonts)->descent); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								xfonts++; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(!(font->xfont = XLoadQueryFont(draw->dpy, fontname)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							&& !(font->xfont = XLoadQueryFont(draw->dpy, "fixed"))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								die("error, cannot load font: '%s'\n", fontname); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							font->ascent = font->xfont->ascent; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							font->descent = font->xfont->descent; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						font->h = font->ascent + font->descent; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return font; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					font_free(Fnt *font) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!font) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					draw_font_free(Draw *draw, Fnt *font) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!draw || !font) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* TODO: deallocate any font resources */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(font->set) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreeFontSet(draw->dpy, font->set); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFreeFont(draw->dpy, font->xfont); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						free(font); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Col * | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					col_create(const char *colname) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					draw_col_create(Draw *draw, const char *colname) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Col *col = (Col *)calloc(1, sizeof(Col)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* TODO: allocate color */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Colormap cmap = DefaultColormap(draw->dpy, draw->screen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XColor color; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!XAllocNamedColor(draw->dpy, cmap, colname, &color, &color)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							die("error, cannot allocate color '%s'\n", colname); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						col->rgb = color.pixel; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return col; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					col_free(Col *col) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					draw_col_free(Draw *draw, Col *col) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!col) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* TODO: deallocate any color resource */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						free(col); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |