Remove timeout in the main loop - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 85849ce72aa4e9cee307a031b97777e9eba2d453
 (DIR) parent 15cc8754c2e272ebac6e86845859816e881da000
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Sun, 16 Sep 2012 10:47:21 +0200
       
       Remove timeout in the main loop
       
       The main loop waits until there is some data to read in file descriptors of
       the X server or the pseudo tty. But it uses a timeout in select(), which
       causes that st awake each 20 ms, even it doesn't have something to do. This
       patch removes this problem removing the timeout, which is not needed.
       ---
        TODO |    1 -
        st.c |   27 +++------------------------
        2 files changed, 3 insertions(+), 25 deletions(-)
       Diffstat:
         TODO                                |       1 -
         st.c                                |      27 +++------------------------
       
       2 files changed, 3 insertions(+), 25 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -15,7 +15,6 @@ code & interface
        
        * clean selection code
        * clean and complete terminfo entry
       -* remove the timeouts in the main loop
        
        bugs
        ----
 (DIR) diff --git a/st.c b/st.c
       @@ -53,8 +53,6 @@
        #define XK_NO_MOD     UINT_MAX
        #define XK_ANY_MOD    0
        
       -#define SELECT_TIMEOUT (20*1000) /* 20 ms */
       -#define DRAW_TIMEOUT  (20*1000) /* 20 ms */
        #define REDRAW_TIMEOUT (80*1000) /* 80 ms */
        
        #define SERRNO strerror(errno)
       @@ -205,7 +203,6 @@ typedef struct {
                int ch; /* char height */
                int cw; /* char width  */
                char state; /* focus, redraw, visible */
       -        struct timeval lastdraw;
        } XWindow;
        
        ttypedef struct {
       @@ -250,7 +247,6 @@ static void drawregion(int, int, int, int);
        static void execsh(void);
        static void sigchld(int);
        static void run(void);
       -static bool last_draw_too_old(void);
        
        static void csidump(void);
        static void csihandle(void);
       @@ -2158,7 +2154,6 @@ void
        draw() {
                drawregion(0, 0, term.col, term.row);
                xcopy();
       -        gettimeofday(&xw.lastdraw, NULL);
        }
        
        void
       @@ -2345,41 +2340,25 @@ resize(XEvent *e) {
                ttyresize(col, row);
        }
        
       -bool
       -last_draw_too_old(void) {
       -        struct timeval now;
       -        gettimeofday(&now, NULL);
       -        return TIMEDIFF(now, xw.lastdraw) >= DRAW_TIMEOUT/1000;
       -}
       -
        void
        run(void) {
                XEvent ev;
                fd_set rfd;
                int xfd = XConnectionNumber(xw.dpy);
       -        struct timeval timeout = {0};
       -        bool stuff_to_print = 0;
        
                for(;;) {
                        FD_ZERO(&rfd);
                        FD_SET(cmdfd, &rfd);
                        FD_SET(xfd, &rfd);
       -                timeout.tv_sec  = 0;
       -                timeout.tv_usec = SELECT_TIMEOUT;
       -                if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, &timeout) < 0) {
       +                if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) < 0) {
                                if(errno == EINTR)
                                        continue;
                                die("select failed: %s\n", SERRNO);
                        }
       -                if(FD_ISSET(cmdfd, &rfd)) {
       +                if(FD_ISSET(cmdfd, &rfd))
                                ttyread();
       -                        stuff_to_print = 1;
       -                }
        
       -                if(stuff_to_print && last_draw_too_old()) {
       -                        stuff_to_print = 0;
       -                        draw();
       -                }
       +                draw();
        
                        while(XPending(xw.dpy)) {
                                XNextEvent(xw.dpy, &ev);