compositor-drm: Fix vt switching

Don't take input or render while switched away, drop and set master correctly.
diff --git a/compositor/compositor-drm.c b/compositor/compositor-drm.c
index 11a44cc..597ff71 100644
--- a/compositor/compositor-drm.c
+++ b/compositor/compositor-drm.c
@@ -627,6 +627,26 @@
 	free(d);
 }
 
+static void
+vt_func(struct wlsc_compositor *compositor, int event)
+{
+	struct drm_compositor *ec = (struct drm_compositor *) compositor;
+
+	switch (event) {
+	case TTY_ENTER_VT:
+		compositor->focus = 1;
+		drmSetMaster(ec->drm.fd);
+		compositor->state = WLSC_COMPOSITOR_ACTIVE;
+		wlsc_compositor_damage_all(compositor);
+		break;
+	case TTY_LEAVE_VT:
+		compositor->focus = 0;
+		compositor->state = WLSC_COMPOSITOR_SLEEPING;
+		drmDropMaster(ec->drm.fd);
+		break;
+	};
+}
+
 static struct wlsc_compositor *
 drm_compositor_create(struct wl_display *display, int connector)
 {
@@ -699,7 +719,7 @@
 	ec->drm_source =
 		wl_event_loop_add_fd(loop, ec->drm.fd,
 				     WL_EVENT_READABLE, on_drm_input, ec);
-	ec->tty = tty_create(&ec->base);
+	ec->tty = tty_create(&ec->base, vt_func);
 
 	ec->udev_monitor = udev_monitor_new_from_netlink(ec->udev, "udev");
 	if (ec->udev_monitor == NULL) {
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 3c5459d..2546d58 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -341,8 +341,15 @@
 void
 evdev_input_add_devices(struct wlsc_compositor *c, struct udev *udev);
 
+enum {
+	TTY_ENTER_VT,
+	TTY_LEAVE_VT
+};
+
+typedef void (*tty_vt_func_t)(struct wlsc_compositor *compositor, int event);
+
 struct tty *
-tty_create(struct wlsc_compositor *compositor);
+tty_create(struct wlsc_compositor *compositor, tty_vt_func_t vt_func);
 
 void
 tty_destroy(struct tty *tty);
diff --git a/compositor/tty.c b/compositor/tty.c
index 7bb51bb..229bd7e 100644
--- a/compositor/tty.c
+++ b/compositor/tty.c
@@ -41,6 +41,7 @@
 	struct wl_event_source *input_source;
 	struct wl_event_source *enter_vt_source;
 	struct wl_event_source *leave_vt_source;
+	tty_vt_func_t vt_func;
 };
 
 static int on_enter_vt(int signal_number, void *data)
@@ -48,7 +49,7 @@
 	struct tty *tty = data;
 	int ret;
 
-	fprintf(stderr, "enter vt\n");
+	tty->vt_func(tty->compositor, TTY_ENTER_VT);
 
 	ioctl(tty->fd, VT_RELDISP, VT_ACKACQ);
 	ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
@@ -70,6 +71,8 @@
 		fprintf(stderr,
 			"failed to set KD_TEXT mode on console: %m\n");
 
+	tty->vt_func(tty->compositor, TTY_LEAVE_VT);
+
 	return 1;
 }
 
@@ -86,7 +89,7 @@
 }
 
 struct tty *
-tty_create(struct wlsc_compositor *compositor)
+tty_create(struct wlsc_compositor *compositor, tty_vt_func_t vt_func)
 {
 	struct termios raw_attributes;
 	struct vt_mode mode = { 0 };
@@ -100,6 +103,7 @@
 
 	memset(tty, 0, sizeof *tty);
 	tty->compositor = compositor;
+	tty->vt_func = vt_func;
 	tty->fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
 	if (tty->fd <= 0) {
 		fprintf(stderr, "failed to open active tty: %m\n");