tcontinued with draw.c and draw.h implementation, now the integration begins - … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit aafeaf731701e528f4ae9d7c7432b3e92fee4392 | |
parent f21d46ea7def76221c4173f644eb2188ae9edbb1 | |
Author: Anselm R Garbe <[email protected]> | |
Date: Sun, 9 Dec 2012 19:11:11 +0100 | |
continued with draw.c and draw.h implementation, now the integration begins | |
Diffstat: | |
M draw.c | 75 +++++++++++++++++++++++++----… | |
M draw.h | 25 ++++++++++--------------- | |
2 files changed, 71 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/draw.c b/draw.c | |
t@@ -1,6 +1,7 @@ | |
/* See LICENSE file for copyright and license details. */ | |
#include <stdio.h> | |
#include <stdlib.h> | |
+#include <string.h> | |
#include <X11/Xlib.h> | |
#include "draw.h" | |
t@@ -55,7 +56,6 @@ draw_font_create(Draw *draw, const char *fontname) { | |
if(font->set) { | |
XFontStruct **xfonts; | |
char **font_names; | |
- | |
XExtentsOfFontSet(font->set); | |
n = XFontsOfFontSet(font->set, &xfonts, &font_names); | |
while(n--) { | |
t@@ -107,49 +107,96 @@ draw_col_free(Draw *draw, Col *col) { | |
void | |
draw_setfont(Draw *draw, Fnt *font) { | |
- if(!draw || !font) | |
+ if(!draw) | |
return; | |
draw->font = font; | |
} | |
void | |
draw_setfg(Draw *draw, Col *col) { | |
- if(!draw || !col) | |
+ if(!draw) | |
return; | |
draw->fg = col; | |
} | |
void | |
draw_setbg(Draw *draw, Col *col) { | |
- if(!draw || !col) | |
+ if(!draw) | |
return; | |
draw->bg = col; | |
} | |
void | |
-draw_rect(Draw *draw, int x, int y, unsigned int w, unsigned int h) { | |
- if(!draw) | |
+draw_rect(Draw *draw, int x, int y, unsigned int w, unsigned int h, Bool fille… | |
+ int dx; | |
+ | |
+ if(!draw || !draw->font || !draw->fg || !draw->bg) | |
return; | |
- /* TODO: draw the rectangle */ | |
+ XSetForeground(draw->dpy, draw->gc, invert ? draw->bg->rgb : draw->fg-… | |
+ dx = (draw->font->ascent + draw->font->descent + 2) / 4; | |
+ if(filled) | |
+ XFillRectangle(draw->dpy, draw->drawable, draw->gc, x+1, y+1, … | |
+ else if(empty) | |
+ XDrawRectangle(draw->dpy, draw->drawable, draw->gc, x+1, y+1, … | |
} | |
void | |
-draw_text(Draw *draw, int x, int y, const char *text) { | |
- if(!draw) | |
+draw_text(Draw *draw, int x, int y, unsigned int w, unsigned int h, const char… | |
+ char buf[256]; | |
+ int i, tx, ty, len, olen; | |
+ TextExtents tex; | |
+ | |
+ if(!draw || !draw->fg || !draw->bg) | |
return; | |
- /* TODO: draw the text */ | |
+ XSetForeground(draw->dpy, draw->gc, invert ? draw->fg->rgb : draw->bg-… | |
+ XFillRectangle(draw->dpy, draw->drawable, draw->gc, x, y, w, h); | |
+ if(!text || !draw->font) | |
+ return; | |
+ olen = strlen(text); | |
+ draw_getextents(draw, text, olen, &tex); | |
+ ty = y + (h / 2) - tex.yOff; | |
+ tx = x + tex.xOff; | |
+ /* shorten text if necessary */ | |
+ for(len = MIN(olen, sizeof buf); len && tex.w > w - tex.h; len--) | |
+ draw_getextents(draw, text, len, &tex); | |
+ if(!len) | |
+ return; | |
+ memcpy(buf, text, len); | |
+ if(len < olen) | |
+ for(i = len; i && i > len - 3; buf[--i] = '.'); | |
+ XSetForeground(draw->dpy, draw->gc, invert ? draw->bg->rgb : draw->fg-… | |
+ if(draw->font->set) | |
+ XmbDrawString(draw->dpy, draw->drawable, draw->font->set, draw… | |
+ else | |
+ XDrawString(draw->dpy, draw->drawable, draw->gc, tx, ty, buf, … | |
} | |
void | |
draw_map(Draw *draw, int x, int y, unsigned int w, unsigned int h) { | |
if(!draw) | |
return; | |
- /* TODO: map the draw contents in the region */ | |
+ XCopyArea(draw->dpy, draw->drawable, draw->win, draw->gc, x, y, w, h, … | |
+ XSync(draw->dpy, False); | |
} | |
+ | |
void | |
-draw_getextents(Draw *draw, const char *text, TextExtents *extents) { | |
- if(!draw || !extents) | |
+draw_getextents(Draw *draw, const char *text, unsigned int len, TextExtents *e… | |
+ XRectangle r; | |
+ | |
+ if(!draw || !draw->font || !text) | |
return; | |
- /* TODO: get extents */ | |
+ if(draw->font->set) { | |
+ XmbTextExtents(draw->font->set, text, len, NULL, &r); | |
+ extents->xOff = r.x; | |
+ extents->yOff = r.y; | |
+ extents->w = r.width; | |
+ extents->h = r.height; | |
+ } | |
+ else { | |
+ extents->h = draw->font->ascent + draw->font->descent; | |
+ extents->w = XTextWidth(draw->font->xfont, text, len); | |
+ extents->xOff = extents->h / 2; | |
+ extents->yOff = (extents->h / 2) + draw->font->ascent; | |
+ } | |
} | |
diff --git a/draw.h b/draw.h | |
t@@ -13,19 +13,7 @@ struct _XFont { | |
XFontStruct *xfont; | |
}; | |
typedef struct _XFont Fnt; | |
-/* X11 types - end */ | |
-typedef struct { | |
- unsigned int w; | |
- unsigned int h; | |
- int x; | |
- int y; | |
- int xOff; | |
- int yOff; | |
-} TextExtents; | |
- | |
- | |
-/* X11 types - begin */ | |
typedef struct _XDraw Draw; | |
struct _XDraw { | |
unsigned int w, h; | |
t@@ -39,6 +27,13 @@ struct _XDraw { | |
Fnt *font; | |
}; | |
+typedef struct { | |
+ unsigned int w; | |
+ unsigned int h; | |
+ int xOff; | |
+ int yOff; | |
+} TextExtents; | |
+ | |
/* Drawable abstraction */ | |
Draw *draw_create(Display *dpy, int screen, Window win, unsigned int w, unsign… | |
void draw_resize(Draw *draw, unsigned int w, unsigned int h); | |
t@@ -58,12 +53,12 @@ void draw_setfg(Draw *draw, Col *col); | |
void draw_setbg(Draw *draw, Col *col); | |
/* Drawing functions */ | |
-void draw_rect(Draw *draw, int x, int y, unsigned int w, unsigned int h); | |
-void draw_text(Draw *draw, int x, int y, const char *text); | |
+void draw_rect(Draw *draw, int x, int y, unsigned int w, unsigned int h, Bool … | |
+void draw_text(Draw *draw, int x, int y, unsigned int w, unsigned int h, const… | |
/* Map functions */ | |
void draw_map(Draw *draw, int x, int y, unsigned int w, unsigned int h); | |
/* Text functions */ | |
-void draw_getextents(Draw *draw, const char *text, TextExtents *extents); | |
+void draw_getextents(Draw *draw, const char *text, unsigned int len, TextExten… | |