diff --git a/main.c b/main.c index e3ee016..686fc60 100644 --- a/main.c +++ b/main.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -701,9 +701,9 @@ static void on_buttonpress(const XButtonEvent *bev) static void run(void) { - int xfd; - fd_set fds; - struct timeval timeout; + enum { FD_X, FD_INFO, FD_ARL, FD_CNT }; + struct pollfd pfd[FD_CNT]; + struct timeval timeout = {0}; const struct timespec ten_ms = {0, 10000000}; bool discard, init_thumb, load_thumb, to_set; XEvent ev, nextev; @@ -730,21 +730,16 @@ static void run(void) if (!tns_load(&tns, tns.initnext, false, true)) remove_file(tns.initnext, false); } else { - xfd = ConnectionNumber(win.env.dpy); - FD_ZERO(&fds); - FD_SET(xfd, &fds); - if (info.fd != -1) { - FD_SET(info.fd, &fds); - xfd = MAX(xfd, info.fd); - } - if (arl.fd != -1) { - FD_SET(arl.fd, &fds); - xfd = MAX(xfd, arl.fd); - } - select(xfd + 1, &fds, 0, 0, to_set ? &timeout : NULL); - if (info.fd != -1 && FD_ISSET(info.fd, &fds)) + pfd[FD_X].fd = ConnectionNumber(win.env.dpy); + pfd[FD_INFO].fd = info.fd; + pfd[FD_ARL].fd = arl.fd; + pfd[FD_X].events = pfd[FD_INFO].events = pfd[FD_ARL].events = POLLIN; + + if (poll(pfd, ARRLEN(pfd), to_set ? TV_TO_MS(&timeout) : -1) < 0) + continue; + if (pfd[FD_INFO].revents & POLLIN) read_info(); - if (arl.fd != -1 && FD_ISSET(arl.fd, &fds)) { + if (pfd[FD_ARL].revents & POLLIN) { if (arl_handle(&arl)) { /* when too fast, imlib2 can't load the image */ nanosleep(&ten_ms, NULL); diff --git a/nsxiv.h b/nsxiv.h index 4350864..67c2185 100644 --- a/nsxiv.h +++ b/nsxiv.h @@ -44,6 +44,7 @@ #define TV_DIFF(t1,t2) (((t1)->tv_sec - (t2)->tv_sec ) * 1000 + \ ((t1)->tv_usec - (t2)->tv_usec) / 1000) +#define TV_TO_MS(tv) (((tv)->tv_sec * 1000) + ((tv)->tv_usec / 1000)) #define TV_SET_MSEC(tv,t) { \ (tv)->tv_sec = (t) / 1000; \