X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/97695baf4f9bc3632792a3330fb46e188ef166a2..b6af0fdc20cd79861fbf770c71484ec04405e744:/st.c diff --git a/st.c b/st.c index 5633e40..ed5481d 100644 --- a/st.c +++ b/st.c @@ -28,6 +28,10 @@ #include #endif +#define USAGE \ + "st-" VERSION ", (c) 2010 st engineers\n" \ + "usage: st [-t title] [-e cmd] [-v]\n" + /* Arbitrary sizes */ #define ESC_TITLE_SIZ 256 #define ESC_BUF_SIZ 256 @@ -210,6 +214,8 @@ static CSIEscape escseq; static int cmdfd; static pid_t pid; static Selection sel; +static char *opt_cmd = NULL; +static char *opt_title = NULL; void selinit(void) { @@ -329,9 +335,12 @@ die(const char *errstr, ...) { void execsh(void) { - char *args[3] = {getenv("SHELL"), "-i", NULL}; - DEFAULT(args[0], SHELL); /* if getenv() failed */ - putenv("TERM=" TNAME); + char *args[] = {getenv("SHELL"), "-i", NULL}; + if(opt_cmd) + args[0] = opt_cmd, args[1] = NULL; + else + DEFAULT(args[0], SHELL); + putenv("TERM="TNAME); execvp(args[0], args); } @@ -1051,12 +1060,25 @@ tresize(int col, int row) { int i; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); + int slide = term.c.y - row + 1; if(col < 1 || row < 1) return; - /* free uneeded rows */ - for(i = row; i < term.row; i++) { + /* free unneeded rows */ + i = 0; + if(slide > 0) { + /* slide screen to keep cursor where we expect it - + * tscrollup would work here, but we can optimize to + * memmove because we're freeing the earlier lines */ + for(/* i = 0 */; i < slide; i++) { + free(term.line[i]); + free(term.alt[i]); + } + memmove(term.line, term.line + slide, row * sizeof(Line)); + memmove(term.alt, term.alt + slide, row * sizeof(Line)); + } + for(i += row; i < term.row; i++) { free(term.line[i]); free(term.alt[i]); } @@ -1189,7 +1211,7 @@ xinit(void) { XMapWindow(xw.dis, xw.win); xhints(); - XStoreName(xw.dis, xw.win, "st"); + XStoreName(xw.dis, xw.win, opt_title ? opt_title : "st"); XSync(xw.dis, 0); } @@ -1429,10 +1451,21 @@ run(void) { int main(int argc, char *argv[]) { - if(argc == 2 && !strncmp("-v", argv[1], 3)) - die("st-" VERSION ", (c) 2010 st engineers\n"); - else if(argc != 1) - die("usage: st [-v]\n"); + int i; + + 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 'e': + if(++i < argc) opt_cmd = argv[i]; + break; + case 'v': + default: + die(USAGE); + } + } setlocale(LC_CTYPE, ""); tnew(80, 24); ttynew();