X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=fe2b9221fe4011e11cddf7a0f3977a7ecc01c2ad;hb=fe2ba95b3d81127b98a5dc6fa0341a90beabd1a0;hp=8741145a5a6d42cb63799c8c661c91b2ab2e989d;hpb=b9d5fec4f277b688b3bb4741134abf152e801e90;p=st.git diff --git a/st.c b/st.c index 8741145..fe2b922 100644 --- a/st.c +++ b/st.c @@ -296,6 +296,7 @@ static void xcopy(void); static void xdrawcursor(void); static void xinit(void); static void xloadcols(void); +static void xresettitle(void); static void xseturgency(int); static void xsetsel(char*); static void xresize(int, int); @@ -355,7 +356,7 @@ static STREscape strescseq; static int cmdfd; static pid_t pid; static Selection sel; -static FILE *fileio; +static int iofd = -1; static char **opt_cmd = NULL; static char *opt_io = NULL; static char *opt_title = NULL; @@ -821,9 +822,9 @@ ttynew(void) { signal(SIGCHLD, sigchld); if(opt_io) { if(!strcmp(opt_io, "-")) { - fileio = stdout; + iofd = STDOUT_FILENO; } else { - if(!(fileio = fopen(opt_io, "w"))) { + if((iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0) { fprintf(stderr, "Error opening %s:%s\n", opt_io, strerror(errno)); } @@ -1171,6 +1172,7 @@ tsetattr(int *attr, int l) { case 7: term.c.attr.mode |= ATTR_REVERSE; break; + case 21: case 22: term.c.attr.mode &= ~ATTR_BOLD; break; @@ -1599,10 +1601,8 @@ void tputc(char *c) { char ascii = *c; - if(fileio) { - putc(ascii, fileio); - fflush(fileio); - } + if(iofd != -1) + write(iofd, c, 1); if(term.esc & ESC_START) { if(term.esc & ESC_CSI) { @@ -1685,6 +1685,7 @@ tputc(char *c) { case 'c': /* RIS -- Reset to inital state */ treset(); term.esc = 0; + xresettitle(); break; case '=': /* DECPAM -- Application keypad */ term.mode |= MODE_APPKEYPAD; @@ -2027,7 +2028,7 @@ xinit(void) { xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); - XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st"); + xresettitle(); XMapWindow(xw.dpy, xw.win); xhints(); XSync(xw.dpy, 0); @@ -2123,6 +2124,11 @@ xdrawcursor(void) { xcopy(); } +void +xresettitle(void) { + XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st"); +} + void redraw(void) { struct timespec tv = {0, REDRAW_TIMEOUT * 1000};