st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 9cae1eb0ded2e1ca604753893e2307531ef73afc
parent ed5b8700a6e6c14b814dcc2e54a90eb1868070b5
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sun, 30 Sep 2012 20:10:58 +0200

Remove the cruft of the user to have to define the different font styles.

Diffstat:
Mst.c | 60+++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 5 deletions(-)
diff --git a/st.c b/st.c
@@ -336,6 +336,7 @@ static int isfullutf8(char *, int);
 static void *xmalloc(size_t);
 static void *xrealloc(void *, size_t);
 static void *xcalloc(size_t nmemb, size_t size);
+static char *smstrcat(char *, ...);
 
 static void (*handler[LASTEvent])(XEvent *) = {
     [KeyPress] = kpress,
@@ -393,6 +394,44 @@ xcalloc(size_t nmemb, size_t size) {
     return p;
 }
 
+char *
+smstrcat(char *src, ...)
+{
+    va_list fmtargs;
+    char *ret, *p, *v;
+    int len, slen, flen;
+
+    len = slen = strlen(src);
+
+    va_start(fmtargs, src);
+    for(;;) {
+        v = va_arg(fmtargs, char *);
+        if(v == NULL)
+            break;
+        len += strlen(v);
+    }
+    va_end(fmtargs);
+
+    p = ret = xmalloc(len+1);
+    memmove(p, src, slen);
+    p += slen;
+
+    va_start(fmtargs, src);
+    for(;;) {
+        v = va_arg(fmtargs, char *);
+        if(v == NULL)
+            break;
+        flen = strlen(v);
+        memmove(p, v, flen);
+        p += flen;
+    }
+    va_end(fmtargs);
+
+    ret[len] = '\0';
+
+    return ret;
+}
+
 int
 utf8decode(char *s, long *u) {
     uchar c;
@@ -2017,11 +2056,22 @@ xinitfont(Font *f, char *fontstr) {
 }
 
 void
-initfonts(char *fontstr, char *bfontstr, char *ifontstr, char *ibfontstr) {
+initfonts(char *fontstr) {
+    char *fstr;
+
     xinitfont(&dc.font, fontstr);
-    xinitfont(&dc.bfont, bfontstr);
-    xinitfont(&dc.ifont, ifontstr);
-    xinitfont(&dc.ibfont, ibfontstr);
+
+    fstr = smstrcat(fontstr, ":weight=bold", NULL);
+    xinitfont(&dc.bfont, fstr);
+    free(fstr);
+
+    fstr = smstrcat(fontstr, ":slant=italic,oblique", NULL);
+    xinitfont(&dc.ifont, fstr);
+    free(fstr);
+
+    fstr = smstrcat(fontstr, ":weight=bold:slant=italic,oblique", NULL);
+    xinitfont(&dc.ibfont, fstr);
+    free(fstr);
 }
 
 void
@@ -2037,7 +2087,7 @@ xinit(void) {
     xw.vis = XDefaultVisual(xw.dpy, xw.scr);
 
     /* font */
-    initfonts(FONT, BOLDFONT, ITALICFONT, ITALICBOLDFONT);
+    initfonts(FONT);
 
     /* XXX: Assuming same size for bold font */
     xw.cw = dc.font.rbearing - dc.font.lbearing;