aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
authorgotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2008-02-01 11:35:25 +0000
committergotmor <gotmor@f2baff5b-bf2c-0410-a398-912abdc3d8b2>2008-02-01 11:35:25 +0000
commit9b2e296cb82a5e800e58b3c5eea56f8dd25ae632 (patch)
tree811baaa5045f71669293029530c8a639913b6a5c /main.c
parent5f1b3c5e30343be351bba017acc61ae3af828e25 (diff)
downloaddzen-9b2e296cb82a5e800e58b3c5eea56f8dd25ae632.tar.gz
dzen-9b2e296cb82a5e800e58b3c5eea56f8dd25ae632.zip
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
Diffstat (limited to 'main.c')
-rw-r--r--main.c73
1 files changed, 71 insertions, 2 deletions
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 */