Preliminary solution to the stuttering problem.
This commit is contained in:
		
							
								
								
									
										27
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								st.c
									
									
									
									
									
								
							@ -48,7 +48,7 @@
 | 
				
			|||||||
#define ESC_ARG_SIZ   16
 | 
					#define ESC_ARG_SIZ   16
 | 
				
			||||||
#define STR_BUF_SIZ   256
 | 
					#define STR_BUF_SIZ   256
 | 
				
			||||||
#define STR_ARG_SIZ   16
 | 
					#define STR_ARG_SIZ   16
 | 
				
			||||||
#define DRAW_BUF_SIZ  1024
 | 
					#define DRAW_BUF_SIZ  20*1024
 | 
				
			||||||
#define UTF_SIZ       4
 | 
					#define UTF_SIZ       4
 | 
				
			||||||
#define XK_NO_MOD     UINT_MAX
 | 
					#define XK_NO_MOD     UINT_MAX
 | 
				
			||||||
#define XK_ANY_MOD    0
 | 
					#define XK_ANY_MOD    0
 | 
				
			||||||
@ -2329,7 +2329,8 @@ void
 | 
				
			|||||||
run(void) {
 | 
					run(void) {
 | 
				
			||||||
	XEvent ev;
 | 
						XEvent ev;
 | 
				
			||||||
	fd_set rfd;
 | 
						fd_set rfd;
 | 
				
			||||||
	int xfd = XConnectionNumber(xw.dpy);
 | 
						int xfd = XConnectionNumber(xw.dpy), i;
 | 
				
			||||||
 | 
						struct timeval drawtimeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(;;) {
 | 
						for(;;) {
 | 
				
			||||||
		FD_ZERO(&rfd);
 | 
							FD_ZERO(&rfd);
 | 
				
			||||||
@ -2340,9 +2341,29 @@ run(void) {
 | 
				
			|||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			die("select failed: %s\n", SERRNO);
 | 
								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();
 | 
								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)) {
 | 
							while(XPending(xw.dpy)) {
 | 
				
			||||||
			XNextEvent(xw.dpy, &ev);
 | 
								XNextEvent(xw.dpy, &ev);
 | 
				
			||||||
			if(XFilterEvent(&ev, xw.win))
 | 
								if(XFilterEvent(&ev, xw.win))
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user