Pass resources to functions that take object references
diff --git a/compositor/compositor.c b/compositor/compositor.c
index 2cf0f2c..856eb29 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -1013,10 +1013,11 @@
 
 static void
 surface_attach(struct wl_client *client,
-	       struct wl_resource *resource, struct wl_buffer *buffer,
-	       int32_t x, int32_t y)
+	       struct wl_resource *resource,
+	       struct wl_resource *buffer_resource, int32_t x, int32_t y)
 {
 	struct wlsc_surface *es = resource->data;
+	struct wl_buffer *buffer = buffer_resource->data;
 
 	buffer->busy_count++;
 	wlsc_buffer_post_release(es->buffer);
@@ -1601,9 +1602,10 @@
 input_device_attach(struct wl_client *client,
 		    struct wl_resource *resource,
 		    uint32_t time,
-		    struct wl_buffer *buffer, int32_t x, int32_t y)
+		    struct wl_resource *buffer_resource, int32_t x, int32_t y)
 {
 	struct wlsc_input_device *device = resource->data;
+	struct wl_buffer *buffer = buffer_resource->data;
 
 	if (time < device->input_device.pointer_focus_time)
 		return;
@@ -1625,18 +1627,22 @@
 	input_device_attach,
 };
 
+static void
+bind_input_device(struct wl_client *client,
+		  void *data, uint32_t version, uint32_t id)
+{
+	wl_client_add_object(client, &wl_display_interface,
+			     &input_device_interface, id, data);
+}
+
 WL_EXPORT void
 wlsc_input_device_init(struct wlsc_input_device *device,
 		       struct wlsc_compositor *ec)
 {
 	wl_input_device_init(&device->input_device, &ec->compositor);
 
-	device->input_device.resource.object.interface = &wl_input_device_interface;
-	device->input_device.resource.object.implementation =
-		(void (**)(void)) &input_device_interface;
-	device->input_device.resource.data = device;
-	wl_display_add_global(ec->wl_display,
-			      &device->input_device.resource.object, NULL);
+	wl_display_add_global(ec->wl_display, &wl_input_device_interface,
+			      device, bind_input_device);
 
 	device->sprite = wlsc_surface_create(ec,
 					     device->input_device.x,
@@ -1655,11 +1661,10 @@
 }
 
 static void
-wlsc_output_post_geometry(struct wl_client *client, struct wl_object *global,
-			  uint32_t version, uint32_t id)
+bind_output(struct wl_client *client,
+	    void *data, uint32_t version, uint32_t id)
 {
-	struct wlsc_output *output =
-		container_of(global, struct wlsc_output, resource.object);
+	struct wlsc_output *output = data;
 	struct wlsc_mode *mode;
 
 	output->resource.client = client;
@@ -1860,8 +1865,8 @@
 	wl_list_init(&output->frame_callback_list);
 
 	output->resource.object.interface = &wl_output_interface;
-	wl_display_add_global(c->wl_display, &output->resource.object,
-			      wlsc_output_post_geometry);
+	wl_display_add_global(c->wl_display,
+			      &wl_output_interface, output, bind_output);
 }
 
 static void