Add x11 backend for compositor

This still needs all the bells and whistles from the egl-kms mesa branch,
but it makes it a lot easier to work on wayland.
diff --git a/compositor.c b/compositor.c
index 204c8db..fad9b7b 100644
--- a/compositor.c
+++ b/compositor.c
@@ -355,8 +355,6 @@
 			      compositor->current_frame, msecs);
 
 	wl_event_source_timer_update(compositor->timer_source, 5);
-	compositor->repaint_on_timeout = 1;
-
 	compositor->current_frame++;
 }
 
@@ -379,13 +377,6 @@
 
 	wl_list_for_each(eid, &ec->input_device_list, link)
 		wlsc_surface_draw(eid->sprite, output);
-
-	output->current ^= 1;
-
-	glFramebufferRenderbuffer(GL_FRAMEBUFFER,
-				  GL_COLOR_ATTACHMENT0,
-				  GL_RENDERBUFFER,
-				  output->rbo[output->current]);
 }
 
 static void
@@ -402,7 +393,7 @@
 	wl_list_for_each(output, &ec->output_list, link)
 		wlsc_output_repaint(output);
 
-	wlsc_compositor_present_drm(ec);
+	ec->present(ec);
 
 	ec->repaint_needed = 0;
 }
@@ -628,9 +619,6 @@
 	const int hotspot_x = 16, hotspot_y = 16;
 	int32_t sx, sy;
 
-	if (!ec->vt_active)
-		return;
-
 	/* FIXME: We need some multi head love here. */
 	output = container_of(ec->output_list.next, struct wlsc_output, link);
 	if (x < output->x)
@@ -668,8 +656,7 @@
 	struct wlsc_compositor *compositor = device->ec;
 	int32_t sx, sy;
 
-	if (!compositor->vt_active)
-		return;
+	fprintf(stderr, "notify button: button %d, state %d\n", button, state);
 
 	surface = pick_surface(device, &sx, &sy);
 	if (surface) {
@@ -700,9 +687,6 @@
 	uint32_t *k, *end;
 	uint32_t modifier;
 
-	if (!compositor->vt_active)
-		return;
-
 	switch (key | compositor->modifier_state) {
 	case KEY_BACKSPACE | MODIFIER_CTRL | MODIFIER_ALT:
 		kill(0, SIGTERM);
@@ -769,16 +753,10 @@
 	}
 }
 
-struct wlsc_input_device *
-wlsc_input_device_create(struct wlsc_compositor *ec)
+void
+wlsc_input_device_init(struct wlsc_input_device *device,
+		       struct wlsc_compositor *ec)
 {
-	struct wlsc_input_device *device;
-
-	device = malloc(sizeof *device);
-	if (device == NULL)
-		return NULL;
-
-	memset(device, 0, sizeof *device);
 	device->base.interface = &wl_input_device_interface;
 	device->base.implementation = NULL;
 	wl_display_add_object(ec->wl_display, &device->base);
@@ -786,13 +764,12 @@
 	device->x = 100;
 	device->y = 100;
 	device->ec = ec;
+	device->sprite = pointer_create(ec, device->x, device->y, 64, 64);
 
 	device->listener.func = handle_surface_destroy;
 	wl_list_insert(ec->surface_destroy_listener_list.prev,
 		       &device->listener.link);
 	wl_list_insert(ec->input_device_list.prev, &device->link);
-
-	return device;
 }
 
 static void
@@ -916,18 +893,37 @@
 	wl_display_add_global(ec->wl_display, &ec->rgb_visual.base, NULL);
 }
 
-static struct wlsc_compositor *
-wlsc_compositor_create(struct wl_display *display)
+void
+wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
+		 int x, int y, int width, int height)
 {
-	struct wlsc_compositor *ec;
+	output->compositor = c;
+	output->x = x;
+	output->y = y;
+	output->width = width;
+	output->height = height;
+
+	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);
+	wlsc_matrix_scale(&output->matrix,
+			  2.0 / output->width, 2.0 / output->height, 1);
+
+	output->base.interface = &wl_output_interface;
+	wl_display_add_object(c->wl_display, &output->base);
+	wl_display_add_global(c->wl_display, &output->base,
+			      wlsc_output_post_geometry);
+}
+
+int
+wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display)
+{
 	struct wl_event_loop *loop;
-	struct wlsc_output *output;
 
-	ec = malloc(sizeof *ec);
-	if (ec == NULL)
-		return NULL;
-
-	memset(ec, 0, sizeof *ec);
 	ec->wl_display = display;
 
 	wl_display_set_compositor(display, &ec->base, &compositor_interface); 
@@ -941,34 +937,6 @@
 
 	screenshooter_create(ec);
 
-	if (wlsc_compositor_init_drm(ec) < 0) {
-		fprintf(stderr, "failed to initialize devices\n");
-		return NULL;
-	}
-
-	/* Create the pointer and background surfaces now that we have
-	 * a current EGL context. */
-	ec->input_device->sprite =
-		pointer_create(ec, 
-			       ec->input_device->x,
-			       ec->input_device->y, 64, 64);
-	wl_list_for_each(output, &ec->output_list, link) {
-		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);
-		wlsc_matrix_scale(&output->matrix,
-				  2.0 / output->width, 2.0 / output->height, 1);
-		output->base.interface = &wl_output_interface;
-		wl_display_add_object(ec->wl_display, &output->base);
-		wl_display_add_global(ec->wl_display, &output->base,
-				      wlsc_output_post_geometry);
-	}
-
 	glGenFramebuffers(1, &ec->fbo);
 	glBindFramebuffer(GL_FRAMEBUFFER, ec->fbo);
 	glActiveTexture(GL_TEXTURE0);
@@ -978,7 +946,7 @@
 	ec->timer_source = wl_event_loop_add_timer(loop, repaint, ec);
 	wlsc_compositor_schedule_repaint(ec);
 
-	return ec;
+	return 0;
 }
 
 /* The plan here is to generate a random anonymous socket name and
@@ -1002,7 +970,11 @@
 
 	display = wl_display_create();
 
-	ec = wlsc_compositor_create(display);
+	if (getenv("DISPLAY"))
+		ec = x11_compositor_create(display);
+	else
+		ec = drm_compositor_create(display);
+
 	if (ec == NULL) {
 		fprintf(stderr, "failed to create compositor\n");
 		exit(EXIT_FAILURE);