Browse Source

Corrected timeout handling

master
Bert 13 years ago
parent
commit
abb5feeb78
1 changed files with 7 additions and 6 deletions
  1. +7
    -6
      main.c

+ 7
- 6
main.c View File

@@ -160,21 +160,23 @@ void reset_timeout(timeout_f handler) {
} }


int check_timeouts(struct timeval *t) { int check_timeouts(struct timeval *t) {
int i, tdiff, tmin = -1;
int i = 0, tdiff, tmin = -1;
struct timeval now; struct timeval now;


gettimeofday(&now, 0); gettimeofday(&now, 0);
for (i = 0; i < LEN(timeouts); i++) {
while (i < LEN(timeouts)) {
if (timeouts[i].active) { if (timeouts[i].active) {
tdiff = TIMEDIFF(&timeouts[i].when, &now); tdiff = TIMEDIFF(&timeouts[i].when, &now);
if (tdiff <= 0) { if (tdiff <= 0) {
timeouts[i].active = False; timeouts[i].active = False;
if (timeouts[i].handler) if (timeouts[i].handler)
timeouts[i].handler(); timeouts[i].handler();
i = tmin = -1;
} else if (tmin < 0 || tdiff < tmin) { } else if (tmin < 0 || tdiff < tmin) {
tmin = tdiff; tmin = tdiff;
} }
} }
i++;
} }
if (tmin > 0 && t) if (tmin > 0 && t)
MSEC_TO_TIMEVAL(tmin, t); MSEC_TO_TIMEVAL(tmin, t);
@@ -375,13 +377,12 @@ void run() {
} }
} }


if (!XPending(win.env.dpy) && check_timeouts(&timeout)) {
/* handle timeouts */
while (!XPending(win.env.dpy) && check_timeouts(&timeout)) {
/* wait for timeouts */
xfd = ConnectionNumber(win.env.dpy); xfd = ConnectionNumber(win.env.dpy);
FD_ZERO(&fds); FD_ZERO(&fds);
FD_SET(xfd, &fds); FD_SET(xfd, &fds);
if (!select(xfd + 1, &fds, 0, 0, &timeout))
check_timeouts(NULL);
select(xfd + 1, &fds, 0, 0, &timeout);
} }


if (!XNextEvent(win.env.dpy, &ev)) { if (!XNextEvent(win.env.dpy, &ev)) {


Loading…
Cancel
Save