clients: Bring clients up to date
diff --git a/clients/resizor.c b/clients/resizor.c
index 16287b3..899c152 100644
--- a/clients/resizor.c
+++ b/clients/resizor.c
@@ -49,8 +49,11 @@
 };
 
 static void
-frame_callback(struct wl_surface *surface, void *data, uint32_t time)
+frame_callback(void *data, struct wl_callback *callback, uint32_t time)
 {
+	static const struct wl_callback_listener listener = {
+		frame_callback
+	};
 	struct resizor *resizor = data;
 	double force, height;
 
@@ -75,6 +78,14 @@
 	window_set_child_size(resizor->window, resizor->width, height + 0.5);
 
 	window_schedule_redraw(resizor->window);
+
+	if (callback)
+		wl_callback_destroy(callback);
+
+	if (fabs(resizor->height.previous - resizor->height.target) > 0.1) {
+		callback = wl_surface_frame(window_get_wl_surface(resizor->window));
+		wl_callback_add_listener(callback, &listener, resizor);
+	}
 }
 
 static void
@@ -104,12 +115,6 @@
 	cairo_surface_destroy(surface);
 
 	window_flush(resizor->window);
-
-	if (fabs(resizor->height.previous - resizor->height.target) > 0.1) {
-		wl_display_frame_callback(display_get_display(resizor->display),
-					  window_get_wl_surface(resizor->window),
-					  frame_callback, resizor);
-	}
 }
 
 static void
@@ -141,11 +146,11 @@
 	switch (sym) {
 	case XK_Down:
 		resizor->height.target = 400;
-		frame_callback(window_get_wl_surface(window), resizor, 0);
+		frame_callback(resizor, NULL, 0);
 		break;
 	case XK_Up:
 		resizor->height.target = 200;
-		frame_callback(window_get_wl_surface(window), resizor, 0);
+		frame_callback(resizor, NULL, 0);
 		break;
 	}
 }