From 9b2e296cb82a5e800e58b3c5eea56f8dd25ae632 Mon Sep 17 00:00:00 2001 From: gotmor Date: Fri, 1 Feb 2008 11:35:25 +0000 Subject: added -fn-preload option to preload fonts at startup ^fn() makes use of the preloaded fonts when refenrencing them as dfnt0, dfnt1, ... git-svn-id: http://dzen.googlecode.com/svn/trunk@213 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- draw.c | 85 ++++++++++++++++++++++++++++++++++++++++-------------------------- dzen.h | 1 + main.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 124 insertions(+), 35 deletions(-) diff --git a/draw.c b/draw.c index 1c67df9..d6d13f1 100644 --- a/draw.c +++ b/draw.c @@ -24,14 +24,14 @@ int get_tokval(const char* line, char **retdata); int get_token(const char* line, int * t, char **tval); static unsigned int -textnw(const char *text, unsigned int len) { +textnw(Fnt *font, const char *text, unsigned int len) { XRectangle r; - if(dzen.font.set) { - XmbTextExtents(dzen.font.set, text, len, NULL, &r); + if(font->set) { + XmbTextExtents(font->set, text, len, NULL, &r); return r.width; } - return XTextWidth(dzen.font.xfont, text, len); + return XTextWidth(font->xfont, text, len); } @@ -102,10 +102,6 @@ setfont(const char *fontstr) { dzen.font.height = dzen.font.ascent + dzen.font.descent; } -unsigned int -textw(const char *text) { - return textnw(text, strlen(text)) + dzen.font.height; -} int get_tokval(const char* line, char **retdata) { @@ -321,6 +317,7 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { /* X stuff */ long lastfg = dzen.norm[ColFG], lastbg = dzen.norm[ColBG]; + Fnt *cur_fnt = NULL; XGCValues gcv; Drawable *pm, bm; Drawable opm=0; @@ -395,6 +392,7 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { gcv.font = dzen.font.xfont->fid; XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); } + cur_fnt = &dzen.font; if( lnr != -1 && (lnr + dzen.slave_win.first_line_vis >= dzen.slave_win.tcnt)) { XCopyArea(dzen.dpy, *pm, dzen.slave_win.drawable[lnr], dzen.gc, @@ -548,15 +546,25 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { break; case fn: if(tval[0]) { - setfont(tval); + if(!strncmp(tval, "dfnt", 4)) { + cur_fnt = &(dzen.fnpl[atoi(tval+4)]); + + if(!cur_fnt->set) { + gcv.font = cur_fnt->xfont->fid; + XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + } + } + else + setfont(tval); } - else - setfont(dzen.fnt ? dzen.fnt : FONT); - if(!dzen.font.set){ - gcv.font = dzen.font.xfont->fid; - XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + else { + cur_fnt = &dzen.font; + if(!cur_fnt->set){ + gcv.font = cur_fnt->xfont->fid; + XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + } } - py = set_posy ? py : (dzen.line_height - dzen.font.height) / 2; + py = set_posy ? py : (dzen.line_height - cur_fnt->height) / 2; font_was_set = 1; break; } @@ -564,10 +572,10 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { } /* check if text is longer than window's width */ - ow = j; tw = textnw(lbuf, strlen(lbuf)); + ow = j; tw = textnw(cur_fnt, lbuf, strlen(lbuf)); while( ((tw + px) > (dzen.w - h)) && j>=0) { lbuf[--j] = '\0'; - tw = textnw(lbuf, strlen(lbuf)); + tw = textnw(cur_fnt, lbuf, strlen(lbuf)); } if(j < ow) { if(j > 1) @@ -581,9 +589,9 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { if(!nobg) setcolor(pm, px, tw, lastfg, lastbg, reverse, nobg); - if(dzen.font.set) - XmbDrawString(dzen.dpy, *pm, dzen.font.set, - dzen.tgc, px, py+dzen.font.ascent, lbuf, strlen(lbuf)); + if(cur_fnt->set) + XmbDrawString(dzen.dpy, *pm, cur_fnt->set, + dzen.tgc, px, py + cur_fnt->ascent, lbuf, strlen(lbuf)); else XDrawString(dzen.dpy, *pm, dzen.tgc, px, py+dzen.font.ascent, lbuf, strlen(lbuf)); px += tw; @@ -737,15 +745,26 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { break; case fn: - if(tval[0]) - setfont(tval); - else - setfont(dzen.fnt ? dzen.fnt : FONT); - if(!dzen.font.set){ - gcv.font = dzen.font.xfont->fid; - XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + if(tval[0]) { + if(!strncmp(tval, "dfnt", 4)) { + cur_fnt = &(dzen.fnpl[atoi(tval+4)]); + + if(!cur_fnt->set) { + gcv.font = cur_fnt->xfont->fid; + XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + } + } + else + setfont(tval); + } + else { + cur_fnt = &dzen.font; + if(!cur_fnt->set){ + gcv.font = cur_fnt->xfont->fid; + XChangeGC(dzen.dpy, dzen.tgc, GCFont, &gcv); + } } - py = set_posy ? py : (dzen.line_height - dzen.font.height) / 2; + py = set_posy ? py : (dzen.line_height - cur_fnt->height) / 2; font_was_set = 1; break; } @@ -753,10 +772,10 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { } /* check if text is longer than window's width */ - ow = j; tw = textnw(lbuf, strlen(lbuf)); + ow = j; tw = textnw(cur_fnt, lbuf, strlen(lbuf)); while( ((tw + px) > (dzen.w - h)) && j>=0) { lbuf[--j] = '\0'; - tw = textnw(lbuf, strlen(lbuf)); + tw = textnw(cur_fnt, lbuf, strlen(lbuf)); } if(j < ow) { if(j > 1) @@ -770,9 +789,9 @@ parse_line(const char *line, int lnr, int align, int reverse, int nodraw) { if(!nobg) setcolor(pm, px, tw, lastfg, lastbg, reverse, nobg); - if(dzen.font.set) - XmbDrawString(dzen.dpy, *pm, dzen.font.set, - dzen.tgc, px, py+dzen.font.ascent, lbuf, strlen(lbuf)); + if(cur_fnt->set) + XmbDrawString(dzen.dpy, *pm, cur_fnt->set, + dzen.tgc, px, py + cur_fnt->ascent, lbuf, strlen(lbuf)); else XDrawString(dzen.dpy, *pm, dzen.tgc, px, py+dzen.font.ascent, lbuf, strlen(lbuf)); px += tw; diff --git a/dzen.h b/dzen.h index ac69ec6..ba4107e 100644 --- a/dzen.h +++ b/dzen.h @@ -112,6 +112,7 @@ struct DZEN { Visual *visual; GC gc, rgc, tgc; Fnt font; + Fnt fnpl[64]; Bool ispersistent; Bool tsupdate; diff --git a/main.c b/main.c index a6ed882..9043ffe 100644 --- a/main.c +++ b/main.c @@ -680,6 +680,64 @@ event_loop(void) { return; } +static void +x_preload(const char *fontstr, int p) { + char *def, **missing; + int i, n; + + missing = NULL; + + dzen.fnpl[p].set = XCreateFontSet(dzen.dpy, fontstr, &missing, &n, &def); + if(missing) + XFreeStringList(missing); + + if(dzen.fnpl[p].set) { + XFontSetExtents *font_extents; + XFontStruct **xfonts; + char **font_names; + dzen.fnpl[p].ascent = dzen.fnpl[p].descent = 0; + font_extents = XExtentsOfFontSet(dzen.fnpl[p].set); + n = XFontsOfFontSet(dzen.fnpl[p].set, &xfonts, &font_names); + for(i = 0, dzen.fnpl[p].ascent = 0, dzen.fnpl[p].descent = 0; i < n; i++) { + if(dzen.fnpl[p].ascent < (*xfonts)->ascent) + dzen.fnpl[p].ascent = (*xfonts)->ascent; + if(dzen.fnpl[p].descent < (*xfonts)->descent) + dzen.fnpl[p].descent = (*xfonts)->descent; + xfonts++; + } + } + else { + if(dzen.fnpl[p].xfont) + XFreeFont(dzen.dpy, dzen.fnpl[p].xfont); + dzen.fnpl[p].xfont = NULL; + if(!(dzen.fnpl[p].xfont = XLoadQueryFont(dzen.dpy, fontstr))) + eprint("dzen: error, cannot load font: '%s'\n", fontstr); + dzen.fnpl[p].ascent = dzen.fnpl[p].xfont->ascent; + dzen.fnpl[p].descent = dzen.fnpl[p].xfont->descent; + } + dzen.fnpl[p].height = dzen.fnpl[p].ascent + dzen.fnpl[p].descent; +} + +static void +font_preload(char *s) { + int i, j, k=0; + char buf[512]; + + for(i=0, j=0; i<512; i++, j++) { + if(s[i] != ',' && s[i]) + buf[j] = s[i]; + else { + i++; + buf[j] = 0; + if(k<64) + x_preload(buf, k++); + j=0; + if(!s[i]) + break; + } + } +} + static void set_alignment(void) { @@ -725,9 +783,9 @@ init_input_buffer(void) { int main(int argc, char *argv[]) { - int i; + int i, preload=0; char *action_string = NULL; - char *endptr; + char *endptr, *fnpre; /* default values */ dzen.cur_line = 0; @@ -841,6 +899,14 @@ main(int argc, char *argv[]) { else if(!strncmp(argv[i], "-tw", 4)) { if(++i < argc) dzen.title_win.width = atoi(argv[i]); } + else if(!strncmp(argv[i], "-fn-preload", 12)) { + if(++i < argc) { + preload=1; + + fnpre=malloc(strlen(argv[i])); + strncpy(fnpre, argv[i], strlen(argv[i])); + } + } #ifdef DZEN_XINERAMA else if(!strncmp(argv[i], "-xs", 4)) { if(++i < argc) dzen.xinescreen = atoi(argv[i]); @@ -926,6 +992,9 @@ main(int argc, char *argv[]) { XMapWindow(dzen.dpy, dzen.slave_win.line[i]); } + if(preload) + font_preload(fnpre); + do_action(onstart); /* main loop */ -- cgit v1.2.3-54-g00ecf