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
	 Christoph Lohmann
					Christoph Lohmann