X-Git-Url: https://jasonwoof.com/gitweb/?p=st.git;a=blobdiff_plain;f=st.c;h=f4b419eb1a6f70a8d11def687a197e12ae7d48eb;hp=820600185fadd6deb3c13cda099dde3bed5e6d14;hb=95033753be32e93915ddce14ea41b8765b665771;hpb=b7261c84aa3af984d5a7e5f5239c4173255a215d diff --git a/st.c b/st.c index 8206001..f4b419e 100644 --- a/st.c +++ b/st.c @@ -3166,10 +3166,12 @@ void run(void) { XEvent ev; fd_set rfd; - int xfd = XConnectionNumber(xw.dpy), i; - struct timeval drawtimeout, *tv = NULL; + int xfd = XConnectionNumber(xw.dpy); + struct timeval drawtimeout, *tv = NULL, now, last; - for(i = 0;; i++) { + gettimeofday(&last, NULL); + + for(;;) { FD_ZERO(&rfd); FD_SET(cmdfd, &rfd); FD_SET(xfd, &rfd); @@ -3179,35 +3181,44 @@ run(void) { 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)) { - ttyread(); + gettimeofday(&now, NULL); + /* usecs until (next) frame */ + drawtimeout.tv_sec = 0; + drawtimeout.tv_usec = \ + ((1000/framespersecond) - TIMEDIFF(now, last)) * 1000; - /* - * 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; + /* Let us draw a frame. */ + if(drawtimeout.tv_usec <= 0) { + draw(); + XFlush(xw.dpy); + + last = now; + tv = NULL; } - i = 0; - tv = NULL; - while(XPending(xw.dpy)) { - XNextEvent(xw.dpy, &ev); - if(XFilterEvent(&ev, None)) - continue; - if(handler[ev.type]) - (handler[ev.type])(&ev); + if(FD_ISSET(cmdfd, &rfd)) + ttyread(); + + if(FD_ISSET(xfd, &rfd)) { + while(XPending(xw.dpy)) { + XNextEvent(xw.dpy, &ev); + if(XFilterEvent(&ev, None)) + continue; + if(handler[ev.type]) + (handler[ev.type])(&ev); + } + + if(drawtimeout.tv_usec <= 0) { + draw(); + XFlush(xw.dpy); + } } - draw(); - XFlush(xw.dpy); + /* There is still some time to wait until next frame. */ + if(drawtimeout.tv_usec > 0) { + tv = &drawtimeout; + continue; + } } }