continued with draw.c and draw.h implementation, now the integration begins
							parent
							
								
									f21d46ea7d
								
							
						
					
					
						commit
						aafeaf7317
					
				
							
								
								
									
										75
									
								
								draw.c
								
								
								
								
							
							
						
						
									
										75
									
								
								draw.c
								
								
								
								
							|  | @ -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" | ||||
|  | @ -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--) { | ||||
|  | @ -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 filled, Bool empty, Bool invert) { | ||||
| 	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->rgb); | ||||
| 	dx = (draw->font->ascent + draw->font->descent + 2) / 4; | ||||
| 	if(filled) | ||||
| 		XFillRectangle(draw->dpy, draw->drawable, draw->gc, x+1, y+1, dx+1, dx+1); | ||||
| 	else if(empty) | ||||
| 		XDrawRectangle(draw->dpy, draw->drawable, draw->gc, x+1, y+1, dx, dx); | ||||
| } | ||||
| 
 | ||||
| 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 *text, Bool invert) { | ||||
| 	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->rgb); | ||||
| 	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->rgb); | ||||
| 	if(draw->font->set) | ||||
| 		XmbDrawString(draw->dpy, draw->drawable, draw->font->set, draw->gc, tx, ty, buf, len); | ||||
| 	else | ||||
| 		XDrawString(draw->dpy, draw->drawable, draw->gc, tx, ty, buf, len); | ||||
| } | ||||
| 
 | ||||
| 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, x, y); | ||||
| 	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 *extents) { | ||||
| 	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; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
							
								
								
									
										25
									
								
								draw.h
								
								
								
								
							
							
						
						
									
										25
									
								
								draw.h
								
								
								
								
							|  | @ -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; | ||||
|  | @ -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, unsigned int h); | ||||
| void draw_resize(Draw *draw, unsigned int w, unsigned int h); | ||||
|  | @ -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 filled, Bool empty, Bool invert); | ||||
| void draw_text(Draw *draw, int x, int y, unsigned int w, unsigned int h, const char *text, Bool invert); | ||||
| 
 | ||||
| /* 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, TextExtents *extents); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue