diff options
| author | Anselm R Garbe <anselm@garbe.us> | 2012-12-08 10:13:01 +0100 | 
|---|---|---|
| committer | Anselm R Garbe <anselm@garbe.us> | 2012-12-08 10:13:01 +0100 | 
| commit | f21d46ea7def76221c4173f644eb2188ae9edbb1 (patch) | |
| tree | e5b7ad6e3f9c5385544422cbaff7c30453611055 | |
| parent | c0ba635c50dc53f06e4fc96392415b3d19b25826 (diff) | |
continued with draw.c abstraction, also started util.{h,c} implementation, that will be used by draw.c as well
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | draw.c | 60 | ||||
| -rw-r--r-- | draw.h | 10 | ||||
| -rw-r--r-- | dwm.c | 14 | ||||
| -rw-r--r-- | util.c | 17 | ||||
| -rw-r--r-- | util.h | 6 | 
6 files changed, 80 insertions, 29 deletions
| @@ -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 @@ -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);  } @@ -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); @@ -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; @@ -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); +} + @@ -0,0 +1,6 @@ +/* See LICENSE file for copyright and license details. */ + +#define MAX(A, B)               ((A) > (B) ? (A) : (B)) +#define MIN(A, B)               ((A) < (B) ? (A) : (B)) + +void die(const char *errstr, ...); | 
