Enforce a terminal size to reduce race conditions in too efficient apps.
[st.git] / st.c
diff --git a/st.c b/st.c
index 900534b..3a0a519 100644 (file)
--- a/st.c
+++ b/st.c
@@ -1440,6 +1440,8 @@ ttynew(void)
        if (openpty(&m, &s, NULL, NULL, &w) < 0)
                die("openpty failed: %s\n", strerror(errno));
 
+       ttyresize();
+
        switch (pid = fork()) {
        case -1:
                die("fork failed\n");
@@ -1518,15 +1520,13 @@ ttywrite(const char *s, size_t n)
                                continue;
                        die("select failed: %s\n", strerror(errno));
                }
-               if (FD_ISSET(cmdfd, &rfd))
-                       lim = ttyread();
                if (FD_ISSET(cmdfd, &wfd)) {
                        /*
-                        * Only write 256 bytes at maximum. This seems to be a
-                        * reasonable value for a serial line. Bigger values
-                        * might clog the I/O.
+                        * Only write the bytes written by ttywrite() or the
+                        * default of 256. This seems to be a reasonable value
+                        * for a serial line. Bigger values might clog the I/O.
                         */
-                       if ((r = write(cmdfd, s, (n < 256)? n : 256)) < 0)
+                       if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0)
                                goto write_error;
                        if (r < n) {
                                /*
@@ -1543,6 +1543,8 @@ ttywrite(const char *s, size_t n)
                                break;
                        }
                }
+               if (FD_ISSET(cmdfd, &rfd))
+                       lim = ttyread();
        }
        return;
 
@@ -3237,7 +3239,7 @@ xclear(int x1, int y1, int x2, int y2)
 void
 xhints(void)
 {
-       XClassHint class = {opt_class ? opt_class : termname, termname};
+       XClassHint class = {termname, opt_class ? opt_class : termname};
        XWMHints wm = {.flags = InputHint, .input = 1};
        XSizeHints *sizeh = NULL;
 
@@ -3469,7 +3471,7 @@ xinit(void)
        if (xw.gm & XNegative)
                xw.l += DisplayWidth(xw.dpy, xw.scr) - xw.w - 2;
        if (xw.gm & YNegative)
-               xw.t += DisplayWidth(xw.dpy, xw.scr) - xw.h - 2;
+               xw.t += DisplayHeight(xw.dpy, xw.scr) - xw.h - 2;
 
        /* Events */
        xw.attrs.background_pixel = dc.col[defaultbg].pixel;
@@ -4329,7 +4331,7 @@ run(void)
 void
 usage(void)
 {
-       die("%s " VERSION " (c) 2010-2015 st engineers\n"
+       die("%s " VERSION " (c) 2010-2016 st engineers\n"
        "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]\n"
        "          [-i] [-t title] [-T title] [-w windowid] [-e command ...]"
        " [command ...]\n"