aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert <ber.t@gmx.com>2011-02-17 14:13:18 +0100
committerBert <ber.t@gmx.com>2011-02-17 14:13:18 +0100
commitb828b554191c761776e4757d1b92156c624c75f6 (patch)
tree1fc4bc692d7dac926a6ce8ee1760383b84ab1510
parente2889ab891ba91ec71f8e2088fcb2c0123069054 (diff)
Immediately respond to events while loading thumbs
-rw-r--r--main.c19
-rw-r--r--thumbs.c2
-rw-r--r--util.h3
3 files changed, 20 insertions, 4 deletions
diff --git a/main.c b/main.c
index 80d69b6..5b3bd33 100644
--- a/main.c
+++ b/main.c
@@ -22,6 +22,7 @@
#include <dirent.h>
#include <sys/select.h>
#include <sys/stat.h>
+#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -469,7 +470,7 @@ void on_motionnotify(XMotionEvent *mev) {
void run() {
int xfd;
fd_set fds;
- struct timeval t;
+ struct timeval t, t0;
XEvent ev;
timeout = 0;
@@ -477,12 +478,22 @@ void run() {
while (1) {
if (mode == MODE_THUMBS && tns_loaded < filecnt) {
win_set_cursor(&win, CURSOR_WATCH);
- tns_load(&tns, &win, filenames[tns_loaded++]);
- tns_render(&tns, &win);
+ gettimeofday(&t0, 0);
+
+ while (!XPending(win.env.dpy) && tns_loaded < filecnt) {
+ tns_load(&tns, &win, filenames[tns_loaded++]);
+ gettimeofday(&t, 0);
+ if (TV_TO_DOUBLE(t) - TV_TO_DOUBLE(t0) >= 0.25)
+ break;
+ }
if (tns_loaded == filecnt)
win_set_cursor(&win, CURSOR_ARROW);
- else if (!XPending(win.env.dpy))
+ if (!XPending(win.env.dpy)) {
+ tns_render(&tns, &win);
continue;
+ } else {
+ timeout = 1;
+ }
} else if (timeout) {
t.tv_sec = 0;
t.tv_usec = 75000;
diff --git a/thumbs.c b/thumbs.c
index 9a8791f..b4e6976 100644
--- a/thumbs.c
+++ b/thumbs.c
@@ -84,6 +84,8 @@ void tns_render(tns_t *tns, win_t *win) {
if (!tns || !win)
return;
+
+ printf("tns_render()\n");
tns->cols = win->w / thumb_dim;
tns->rows = win->h / thumb_dim;
diff --git a/util.h b/util.h
index 2caf347..f1db6b8 100644
--- a/util.h
+++ b/util.h
@@ -27,6 +27,9 @@
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define LEN(a) (sizeof(a) / sizeof(a[0]))
+#define TV_TO_DOUBLE(x) ((double) ((x).tv_sec) + 0.000001 * \
+ (double) ((x).tv_usec))
+
void* s_malloc(size_t);
void* s_realloc(void*, size_t);