compositor-drm: Support output hotplugging
diff --git a/compositor/compositor.c b/compositor/compositor.c
index afa0e59..23465da 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -1313,40 +1313,61 @@
 }
 
 void
-wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
-		 int x, int y, int width, int height, uint32_t flags)
+wlsc_output_destroy(struct wlsc_output *output)
 {
+	destroy_surface(&output->background->surface.resource, NULL);
+}
+
+void
+wlsc_output_move(struct wlsc_output *output, int x, int y)
+{
+	struct wlsc_compositor *c = output->compositor;
 	int flip;
 
-	output->compositor = c;
 	output->x = x;
 	output->y = y;
-	output->width = width;
-	output->height = height;
+
+	output->background->x = x;
+	output->background->y = y;
+	wlsc_surface_update_matrix(output->background);
 
 	pixman_region32_init(&output->previous_damage_region);
 
-	output->background =
-		background_create(output, option_background);
-
 	wlsc_matrix_init(&output->matrix);
 	wlsc_matrix_translate(&output->matrix,
 			      -output->x - output->width / 2.0,
 			      -output->y - output->height / 2.0, 0);
 
-	flip = (flags & WL_OUTPUT_FLIPPED) ? -1 : 1;
+	flip = (output->flags & WL_OUTPUT_FLIPPED) ? -1 : 1;
 	wlsc_matrix_scale(&output->matrix,
 			  2.0 / output->width,
 			  flip * 2.0 / output->height, 1);
 
+	pixman_region32_union_rect(&c->damage_region,
+				   &c->damage_region,
+				   x, y, output->width, output->height);
+}
+
+void
+wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
+		 int x, int y, int width, int height, uint32_t flags)
+{
+	output->compositor = c;
+	output->x = x;
+	output->y = y;
+	output->width = width;
+	output->height = height;
+
+	output->background =
+		background_create(output, option_background);
+
+	output->flags = flags;
+	wlsc_output_move(output, x, y);
+
 	output->object.interface = &wl_output_interface;
 	wl_display_add_object(c->wl_display, &output->object);
 	wl_display_add_global(c->wl_display, &output->object,
 			      wlsc_output_post_geometry);
-
-	pixman_region32_union_rect(&c->damage_region,
-				   &c->damage_region,
-				   x, y, width, height);
 }
 
 int