clients: Bring clients up to date
diff --git a/clients/smoke.c b/clients/smoke.c
index 5d3f2db..bae6e96 100644
--- a/clients/smoke.c
+++ b/clients/smoke.c
@@ -173,8 +173,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 smoke *smoke = data;
 
 	diffuse(smoke, time / 30, smoke->b[0].u, smoke->b[1].u);
@@ -199,12 +202,15 @@
 
 	render(smoke);
 
+	if (callback)
+		wl_callback_destroy(callback);
+
 	display_surface_damage(smoke->display, smoke->surface,
 			       0, 0, smoke->width, smoke->height);
 	window_damage(smoke->window, 0, 0, smoke->width, smoke->height);
-	wl_display_frame_callback(display_get_display(smoke->display),
-				  window_get_wl_surface(smoke->window),
-				  frame_callback, smoke);
+
+	callback = wl_surface_frame(window_get_wl_surface(smoke->window));
+	wl_callback_add_listener(callback, &listener, smoke);
 }
 
 static int
@@ -290,10 +296,7 @@
 				  smoke_motion_handler);
 
 	window_set_user_data(smoke.window, &smoke);
-	wl_display_frame_callback(display_get_display(d),
-				  window_get_wl_surface(smoke.window),
-				  frame_callback, &smoke);
-
+	frame_callback(&smoke, NULL, 0);
 	display_run(d);
 
 	return 0;