Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
+ }
}
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.