JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Preliminary solution to the stuttering problem.
authorChristoph Lohmann <20h@r-36.net>
Sun, 16 Sep 2012 11:22:23 +0000 (13:22 +0200)
committerChristoph Lohmann <20h@r-36.net>
Sun, 16 Sep 2012 11:22:23 +0000 (13:22 +0200)
st.c

diff --git a/st.c b/st.c
index 12d6665..da6f17e 100644 (file)
--- a/st.c
+++ b/st.c
@@ -48,7 +48,7 @@
 #define ESC_ARG_SIZ   16
 #define STR_BUF_SIZ   256
 #define STR_ARG_SIZ   16
-#define DRAW_BUF_SIZ  1024
+#define DRAW_BUF_SIZ  20*1024
 #define UTF_SIZ       4
 #define XK_NO_MOD     UINT_MAX
 #define XK_ANY_MOD    0
@@ -2329,7 +2329,8 @@ void
 run(void) {
        XEvent ev;
        fd_set rfd;
-       int xfd = XConnectionNumber(xw.dpy);
+       int xfd = XConnectionNumber(xw.dpy), i;
+       struct timeval drawtimeout;
 
        for(;;) {
                FD_ZERO(&rfd);
@@ -2340,9 +2341,29 @@ run(void) {
                                continue;
                        die("select failed: %s\n", SERRNO);
                }
-               if(FD_ISSET(cmdfd, &rfd))
+
+               /*
+                * Stop after a certain number of reads so the user does not
+                * feel like the system is stuttering.
+                */
+               for(i = 0; i < 1000 && FD_ISSET(cmdfd, &rfd); i++) {
                        ttyread();
 
+                       FD_ZERO(&rfd);
+                       FD_SET(cmdfd, &rfd);
+                       /*
+                        * Just wait a bit so it isn't disturbing the
+                        * user and the system is able to write something.
+                        */
+                       drawtimeout.tv_sec = 0;
+                       drawtimeout.tv_usec = 5;
+                       if(select(cmdfd+1, &rfd, NULL, NULL, &drawtimeout) < 0) {
+                               if(errno == EINTR)
+                                       continue;
+                               die("select failed: %s\n", SERRNO);
+                       }
+               }
+
                while(XPending(xw.dpy)) {
                        XNextEvent(xw.dpy, &ev);
                        if(XFilterEvent(&ev, xw.win))