#define USAGE \
"st " VERSION " (c) 2010-2012 st engineers\n" \
- "usage: st [-t title] [-c class] [-w windowid] [-v] [-e command...]\n"
+ "usage: st [-t title] [-c class] [-w windowid] [-v] [-f file] [-e command...]\n"
/* XEMBED messages */
#define XEMBED_FOCUS_IN 4
#define SELECT_TIMEOUT (20*1000) /* 20 ms */
#define DRAW_TIMEOUT (20*1000) /* 20 ms */
+#define REDRAW_TIMEOUT (80*1000) /* 80 ms */
#define SERRNO strerror(errno)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
static void die(const char*, ...);
static void draw(void);
+static void redraw(void);
static void drawregion(int, int, int, int);
static void execsh(void);
static void sigchld(int);
static int cmdfd;
static pid_t pid;
static Selection sel;
+static FILE *fileio;
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;
close(s);
cmdfd = m;
signal(SIGCHLD, sigchld);
+ if (opt_io && !(fileio = fopen(opt_io, "w"))) {
+ fprintf(stderr, "Error opening %s:%s",
+ opt_io, strerror(errno));
+ }
}
}
mode = term.mode;
MODBIT(term.mode,set, MODE_REVERSE);
if (mode != term.mode)
- draw();
+ redraw();
break;
case 7:
MODBIT(term.mode, set, MODE_WRAP);
void
tputc(char *c) {
char ascii = *c;
+
+ if (fileio)
+ putc(ascii, fileio);
if(term.esc & ESC_START) {
if(term.esc & ESC_CSI) {
csiescseq.buf[csiescseq.len++] = ascii;
xcopy(term.c.x, term.c.y, 1, 1);
}
+void
+redraw(void) {
+ struct timespec tv = {0, REDRAW_TIMEOUT * 1000};
+ tfulldirt();
+ draw();
+ nanosleep(&tv, NULL);
+}
+
void
draw() {
drawregion(0, 0, term.col, term.row);
case 'w':
if(++i < argc) opt_embed = argv[i];
break;
+ case 'f':
+ if (++i < argc) opt_io = argv[i];
+ break;
case 'e':
/* eat every remaining arguments */
if(++i < argc) opt_cmd = &argv[i];