Reformat usage and separate version from it
[st.git] / st.c
diff --git a/st.c b/st.c
index 65a1866..2bbf484 100644 (file)
--- a/st.c
+++ b/st.c
@@ -415,7 +415,7 @@ static int32_t tdefcolor(int *, int *, int);
 static void tdeftran(char);
 static inline int match(uint, uint);
 static void ttynew(void);
-static void ttyread(void);
+static size_t ttyread(void);
 static void ttyresize(void);
 static void ttysend(char *, size_t);
 static void ttywrite(const char *, size_t);
@@ -486,6 +486,7 @@ static void *xrealloc(void *, size_t);
 static char *xstrdup(char *);
 
 static void usage(void);
+static void version(void);
 
 static void (*handler[LASTEvent])(XEvent *) = {
        [KeyPress] = kpress,
@@ -1440,6 +1441,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");
@@ -1464,7 +1467,7 @@ ttynew(void)
        }
 }
 
-void
+size_t
 ttyread(void)
 {
        static char buf[BUFSIZ];
@@ -1489,14 +1492,16 @@ ttyread(void)
 
        /* keep any uncomplete utf8 char for the next call */
        memmove(buf, ptr, buflen);
+
+       return ret;
 }
 
 void
 ttywrite(const char *s, size_t n)
 {
-       fd_set wfd;
-       struct timespec tv;
+       fd_set wfd, rfd;
        ssize_t r;
+       size_t lim = 256;
 
        /*
         * Remember that we are using a pty, which might be a modem line.
@@ -1506,38 +1511,32 @@ ttywrite(const char *s, size_t n)
         */
        while (n > 0) {
                FD_ZERO(&wfd);
+               FD_ZERO(&rfd);
                FD_SET(cmdfd, &wfd);
-               tv.tv_sec = 0;
-               tv.tv_nsec = 0;
+               FD_SET(cmdfd, &rfd);
 
                /* Check if we can write. */
-               if (pselect(cmdfd+1, NULL, &wfd, NULL, &tv, NULL) < 0) {
+               if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) {
                        if (errno == EINTR)
                                continue;
                        die("select failed: %s\n", strerror(errno));
                }
-               if(!FD_ISSET(cmdfd, &wfd)) {
-                       /* No, then free some buffer space. */
-                       ttyread();
-               } else {
+               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.
                         */
-                       r = write(cmdfd, s, (n < 256)? n : 256);
-                       if (r < 0) {
-                               die("write error on tty: %s\n",
-                                               strerror(errno));
-                       }
+                       if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0)
+                               goto write_error;
                        if (r < n) {
                                /*
                                 * We weren't able to write out everything.
                                 * This means the buffer is getting full
                                 * again. Empty it.
                                 */
-                               if (n < 256)
-                                       ttyread();
+                               if (n < lim)
+                                       lim = ttyread();
                                n -= r;
                                s += r;
                        } else {
@@ -1545,7 +1544,13 @@ ttywrite(const char *s, size_t n)
                                break;
                        }
                }
+               if (FD_ISSET(cmdfd, &rfd))
+                       lim = ttyread();
        }
+       return;
+
+write_error:
+       die("write error on tty: %s\n", strerror(errno));
 }
 
 void
@@ -3235,7 +3240,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;
 
@@ -3467,7 +3472,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;
@@ -4327,14 +4332,19 @@ run(void)
 void
 usage(void)
 {
-       die("%s " VERSION " (c) 2010-2015 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"
-       "       st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]\n"
-       "          [-i] [-t title] [-T title] [-w windowid] -l line"
-       " [stty_args ...]\n",
-       argv0);
+       die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]"
+       " [-o file] [-T title]\n"
+       "          [-t title] [-w windowid] [[-e] command [args ...]]\n"
+       "       %s [-aiv] [-c class] [-f font] [-g geometry]"
+       " [-o file] [-T title]\n"
+       "          [-t title] [-w windowid] -l line [stty_args ...]\n",
+       argv0, argv0);
+}
+
+void
+version(void)
+{
+       die("%s " VERSION " (c) 2010-2016 st engineers\n", argv0);
 }
 
 int
@@ -4381,6 +4391,8 @@ main(int argc, char *argv[])
                opt_embed = EARGF(usage());
                break;
        case 'v':
+               version();
+               break;
        default:
                usage();
        } ARGEND;