continued with draw.c abstraction, also started util.{h,c} implementation, that will be used by draw.c as well
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| include config.mk | ||||
|  | ||||
| SRC = draw.c dwm.c | ||||
| SRC = util.c draw.c dwm.c | ||||
| OBJ = ${SRC:.c=.o} | ||||
|  | ||||
| all: options dwm | ||||
|   | ||||
							
								
								
									
										60
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								draw.c
									
									
									
									
									
								
							| @@ -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); | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								draw.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								draw.h
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ typedef struct _XCol Col; | ||||
| struct _XFont { | ||||
| 	int ascent; | ||||
| 	int descent; | ||||
| 	unsigned int h, w; | ||||
| 	unsigned int h; | ||||
| 	XFontSet set; | ||||
| 	XFontStruct *xfont; | ||||
| }; | ||||
| @@ -45,12 +45,12 @@ void draw_resize(Draw *draw, unsigned int w, unsigned int h); | ||||
| void draw_free(Draw *draw); | ||||
|  | ||||
| /* Fnt abstraction */ | ||||
| Fnt *font_create(const char *fontname); | ||||
| void font_free(Fnt *font); | ||||
| Fnt *draw_font_create(Draw *draw, const char *fontname); | ||||
| void draw_font_free(Draw *draw, Fnt *font); | ||||
|  | ||||
| /* Colour abstraction */ | ||||
| Col *col_create(const char *colname); | ||||
| void col_free(Col *col); | ||||
| Col *draw_col_create(Draw *draw, const char *colname); | ||||
| void draw_col_free(Draw *draw, Col *col); | ||||
|  | ||||
| /* Drawing context manipulation */ | ||||
| void draw_setfont(Draw *draw, Fnt *font); | ||||
|   | ||||
							
								
								
									
										14
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								dwm.c
									
									
									
									
									
								
							| @@ -41,6 +41,7 @@ | ||||
| #endif /* XINERAMA */ | ||||
|  | ||||
| #include "draw.h" | ||||
| #include "util.h" | ||||
|  | ||||
| /* macros */ | ||||
| #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask) | ||||
| @@ -49,8 +50,6 @@ | ||||
|                                * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) | ||||
| #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags])) | ||||
| #define LENGTH(X)               (sizeof X / sizeof X[0]) | ||||
| #define MAX(A, B)               ((A) > (B) ? (A) : (B)) | ||||
| #define MIN(A, B)               ((A) < (B) ? (A) : (B)) | ||||
| #define MOUSEMASK               (BUTTONMASK|PointerMotionMask) | ||||
| #define WIDTH(X)                ((X)->w + 2 * (X)->bw) | ||||
| #define HEIGHT(X)               ((X)->h + 2 * (X)->bw) | ||||
| @@ -176,7 +175,6 @@ static Monitor *createmon(void); | ||||
| static void destroynotify(XEvent *e); | ||||
| static void detach(Client *c); | ||||
| static void detachstack(Client *c); | ||||
| static void die(const char *errstr, ...); | ||||
| static Monitor *dirtomon(int dir); | ||||
| static void drawbar(Monitor *m); | ||||
| static void drawbars(void); | ||||
| @@ -695,16 +693,6 @@ detachstack(Client *c) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| die(const char *errstr, ...) { | ||||
| 	va_list ap; | ||||
|  | ||||
| 	va_start(ap, errstr); | ||||
| 	vfprintf(stderr, errstr, ap); | ||||
| 	va_end(ap); | ||||
| 	exit(EXIT_FAILURE); | ||||
| } | ||||
|  | ||||
| Monitor * | ||||
| dirtomon(int dir) { | ||||
| 	Monitor *m = NULL; | ||||
|   | ||||
							
								
								
									
										17
									
								
								util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								util.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /* See LICENSE file for copyright and license details. */ | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "util.h" | ||||
|  | ||||
| void | ||||
| die(const char *errstr, ...) { | ||||
| 	va_list ap; | ||||
|  | ||||
| 	va_start(ap, errstr); | ||||
| 	vfprintf(stderr, errstr, ap); | ||||
| 	va_end(ap); | ||||
| 	exit(EXIT_FAILURE); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user