--- 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; + } } }