Move weston_output_set_cursor into compositor-drm.c

First step towards moving hw cursor handling into compositor-drm.c a its
general overlay handling.
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index e438142..dccbafe 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -529,12 +529,58 @@
 	return 0;
 }
 
+static int
+drm_output_set_cursor(struct weston_output *output_base,
+		      struct weston_input_device *eid);
+
+static void
+weston_output_set_cursor(struct weston_output *output,
+			 struct weston_input_device *device,
+			 pixman_region32_t *overlap)
+{
+	pixman_region32_t cursor_region;
+	int prior_was_hardware;
+
+	if (device->sprite == NULL)
+		return;
+
+	pixman_region32_init(&cursor_region);
+	pixman_region32_intersect(&cursor_region,
+				  &device->sprite->transform.boundingbox,
+				  &output->region);
+
+	if (!pixman_region32_not_empty(&cursor_region)) {
+		drm_output_set_cursor(output, NULL);
+		goto out;
+	}
+
+	prior_was_hardware = device->hw_cursor;
+	if (pixman_region32_not_empty(overlap) ||
+	    drm_output_set_cursor(output, device) < 0) {
+		if (prior_was_hardware) {
+			weston_surface_damage(device->sprite);
+			drm_output_set_cursor(output, NULL);
+		}
+		device->hw_cursor = 0;
+	} else {
+		if (!prior_was_hardware)
+			weston_surface_damage_below(device->sprite);
+		pixman_region32_fini(&device->sprite->damage);
+		pixman_region32_init(&device->sprite->damage);
+		device->hw_cursor = 1;
+	}
+
+out:
+	pixman_region32_fini(&cursor_region);
+}
+
 static void
 drm_assign_planes(struct weston_output *output)
 {
 	struct weston_compositor *ec = output->compositor;
 	struct weston_surface *es;
 	pixman_region32_t overlap, surface_overlap;
+	struct weston_input_device *device;
 
 	/*
 	 * Find a surface for each sprite in the output using some heuristics:
@@ -561,8 +607,16 @@
 		pixman_region32_intersect(&surface_overlap, &overlap,
 					  &es->transform.boundingbox);
 
-		if (!drm_output_prepare_overlay_surface(output, es,
-							&surface_overlap)) {
+		device = (struct weston_input_device *) ec->input_device;
+		if (es == device->sprite) {
+			weston_output_set_cursor(output, device,
+						 &surface_overlap);
+
+			if (!device->hw_cursor)
+				pixman_region32_union(&overlap, &overlap,
+						      &es->transform.boundingbox);
+		} else if (!drm_output_prepare_overlay_surface(output, es,
+							       &surface_overlap)) {
 			pixman_region32_fini(&es->damage);
 			pixman_region32_init(&es->damage);
 		} else {
@@ -1002,7 +1056,6 @@
 
 	output->pending_fs_surf_fb_id = 0;
 	output->base.repaint = drm_output_repaint;
-	output->base.set_hardware_cursor = drm_output_set_cursor;
 	output->base.destroy = drm_output_destroy;
 	output->base.assign_planes = drm_assign_planes;