diff options
author | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2012-09-16 10:47:21 +0200 |
---|---|---|
committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2012-09-16 10:47:21 +0200 |
commit | 85849ce72aa4e9cee307a031b97777e9eba2d453 (patch) | |
tree | 31798999e662e16af5819c7b54dada0e60c61183 | |
parent | 15cc8754c2e272ebac6e86845859816e881da000 (diff) | |
download | st-85849ce72aa4e9cee307a031b97777e9eba2d453.tar.gz st-85849ce72aa4e9cee307a031b97777e9eba2d453.zip |
Remove timeout in the main loop
The main loop waits until there is some data to read in file descriptors of
the X server or the pseudo tty. But it uses a timeout in select(), which
causes that st awake each 20 ms, even it doesn't have something to do. This
patch removes this problem removing the timeout, which is not needed.
---
TODO | 1 -
st.c | 27 +++------------------------
2 files changed, 3 insertions(+), 25 deletions(-)
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | st.c | 27 |
2 files changed, 3 insertions, 25 deletions
@@ -15,7 +15,6 @@ code & interface | |||
15 | 15 | ||
16 | * clean selection code | 16 | * clean selection code |
17 | * clean and complete terminfo entry | 17 | * clean and complete terminfo entry |
18 | * remove the timeouts in the main loop | ||
19 | 18 | ||
20 | bugs | 19 | bugs |
21 | ---- | 20 | ---- |
@@ -53,8 +53,6 @@ | |||
53 | #define XK_NO_MOD UINT_MAX | 53 | #define XK_NO_MOD UINT_MAX |
54 | #define XK_ANY_MOD 0 | 54 | #define XK_ANY_MOD 0 |
55 | 55 | ||
56 | #define SELECT_TIMEOUT (20*1000) /* 20 ms */ | ||
57 | #define DRAW_TIMEOUT (20*1000) /* 20 ms */ | ||
58 | #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ | 56 | #define REDRAW_TIMEOUT (80*1000) /* 80 ms */ |
59 | 57 | ||
60 | #define SERRNO strerror(errno) | 58 | #define SERRNO strerror(errno) |
@@ -205,7 +203,6 @@ typedef struct { | |||
205 | int ch; /* char height */ | 203 | int ch; /* char height */ |
206 | int cw; /* char width */ | 204 | int cw; /* char width */ |
207 | char state; /* focus, redraw, visible */ | 205 | char state; /* focus, redraw, visible */ |
208 | struct timeval lastdraw; | ||
209 | } XWindow; | 206 | } XWindow; |
210 | 207 | ||
211 | typedef struct { | 208 | typedef struct { |
@@ -250,7 +247,6 @@ static void drawregion(int, int, int, int); | |||
250 | static void execsh(void); | 247 | static void execsh(void); |
251 | static void sigchld(int); | 248 | static void sigchld(int); |
252 | static void run(void); | 249 | static void run(void); |
253 | static bool last_draw_too_old(void); | ||
254 | 250 | ||
255 | static void csidump(void); | 251 | static void csidump(void); |
256 | static void csihandle(void); | 252 | static void csihandle(void); |
@@ -2158,7 +2154,6 @@ void | |||
2158 | draw() { | 2154 | draw() { |
2159 | drawregion(0, 0, term.col, term.row); | 2155 | drawregion(0, 0, term.col, term.row); |
2160 | xcopy(); | 2156 | xcopy(); |
2161 | gettimeofday(&xw.lastdraw, NULL); | ||
2162 | } | 2157 | } |
2163 | 2158 | ||
2164 | void | 2159 | void |
@@ -2345,41 +2340,25 @@ resize(XEvent *e) { | |||
2345 | ttyresize(col, row); | 2340 | ttyresize(col, row); |
2346 | } | 2341 | } |
2347 | 2342 | ||
2348 | bool | ||
2349 | last_draw_too_old(void) { | ||
2350 | struct timeval now; | ||
2351 | gettimeofday(&now, NULL); | ||
2352 | return TIMEDIFF(now, xw.lastdraw) >= DRAW_TIMEOUT/1000; | ||
2353 | } | ||
2354 | |||
2355 | void | 2343 | void |
2356 | run(void) { | 2344 | run(void) { |
2357 | XEvent ev; | 2345 | XEvent ev; |
2358 | fd_set rfd; | 2346 | fd_set rfd; |
2359 | int xfd = XConnectionNumber(xw.dpy); | 2347 | int xfd = XConnectionNumber(xw.dpy); |
2360 | struct timeval timeout = {0}; | ||
2361 | bool stuff_to_print = 0; | ||
2362 | 2348 | ||
2363 | for(;;) { | 2349 | for(;;) { |
2364 | FD_ZERO(&rfd); | 2350 | FD_ZERO(&rfd); |
2365 | FD_SET(cmdfd, &rfd); | 2351 | FD_SET(cmdfd, &rfd); |
2366 | FD_SET(xfd, &rfd); | 2352 | FD_SET(xfd, &rfd); |
2367 | timeout.tv_sec = 0; | 2353 | if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, NULL) < 0) { |
2368 | timeout.tv_usec = SELECT_TIMEOUT; | ||
2369 | if(select(MAX(xfd, cmdfd)+1, &rfd, NULL, NULL, &timeout) < 0) { | ||
2370 | if(errno == EINTR) | 2354 | if(errno == EINTR) |
2371 | continue; | 2355 | continue; |
2372 | die("select failed: %s\n", SERRNO); | 2356 | die("select failed: %s\n", SERRNO); |
2373 | } | 2357 | } |
2374 | if(FD_ISSET(cmdfd, &rfd)) { | 2358 | if(FD_ISSET(cmdfd, &rfd)) |
2375 | ttyread(); | 2359 | ttyread(); |
2376 | stuff_to_print = 1; | ||
2377 | } | ||
2378 | 2360 | ||
2379 | if(stuff_to_print && last_draw_too_old()) { | 2361 | draw(); |
2380 | stuff_to_print = 0; | ||
2381 | draw(); | ||
2382 | } | ||
2383 | 2362 | ||
2384 | while(XPending(xw.dpy)) { | 2363 | while(XPending(xw.dpy)) { |
2385 | XNextEvent(xw.dpy, &ev); | 2364 | XNextEvent(xw.dpy, &ev); |