diff --git a/clients/simple-egl.c b/clients/simple-egl.c
index a67ce2f..c761e31 100644
--- a/clients/simple-egl.c
+++ b/clients/simple-egl.c
@@ -27,6 +27,7 @@
 #include <math.h>
 #include <assert.h>
 #include <signal.h>
+#include <poll.h>
 
 #include <linux/input.h>
 
@@ -410,8 +411,10 @@ redraw(void *data, struct wl_callback *callback, uint32_t time)
 		wl_region_destroy(region);
 	}
 
+#if 0
 	window->callback = wl_surface_frame(window->surface);
 	wl_callback_add_listener(window->callback, &frame_listener, window);
+#endif
 }
 
 static const struct wl_callback_listener frame_listener = {
@@ -451,6 +454,8 @@ pointer_handle_button(void *data, struct wl_pointer *wl_pointer,
 	if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED)
 		wl_shell_surface_move(display->window->shell_surface,
 				      display->seat, serial);
+
+	redraw(display->window, NULL, 0);
 }
 
 static void
@@ -592,6 +597,9 @@ main(int argc, char **argv)
 	struct sigaction sigint;
 	struct display display = { 0 };
 	struct window  window  = { 0 };
+	struct timeval tv;
+	struct pollfd pfds[1];
+	uint32_t t, mask;
 	int i;
 
 	window.display = &display;
@@ -616,7 +624,9 @@ main(int argc, char **argv)
 	wl_display_add_global_listener(display.display,
 				       display_handle_global, &display);
 
-	wl_display_get_fd(display.display, event_mask_update, &display);
+	pfds[0].events = POLLIN;
+	pfds[0].fd = wl_display_get_fd(display.display,
+				       event_mask_update, &display);
 	wl_display_iterate(display.display, WL_DISPLAY_READABLE);
 
 	init_egl(&display, window.opaque);
@@ -628,8 +638,16 @@ main(int argc, char **argv)
 	sigint.sa_flags = SA_RESETHAND;
 	sigaction(SIGINT, &sigint, NULL);
 
-	while (running)
-		wl_display_iterate(display.display, display.mask);
+	while (running) {
+		mask = display.mask & WL_DISPLAY_WRITABLE;
+		if (poll(pfds, 1, 0) > 0)
+			mask |= WL_DISPLAY_READABLE;
+		wl_display_iterate(display.display, mask);
+
+		gettimeofday(&tv, NULL);
+		t = tv.tv_sec * 1000 + tv.tv_usec / 1000;
+		redraw(&window, NULL, t);
+	}
 
 	fprintf(stderr, "simple-egl exiting\n");
 
diff --git a/clients/window.c b/clients/window.c
index 575d3cb..eebf242 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -4009,6 +4009,8 @@ display_run(struct display *display)
 			task = ep[i].data.ptr;
 			task->run(task, ep[i].events);
 		}
+
+		wl_display_iterate(display->display, 0);
 	}
 }
 
