st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 086cd61511aa5ca4cbef0048137bb9ae0467d283
parent 95033753be32e93915ddce14ea41b8765b665771
Author: Christoph Lohmann <20h@r-36.net>
Date:   Fri, 15 Feb 2013 19:30:43 +0100

Doing it like the new run() was proposed.

Diffstat:
Mconfig.def.h | 3++-
Mst.c | 38+++++++++++++++-----------------------
2 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -14,7 +14,8 @@ static unsigned int doubleclicktimeout = 300;
 static unsigned int tripleclicktimeout = 600;
 
 /* frames per second st should at maximum draw to the screen */
-static unsigned int framespersecond = 60;
+static unsigned int xfps = 30;
+static unsigned int actionfps = 5;
 
 /* TERM value */
 static char termname[] = "st-256color";
diff --git a/st.c b/st.c
@@ -3166,12 +3166,12 @@ void
 run(void) {
     XEvent ev;
     fd_set rfd;
-    int xfd = XConnectionNumber(xw.dpy);
+    int xfd = XConnectionNumber(xw.dpy), xev;
     struct timeval drawtimeout, *tv = NULL, now, last;
 
     gettimeofday(&last, NULL);
 
-    for(;;) {
+    for(xev = actionfps;;) {
         FD_ZERO(&rfd);
         FD_SET(cmdfd, &rfd);
         FD_SET(xfd, &rfd);
@@ -3184,22 +3184,16 @@ run(void) {
         gettimeofday(&now, NULL);
         /* usecs until (next) frame */
         drawtimeout.tv_sec = 0;
-        drawtimeout.tv_usec = \
-            ((1000/framespersecond) - TIMEDIFF(now, last)) * 1000;
-
-        /* Let us draw a frame. */
-        if(drawtimeout.tv_usec <= 0) {
-            draw();
-            XFlush(xw.dpy);
-
-            last = now;
-            tv = NULL;
-        }
+        drawtimeout.tv_usec = (1000/xfps) * 1000;
+        tv = &drawtimeout;
 
         if(FD_ISSET(cmdfd, &rfd))
             ttyread();
 
-        if(FD_ISSET(xfd, &rfd)) {
+        if(FD_ISSET(xfd, &rfd))
+            xev = actionfps;
+
+        if(TIMEDIFF(now, last) > (xev ? (1000/xfps) : (1000/actionfps))) {
             while(XPending(xw.dpy)) {
                 XNextEvent(xw.dpy, &ev);
                 if(XFilterEvent(&ev, None))
@@ -3208,16 +3202,14 @@ run(void) {
                     (handler[ev.type])(&ev);
             }
 
-            if(drawtimeout.tv_usec <= 0) {
-                draw();
-                XFlush(xw.dpy);
-            }
-        }
+            draw();
+            XFlush(xw.dpy);
+            last = now;
 
-        /* There is still some time to wait until next frame. */
-        if(drawtimeout.tv_usec > 0) {
-            tv = &drawtimeout;
-            continue;
+            if(xev && !FD_ISSET(xfd, &rfd))
+                xev--;
+            if(!FD_ISSET(cmdfd, &rfd) && !FD_ISSET(xfd, &rfd))
+                tv = NULL;
         }
     }
 }