[PATCH weston v4 13/15] Add support for running with a primary client

Jason Ekstrand jason at jlekstrand.net
Tue Feb 25 17:26:45 PST 2014


On startup weston now detects the WAYLAND_SERVER_SOCKET environment
variable.  If found, weston does not create the display like normal, but
instead directly adds a client corresponding to the given fd.  This,
combined with the fullscreen shell, allows a process to spawn weston and
use it as a backend.

Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
---
 src/compositor.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index bc62c36..afa7c47 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4000,6 +4000,16 @@ catch_signals(void)
 	sigaction(SIGABRT, &action, NULL);
 }
 
+static void
+handle_primary_client_destroyed(struct wl_listener *listener, void *data)
+{
+	struct wl_client *client = data;
+
+	weston_log("Primary client died.  Closing...\n");
+
+	wl_display_terminate(wl_client_get_display(client));
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = EXIT_SUCCESS;
@@ -4011,19 +4021,22 @@ int main(int argc, char *argv[])
 		*(*backend_init)(struct wl_display *display,
 				 int *argc, char *argv[],
 				 struct weston_config *config);
-	int i;
+	int i, fd;
 	char *backend = NULL;
 	char *option_backend = NULL;
 	char *shell = NULL;
 	char *option_shell = NULL;
 	char *modules, *option_modules = NULL;
 	char *log = NULL;
+	char *server_socket = NULL, *end;
 	int32_t idle_time = 300;
 	int32_t help = 0;
 	char *socket_name = "wayland-0";
 	int32_t version = 0;
 	struct weston_config *config;
 	struct weston_config_section *section;
+	struct wl_client *primary_client;
+	struct wl_listener primary_client_destroyed;
 
 	const struct weston_option core_options[] = {
 		{ WESTON_OPTION_STRING, "backend", 'B', &option_backend },
@@ -4146,10 +4159,33 @@ int main(int argc, char *argv[])
 
 	weston_compositor_log_capabilities(ec);
 
-	if (wl_display_add_socket(display, socket_name)) {
-		weston_log("fatal: failed to add socket: %m\n");
-		ret = EXIT_FAILURE;
-		goto out;
+	server_socket = getenv("WAYLAND_SERVER_SOCKET");
+	if (server_socket) {
+		weston_log("Running with single client\n");
+		fd = strtol(server_socket, &end, 0);
+		if (*end != '\0')
+			fd = -1;
+	} else {
+		fd = -1;
+	}
+
+	if (fd != -1) {
+		primary_client = wl_client_create(display, fd);
+		if (!primary_client) {
+			weston_log("fatal: failed to add client: %m\n");
+			ret = EXIT_FAILURE;
+			goto out;
+		}
+		primary_client_destroyed.notify =
+			handle_primary_client_destroyed;
+		wl_client_add_destroy_listener(primary_client,
+					       &primary_client_destroyed);
+	} else {
+		if (wl_display_add_socket(display, socket_name)) {
+			weston_log("fatal: failed to add socket: %m\n");
+			ret = EXIT_FAILURE;
+			goto out;
+		}
 	}
 
 	weston_compositor_wake(ec);
-- 
1.8.5.3



More information about the wayland-devel mailing list