~brown121407/dwm

f21d46ea7def76221c4173f644eb2188ae9edbb1 — Anselm R Garbe 8 years ago c0ba635
continued with draw.c abstraction, also started util.{h,c} implementation, that will be used by draw.c as well
6 files changed, 80 insertions(+), 29 deletions(-)

M Makefile
M draw.c
M draw.h
M dwm.c
A util.c
A util.h
M Makefile => Makefile +1 -1
@@ 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

M draw.c => draw.c +50 -10
@@ 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);
}


M draw.h => draw.h +5 -5
@@ 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);

M dwm.c => dwm.c +1 -13
@@ 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;

A util.c => util.c +17 -0
@@ 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);
}


A util.h => util.h +6 -0
@@ 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, ...);