--- st-efd04ccad6d3c4e981b3efdb0423d8f5ca40f984/st.c
+++ st-efd04ccad6d3c4e981b3efdb0423d8f5ca40f984-1/st.c
@@ -62,6 +62,8 @@
 #define XK_ANY_MOD    UINT_MAX
 #define XK_NO_MOD     0
 
+#define REFRESH_TIMEOUT 200 /* ms */
+#define REFRESH_TIMEOUT_ON_XEV 30 /* ms */
 #define REDRAW_TIMEOUT (80*1000) /* 80 ms */
 
 /* macros */
@@ -3158,48 +3160,49 @@
 run(void) {
 	XEvent ev;
 	fd_set rfd;
-	int xfd = XConnectionNumber(xw.dpy), i;
-	struct timeval drawtimeout, *tv = NULL;
+	int xfd = XConnectionNumber(xw.dpy), xev = 5;
+	struct timeval drawtimeout, *tv = NULL, now, last;
+	gettimeofday(&last, NULL);
 
-	for(i = 0;; i++) {
+	while(1) {
 		FD_ZERO(&rfd);
 		FD_SET(cmdfd, &rfd);
 		FD_SET(xfd, &rfd);
+
 		if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, tv) < 0) {
 			if(errno == EINTR)
 				continue;
 			die("select failed: %s\n", SERRNO);
 		}
 
-		/*
-		 * Stop after a certain number of reads so the user does not
-		 * feel like the system is stuttering.
-		 */
-		if(i < 1000 && FD_ISSET(cmdfd, &rfd)) {
+		drawtimeout.tv_sec = 0;
+		drawtimeout.tv_usec = REFRESH_TIMEOUT_ON_XEV*1000;
+		tv = &drawtimeout;
+
+		if(FD_ISSET(cmdfd, &rfd))
 			ttyread();
 
-			/*
-			 * 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;
-			tv = &drawtimeout;
-			continue;
-		}
-		i = 0;
-		tv = NULL;
+		if(FD_ISSET(xfd, &rfd))
+			xev = 5;
 
-		while(XPending(xw.dpy)) {
-			XNextEvent(xw.dpy, &ev);
-			if(XFilterEvent(&ev, None))
-				continue;
-			if(handler[ev.type])
-				(handler[ev.type])(&ev);
-		}
+		gettimeofday(&now, NULL);
 
-		draw();
-		XFlush(xw.dpy);
+		if(TIMEDIFF(now, last) > (xev ? REFRESH_TIMEOUT_ON_XEV : REFRESH_TIMEOUT)) {
+			while(XPending(xw.dpy)) {
+				XNextEvent(xw.dpy, &ev);
+				if(XFilterEvent(&ev, None))
+					continue;
+				if(handler[ev.type])
+					(handler[ev.type])(&ev);
+			}
+			draw();
+			XFlush(xw.dpy);
+			last = now;
+			if(xev && !FD_ISSET(xfd, &rfd))
+				xev--;
+			if(!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd))
+				tv = NULL;
+		}
 	}
 }
 
