tAdding a more efficient drawing code. - st - [fork] customized build of st, th… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 95033753be32e93915ddce14ea41b8765b665771 | |
parent b7261c84aa3af984d5a7e5f5239c4173255a215d | |
Author: Christoph Lohmann <[email protected]> | |
Date: Fri, 15 Feb 2013 19:10:22 +0100 | |
Adding a more efficient drawing code. | |
Thanks Mihail Zenkov <[email protected]> for giving the hint! | |
Diffstat: | |
M config.def.h | 5 ++++- | |
M st.c | 65 ++++++++++++++++++-----------… | |
2 files changed, 42 insertions(+), 28 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -9,10 +9,13 @@ static char font[] = "Liberation Mono:pixelsize=12:antialias… | |
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"; | |
diff --git a/st.c b/st.c | |
t@@ -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); | |
t@@ -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; | |
+ } | |
} | |
} | |