#define USAGE \
"st " VERSION " (c) 2010-2012 st engineers\n" \
- "usage: st [-t title] [-c class] [-g geometry]" \
- " [-w windowid] [-v] [-f file] [-e command...]\n"
+ "usage: st [-v] [-c class] [-f font] [-g geometry] [-o file]" \
+ " [-t title] [-w windowid] [-e command ...]\n"
/* XEMBED messages */
#define XEMBED_FOCUS_IN 4
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,
static pid_t pid;
static Selection sel;
static int iofd = -1;
-static char **opt_cmd = NULL;
-static char *opt_io = NULL;
+static char **opt_cmd = NULL;
+static char *opt_io = NULL;
static char *opt_title = NULL;
static char *opt_embed = NULL;
static char *opt_class = NULL;
+static char *opt_font = NULL;
void *
xmalloc(size_t len) {
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;
}
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
xw.vis = XDefaultVisual(xw.dpy, xw.scr);
/* font */
- initfonts(FONT, BOLDFONT, ITALICFONT, ITALICBOLDFONT);
+ initfonts((opt_font != NULL)? opt_font : FONT);
/* XXX: Assuming same size for bold font */
xw.cw = dc.font.rbearing - dc.font.lbearing;
for(i = 1; i < argc; i++) {
switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) {
- case 't':
- if(++i < argc) opt_title = argv[i];
- break;
case 'c':
- if(++i < argc) opt_class = argv[i];
- break;
- case 'w':
- if(++i < argc) opt_embed = argv[i];
- break;
- case 'f':
- if(++i < argc) opt_io = argv[i];
+ if(++i < argc)
+ opt_class = argv[i];
break;
case 'e':
/* eat every remaining arguments */
- if(++i < argc) opt_cmd = &argv[i];
+ if(++i < argc)
+ opt_cmd = &argv[i];
goto run;
+ case 'f':
+ if(++i < argc)
+ opt_font = argv[i];
+ break;
case 'g':
if(++i >= argc)
break;
if(xw.fh != 0 && xw.fw != 0)
xw.isfixed = True;
break;
+ case 'o':
+ if(++i < argc)
+ opt_io = argv[i];
+ break;
+ case 't':
+ if(++i < argc)
+ opt_title = argv[i];
+ break;
case 'v':
default:
die(USAGE);
+ case 'w':
+ if(++i < argc)
+ opt_embed = argv[i];
+ break;
}
}