# st

Unnamed repository; edit this file 'description' to name the repository.

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