From b828b554191c761776e4757d1b92156c624c75f6 Mon Sep 17 00:00:00 2001
From: Bert <ber.t@gmx.com>
Date: Thu, 17 Feb 2011 14:13:18 +0100
Subject: [PATCH] Immediately respond to events while loading thumbs

---
 main.c   | 19 +++++++++++++++----
 thumbs.c |  2 ++
 util.h   |  3 +++
 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);