some work on using drw.c done
This commit is contained in:
		@ -1,7 +1,7 @@
 | 
			
		||||
/* See LICENSE file for copyright and license details. */
 | 
			
		||||
 | 
			
		||||
/* The three fields set to 0 have to stay that way for a scalable font */
 | 
			
		||||
static char font[] = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*";
 | 
			
		||||
static char *font = "-*-dejavu sans condensed-bold-r-*-*-0-0-*-*-*-0-*-*";
 | 
			
		||||
#define NUMFONTS 30
 | 
			
		||||
#define FONTSZ(x) ((int)(100.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTS-1] */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										115
									
								
								sent.c
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								sent.c
									
									
									
									
									
								
							@ -22,6 +22,7 @@ char *argv0;
 | 
			
		||||
/* macros */
 | 
			
		||||
#define LEN(a)     (sizeof(a) / sizeof(a)[0])
 | 
			
		||||
#define LIMIT(x, a, b)    (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
 | 
			
		||||
#define MAXFONTSTRLEN 128
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	NONE = 0,
 | 
			
		||||
@ -95,6 +96,7 @@ static XFontStruct *xloadqueryscalablefont(char *name, int size);
 | 
			
		||||
static struct DC *getfontsize(char *str, size_t len, int *width, int *height);
 | 
			
		||||
static void cleanup(struct DC *cur);
 | 
			
		||||
static void eprintf(const char *, ...);
 | 
			
		||||
static void die(const char *, ...);
 | 
			
		||||
static void load(FILE *fp);
 | 
			
		||||
static void advance(const Arg *arg);
 | 
			
		||||
static void quit(const Arg *arg);
 | 
			
		||||
@ -124,7 +126,6 @@ static struct DC dc;
 | 
			
		||||
static Drw *d = NULL;
 | 
			
		||||
static ClrScheme sc;
 | 
			
		||||
static int running = 1;
 | 
			
		||||
static char *opt_font = NULL;
 | 
			
		||||
 | 
			
		||||
static void (*handler[LASTEvent])(XEvent *) = {
 | 
			
		||||
	[ButtonPress] = bpress,
 | 
			
		||||
@ -311,7 +312,7 @@ void pngdraw(struct image *img)
 | 
			
		||||
{
 | 
			
		||||
	int xoffset = (xw.w - img->ximg->width) / 2;
 | 
			
		||||
	int yoffset = (xw.h - img->ximg->height) / 2;
 | 
			
		||||
	XPutImage(xw.dpy, xw.win, dc.gc, img->ximg, 0, 0,
 | 
			
		||||
	XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0,
 | 
			
		||||
			xoffset, yoffset, img->ximg->width, img->ximg->height);
 | 
			
		||||
	XFlush(xw.dpy);
 | 
			
		||||
	img->state |= DRAWN;
 | 
			
		||||
@ -401,8 +402,8 @@ struct DC *getfontsize(char *str, size_t len, int *width, int *height)
 | 
			
		||||
 | 
			
		||||
void cleanup(struct DC *cur)
 | 
			
		||||
{
 | 
			
		||||
	XFreeFont(xw.dpy, cur->font);
 | 
			
		||||
	XFreeGC(xw.dpy, cur->gc);
 | 
			
		||||
//	XFreeFont(xw.dpy, cur->font);
 | 
			
		||||
//	XFreeGC(xw.dpy, cur->gc);
 | 
			
		||||
 | 
			
		||||
	if (cur->next) {
 | 
			
		||||
		cleanup(cur->next);
 | 
			
		||||
@ -427,6 +428,23 @@ void cleanup(struct DC *cur)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void die(const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
 | 
			
		||||
	va_start(ap, fmt);
 | 
			
		||||
	vfprintf(stderr, fmt, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 | 
			
		||||
	if (fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':') {
 | 
			
		||||
		fputc(' ', stderr);
 | 
			
		||||
		perror(NULL);
 | 
			
		||||
	} else {
 | 
			
		||||
		fputc('\n', stderr);
 | 
			
		||||
	}
 | 
			
		||||
	exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eprintf(const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
@ -441,7 +459,6 @@ void eprintf(const char *fmt, ...)
 | 
			
		||||
	} else {
 | 
			
		||||
		fputc('\n', stderr);
 | 
			
		||||
	}
 | 
			
		||||
	exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void load(FILE *fp)
 | 
			
		||||
@ -529,9 +546,9 @@ void usage()
 | 
			
		||||
void xdraw()
 | 
			
		||||
{
 | 
			
		||||
	int line_len = strlen(slides[idx].text);
 | 
			
		||||
	int height;
 | 
			
		||||
	int width;
 | 
			
		||||
	struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
 | 
			
		||||
//	int height;
 | 
			
		||||
//	int width;
 | 
			
		||||
//	struct DC *dc = getfontsize(slides[idx].text, line_len, &width, &height);
 | 
			
		||||
	struct image *im = slides[idx].img;
 | 
			
		||||
 | 
			
		||||
	XClearWindow(xw.dpy, xw.win);
 | 
			
		||||
@ -539,7 +556,7 @@ void xdraw()
 | 
			
		||||
	if (!im) {
 | 
			
		||||
//		XDrawString(xw.dpy, xw.win, dc->gc, (xw.w - width)/2, (xw.h + height)/2,
 | 
			
		||||
//				slides[idx].text, line_len);
 | 
			
		||||
		drw_text(d, (xw.w - width)/2, (xw.h + height)/2, 100, 20, slides[idx].text, line_len);
 | 
			
		||||
		drw_text(d, xw.w/2, xw.h/2, 1000, 200, slides[idx].text, 0);
 | 
			
		||||
		drw_map(d, xw.win, 0, 0, xw.w, xw.h);
 | 
			
		||||
	} else if (!(im->state & LOADED) && !pngread(im))
 | 
			
		||||
		eprintf("could not read image %s", slides[idx].text + 1);
 | 
			
		||||
@ -597,7 +614,7 @@ void xinit()
 | 
			
		||||
	sc.fg = drw_clr_create(d, "#000000");
 | 
			
		||||
	drw_setscheme(d, &sc);
 | 
			
		||||
 | 
			
		||||
	xloadfonts(opt_font ? opt_font : font);
 | 
			
		||||
	xloadfonts(font);
 | 
			
		||||
 | 
			
		||||
	XStringListToTextProperty(&argv0, 1, &prop);
 | 
			
		||||
	XSetWMName(xw.dpy, xw.win, &prop);
 | 
			
		||||
@ -615,41 +632,61 @@ void xloadfonts(char *fontstr)
 | 
			
		||||
	XFontStruct *fnt;
 | 
			
		||||
	XGCValues gcvalues;
 | 
			
		||||
	struct DC *cur = &dc;
 | 
			
		||||
	char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
 | 
			
		||||
//	char **fstr = XListFonts(xw.dpy, fontstr, 42, &count);
 | 
			
		||||
	char *fstrs;
 | 
			
		||||
	const char **fonts;
 | 
			
		||||
 | 
			
		||||
	while (count-- && !xfontisscalable(fstr[count]))
 | 
			
		||||
		; /* nothing, just get first scalable font result */
 | 
			
		||||
	if (!(fstrs = malloc(NUMFONTS * MAXFONTSTRLEN)))
 | 
			
		||||
		die("could not malloc fontstrings");
 | 
			
		||||
	if (!(fonts = malloc(NUMFONTS * sizeof(char*)))) {
 | 
			
		||||
		free(fstrs);
 | 
			
		||||
		die("could not malloc fontarray");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (count < 0)
 | 
			
		||||
		eprintf("sent: could not find a scalable font matching %s", fontstr);
 | 
			
		||||
 | 
			
		||||
	memset(&gcvalues, 0, sizeof(gcvalues));
 | 
			
		||||
 | 
			
		||||
	const char *fonts[] = {
 | 
			
		||||
		"Sans:size=10.5",
 | 
			
		||||
/*	const char *fonts[] = {
 | 
			
		||||
		"Sans:size=80:size=10.5",
 | 
			
		||||
		"VL Gothic:size=10.5",
 | 
			
		||||
		"WenQuanYi Micro Hei:size=10.5",
 | 
			
		||||
	};
 | 
			
		||||
	drw_load_fonts(d, fonts, LEN(fonts));
 | 
			
		||||
	}; */
 | 
			
		||||
//	drw_load_fonts(d, fonts, LEN(fonts));
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		if (!(fnt = xloadqueryscalablefont(fstr[count], FONTSZ(i)))) {
 | 
			
		||||
			i++;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
	for (i = 0; i < NUMFONTS; i++) {
 | 
			
		||||
		snprintf(&fstrs[i*MAXFONTSTRLEN], MAXFONTSTRLEN, "%s:size=%d", fontstr, FONTSZ(i));
 | 
			
		||||
		puts(&fstrs[i*MAXFONTSTRLEN]);
 | 
			
		||||
		fonts[i] = &fstrs[i*MAXFONTSTRLEN];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		cur->gc = XCreateGC(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, &gcvalues);
 | 
			
		||||
		cur->font = fnt;
 | 
			
		||||
		XSetFont(xw.dpy, cur->gc, fnt->fid);
 | 
			
		||||
		XSetForeground(xw.dpy, cur->gc, BlackPixel(xw.dpy, xw.scr));
 | 
			
		||||
		cur->next = (++i < NUMFONTS) ? malloc(sizeof(struct DC)) : NULL;
 | 
			
		||||
		cur = cur->next;
 | 
			
		||||
	} while (cur && i < NUMFONTS);
 | 
			
		||||
	drw_load_fonts(d, fonts, NUMFONTS);
 | 
			
		||||
 | 
			
		||||
	if (cur == &dc)
 | 
			
		||||
		eprintf("sent: could not load fonts.");
 | 
			
		||||
	free(fstrs);
 | 
			
		||||
	free(fonts);
 | 
			
		||||
 | 
			
		||||
	XFreeFontNames(fstr);
 | 
			
		||||
//	while (count-- && !xfontisscalable(fstr[count]))
 | 
			
		||||
//		; /* nothing, just get first scalable font result */
 | 
			
		||||
//
 | 
			
		||||
//	if (count < 0)
 | 
			
		||||
//		eprintf("sent: could not find a scalable font matching %s", fontstr);
 | 
			
		||||
//
 | 
			
		||||
//	memset(&gcvalues, 0, sizeof(gcvalues));
 | 
			
		||||
//
 | 
			
		||||
//	do {
 | 
			
		||||
//		if (!(fnt = xloadqueryscalablefont(fstr[count], FONTSZ(i)))) {
 | 
			
		||||
//			i++;
 | 
			
		||||
//			continue;
 | 
			
		||||
//		}
 | 
			
		||||
//
 | 
			
		||||
//		cur->gc = XCreateGC(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, &gcvalues);
 | 
			
		||||
//		cur->font = fnt;
 | 
			
		||||
//		XSetFont(xw.dpy, cur->gc, fnt->fid);
 | 
			
		||||
//		XSetForeground(xw.dpy, cur->gc, BlackPixel(xw.dpy, xw.scr));
 | 
			
		||||
//		cur->next = (++i < NUMFONTS) ? malloc(sizeof(struct DC)) : NULL;
 | 
			
		||||
//		cur = cur->next;
 | 
			
		||||
//	} while (cur && i < NUMFONTS);
 | 
			
		||||
//
 | 
			
		||||
//	if (cur == &dc)
 | 
			
		||||
//		eprintf("sent: could not load fonts.");
 | 
			
		||||
//
 | 
			
		||||
//	XFreeFontNames(fstr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void bpress(XEvent *e)
 | 
			
		||||
@ -700,7 +737,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
	ARGBEGIN {
 | 
			
		||||
	case 'f':
 | 
			
		||||
		opt_font = EARGF(usage());
 | 
			
		||||
		font = EARGF(usage());
 | 
			
		||||
		break;
 | 
			
		||||
	case 'v':
 | 
			
		||||
	default:
 | 
			
		||||
@ -712,7 +749,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
			load(fp);
 | 
			
		||||
			fclose(fp);
 | 
			
		||||
		} else {
 | 
			
		||||
			eprintf("could not open file %s for reading:", argv[i]);
 | 
			
		||||
			eprintf("could not open %s for reading:", argv[i]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user