diff options
| author | Christoph Lohmann <20h@r-36.net> | 2013-02-15 19:10:22 +0100 | 
|---|---|---|
| committer | Christoph Lohmann <20h@r-36.net> | 2013-02-15 19:10:22 +0100 | 
| commit | 95033753be32e93915ddce14ea41b8765b665771 (patch) | |
| tree | 5c4f36908a54eaff9db4b03d87df96401ddef245 | |
| parent | b7261c84aa3af984d5a7e5f5239c4173255a215d (diff) | |
| download | st-95033753be32e93915ddce14ea41b8765b665771.tar.xz st-95033753be32e93915ddce14ea41b8765b665771.zip  | |
Adding a more efficient drawing code.
Thanks Mihail Zenkov <mihail.zenkov@gmail.com> for giving the hint!
| -rw-r--r-- | config.def.h | 5 | ||||
| -rw-r--r-- | st.c | 65 | 
2 files changed, 42 insertions, 28 deletions
diff --git a/config.def.h b/config.def.h index 684adf7..8732ca3 100644 --- a/config.def.h +++ b/config.def.h @@ -9,10 +9,13 @@ static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=fals  static int borderpx = 2;  static char shell[] = "/bin/sh"; -/* double-click timeout (in milliseconds) between clicks for selection */ +/* timeouts (in milliseconds) */  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; +  /* TERM value */  static char termname[] = "st-256color"; @@ -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; +		}  	}  }  | 
