st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 9fbafe55c996324a73a0be3af80edcd39e5a393b
parent d81250e5f96e96dd430a3fc61b5b47ffc04f98d8
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sun, 16 Sep 2012 13:22:23 +0200

Preliminary solution to the stuttering problem.

Diffstat:
Mst.c | 27++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git 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))