Use cairo_push_group() for all double buffering, drop window_copy_*()
diff --git a/clients/image.c b/clients/image.c
index 61d8b25..891bd8a 100644
--- a/clients/image.c
+++ b/clients/image.c
@@ -140,7 +140,7 @@
 	struct rectangle allocation;
 	GdkPixbuf *pb;
 	cairo_t *cr;
-	cairo_surface_t *wsurface, *surface;
+	cairo_surface_t *surface;
 
 	window_draw(image->window);
 
@@ -153,14 +153,15 @@
 	if (pb == NULL)
 		return;
 
-	wsurface = window_get_surface(image->window);
-	surface = cairo_surface_create_similar(wsurface,
-					       CAIRO_CONTENT_COLOR_ALPHA,
-					       allocation.width,
-					       allocation.height);
-
-	cairo_surface_destroy(wsurface);
+	surface = window_get_surface(image->window);
 	cr = cairo_create(surface);
+	window_get_child_allocation(image->window, &allocation);
+	cairo_rectangle(cr, allocation.x, allocation.y,
+			allocation.width, allocation.height);
+	cairo_clip(cr);
+	cairo_push_group(cr);
+	cairo_translate(cr, allocation.x, allocation.y);
+
 	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
 	cairo_set_source_rgba(cr, 0, 0, 0, 1);
 	cairo_paint(cr);
@@ -169,11 +170,13 @@
 			  allocation.width, allocation.height);
 	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
 	cairo_paint(cr);
-	cairo_destroy(cr);
 
 	g_object_unref(pb);
 
-	window_copy_surface(image->window, &allocation, surface);
+	cairo_pop_group_to_source(cr);
+	cairo_paint(cr);
+	cairo_destroy(cr);
+
 	window_flush(image->window);
 	cairo_surface_destroy(surface);
 }