tcontinued with draw.c abstraction, also started util.{h,c} implementation, tha… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit f21d46ea7def76221c4173f644eb2188ae9edbb1 | |
parent c0ba635c50dc53f06e4fc96392415b3d19b25826 | |
Author: Anselm R Garbe <[email protected]> | |
Date: Sat, 8 Dec 2012 10:13:01 +0100 | |
continued with draw.c abstraction, also started util.{h,c} implementation, that… | |
Diffstat: | |
M Makefile | 2 +- | |
M draw.c | 60 ++++++++++++++++++++++++++---… | |
M draw.h | 10 +++++----- | |
M dwm.c | 14 +------------- | |
A util.c | 17 +++++++++++++++++ | |
A util.h | 6 ++++++ | |
6 files changed, 80 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -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 | |
diff --git a/draw.c b/draw.c | |
t@@ -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… | |
t@@ -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… | |
+ 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); | |
} | |
diff --git a/draw.h b/draw.h | |
t@@ -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; | |
}; | |
t@@ -45,12 +45,12 @@ void draw_resize(Draw *draw, unsigned int w, unsigned int … | |
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); | |
diff --git a/dwm.c b/dwm.c | |
t@@ -41,6 +41,7 @@ | |
#endif /* XINERAMA */ | |
#include "draw.h" | |
+#include "util.h" | |
/* macros */ | |
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) | |
t@@ -49,8 +50,6 @@ | |
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y)… | |
#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) | |
t@@ -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); | |
t@@ -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; | |
diff --git a/util.c b/util.c | |
t@@ -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); | |
+} | |
+ | |
diff --git a/util.h b/util.h | |
t@@ -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, ...); |