Index: uspace/app/gfxdemo/gfxdemo.c
===================================================================
--- uspace/app/gfxdemo/gfxdemo.c	(revision bd2fab516ef36c7305a1bdf70b5a741480cdde9a)
+++ uspace/app/gfxdemo/gfxdemo.c	(revision af967ef9e8932311192687a657ba22c6a8d92921)
@@ -69,4 +69,6 @@
 
 static bool quit = false;
+static FIBRIL_MUTEX_INITIALIZE(quit_lock);
+static FIBRIL_CONDVAR_INITIALIZE(quit_cv);
 static gfx_typeface_t *tface;
 static gfx_font_t *font;
@@ -83,4 +85,20 @@
 	// XXX Need a proper way to determine text mode
 	return w <= 80;
+}
+
+/** Sleep until timeout or quit request.
+ *
+ * @param msec Number of microseconds to sleep for
+ */
+static void demo_msleep(unsigned msec)
+{
+	fibril_mutex_lock(&quit_lock);
+
+	if (!quit) {
+		(void) fibril_condvar_wait_timeout(&quit_cv, &quit_lock,
+		    (usec_t)msec * 1000);
+	}
+
+	fibril_mutex_unlock(&quit_lock);
 }
 
@@ -316,6 +334,5 @@
 		gfx_color_delete(color);
 
-		fibril_usleep(500 * 1000);
-
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -478,6 +495,6 @@
 			if (rc != EOK)
 				goto error;
-			fibril_usleep(250 * 1000);
-
+
+			demo_msleep(250);
 			if (quit)
 				goto out;
@@ -539,6 +556,5 @@
 		}
 
-		fibril_usleep(500 * 1000);
-
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -600,6 +616,5 @@
 		}
 
-		fibril_usleep(500 * 1000);
-
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -791,5 +806,5 @@
 
 	for (i = 0; i < 10; i++) {
-		fibril_usleep(500 * 1000);
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -872,5 +887,5 @@
 
 	for (i = 0; i < 10; i++) {
-		fibril_usleep(500 * 1000);
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -969,6 +984,5 @@
 		}
 
-		fibril_usleep(500 * 1000);
-
+		demo_msleep(500);
 		if (quit)
 			break;
@@ -1178,7 +1192,15 @@
 }
 
+static void demo_quit(void)
+{
+	fibril_mutex_lock(&quit_lock);
+	quit = true;
+	fibril_mutex_unlock(&quit_lock);
+	fibril_condvar_broadcast(&quit_cv);
+}
+
 static void wnd_close_event(void *arg)
 {
-	quit = true;
+	demo_quit();
 }
 
@@ -1186,10 +1208,10 @@
 {
 	if (event->type == KEY_PRESS)
-		quit = true;
+		demo_quit();
 }
 
 static void uiwnd_close_event(ui_window_t *window, void *arg)
 {
-	quit = true;
+	demo_quit();
 }
 
@@ -1197,5 +1219,5 @@
 {
 	if (event->type == KEY_PRESS)
-		quit = true;
+		demo_quit();
 }
 
