From: Christoph Lohmann <20h@r-36.net>
Date: Sun, 16 Sep 2012 11:22:23 +0000 (+0200)
Subject: Preliminary solution to the stuttering problem.
X-Git-Url: https://git.xinqibao.xyz/st.git/commitdiff_plain/9fbafe55c996324a73a0be3af80edcd39e5a393b?ds=inline;hp=d81250e5f96e96dd430a3fc61b5b47ffc04f98d8

Preliminary solution to the stuttering problem.
---

diff --git a/st.c b/st.c
index 12d6665..da6f17e 100644
--- 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))