Преглед на файлове

Adding a more efficient drawing code.

Thanks Mihail Zenkov <mihail.zenkov@gmail.com> for giving the hint!
Christoph Lohmann преди 12 години
родител
ревизия
95033753be
променени са 2 файла, в които са добавени 42 реда и са изтрити 28 реда
  1. 4 1
      config.def.h
  2. 38 27
      st.c

+ 4 - 1
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";
 

+ 38 - 27
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;
+		}
 	}
 }