launcher: Handle drm set/drop master and vt switch signals in launcher
diff --git a/src/launcher-util.c b/src/launcher-util.c
index 8c3b496..75e7051 100644
--- a/src/launcher-util.c
+++ b/src/launcher-util.c
@@ -46,6 +46,7 @@
 struct weston_launcher {
 	struct weston_compositor *compositor;
 	int fd;
+	struct wl_event_source *source;
 };
 
 int
@@ -111,65 +112,45 @@
 	return data->fd;
 }
 
-int
-weston_launcher_drm_set_master(struct weston_launcher *launcher,
-			       int drm_fd, char master)
+static int
+weston_launcher_data(int fd, uint32_t mask, void *data)
 {
-	struct msghdr msg;
-	struct cmsghdr *cmsg;
-	struct iovec iov;
-	char control[CMSG_SPACE(sizeof(drm_fd))];
-	int ret;
-	ssize_t len;
-	struct weston_launcher_set_master message;
-	union cmsg_data *data;
+	struct weston_launcher *launcher = data;
+	int len, ret;
 
-	if (launcher == NULL) {
-		if (master)
-			return drmSetMaster(drm_fd);
-		else
-			return drmDropMaster(drm_fd);
+	if (mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR)) {
+		weston_log("launcher socket closed, exiting\n");
+		exit(-1);
 	}
 
-	memset(&msg, 0, sizeof msg);
-	msg.msg_iov = &iov;
-	msg.msg_iovlen = 1;
-	msg.msg_control = control;
-	msg.msg_controllen = sizeof control;
-	cmsg = CMSG_FIRSTHDR(&msg);
-	cmsg->cmsg_level = SOL_SOCKET;
-	cmsg->cmsg_type = SCM_RIGHTS;
-	cmsg->cmsg_len = CMSG_LEN(sizeof(drm_fd));
-
-	data = (union cmsg_data *) CMSG_DATA(cmsg);
-	data->fd = drm_fd;
-	msg.msg_controllen = cmsg->cmsg_len;
-
-	iov.iov_base = &message;
-	iov.iov_len = sizeof message;
-
-	message.header.opcode = WESTON_LAUNCHER_DRM_SET_MASTER;
-	message.set_master = master;
-
-	do {
-		len = sendmsg(launcher->fd, &msg, 0);
-	} while (len < 0 && errno == EINTR);
-	if (len < 0)
-		return -1;
-
 	do {
 		len = recv(launcher->fd, &ret, sizeof ret, 0);
 	} while (len < 0 && errno == EINTR);
-	if (len < 0)
-		return -1;
 
-	return ret;
+	switch (ret) {
+	case WESTON_LAUNCHER_ACTIVATE:
+		launcher->compositor->session_active = 1;
+		wl_signal_emit(&launcher->compositor->session_signal,
+			       launcher->compositor);
+		break;
+	case WESTON_LAUNCHER_DEACTIVATE:
+		launcher->compositor->session_active = 0;
+		wl_signal_emit(&launcher->compositor->session_signal,
+			       launcher->compositor);
+		break;
+	default:
+		weston_log("unexpected event from weston-launch\n");
+		break;
+	}
+
+	return 1;
 }
 
 struct weston_launcher *
 weston_launcher_connect(struct weston_compositor *compositor)
 {
 	struct weston_launcher *launcher;
+	struct wl_event_loop *loop;
 	int fd;
 
 	fd = weston_environment_get_fd("WESTON_LAUNCHER_SOCK");
@@ -183,6 +164,16 @@
 	launcher->compositor = compositor;
 	launcher->fd = fd;
 
+	loop = wl_display_get_event_loop(compositor->wl_display);
+	launcher->source = wl_event_loop_add_fd(loop, launcher->fd,
+						WL_EVENT_READABLE,
+						weston_launcher_data,
+						launcher);
+	if (launcher->source == NULL) {
+		free(launcher);
+		return NULL;
+	}
+
 	return launcher;
 }